would significantly reduce the number of constraints
There will be the same number of constraints. But you can do something more efficient than constructing the sparse matrix so you can loop over just the non-zero keys.
Perhaps something like
function read_csv()
data = [Dict{Int,Int}() for k in 1:K]
open("example_v1.csv", "w") do io
readline(io) # skip header
while !eof(io)
line = readline(io)
items = split(line, ' ' )
(p, w) = parse.(Int, items)
d = data[w]
d[p + 1] = get(d, p + 1, 0) + 1
end
end
return data
end
data = read_csv()
model = Model(Gurobi.Optimizer; bridge_constraints = false)
@variable(model, r_i_j[1:I, 1:J], Bin)
@variable(model, y_i_k[1:I, 1:K], Bin)
@constraints(model, begin
[i in 1:I], sum(y_i_k[i, k] for j in 1:K) <= T3
[k=1:ceil(Int, K/34)], sum(y_i_k[i, kk] for in 1:I, kk in (1+(k-1)*34):min(k*34, K)) <= 1
[i=1:I, k=1:K-33], sum(y_i_k[i, k+j] for j in 1:33) <= 1
[i=1:I, k=1:K], sum(r_i_j[i, j] * y_i_k[i, k] * v for (j, v) in data[k]) >= T1 * y_i_k[i, k]
end)
@objective(model, Min, sum(r_i_j) + (N - sum(y_i_k)) * p)