-
-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Labels
Description
Here is a model that works without @objective but adding an @objective throws MethodError: no method matching iterate(::Nothing). I don't know is this is a bug in my model or somewhere else. (It use a decomposition of cumulative and that might very well be the culprit.)
And sorry about the largish model. I haven't had any similar problems with @objective before this.
function cumulative(model, start, duration, resource, limit)
tasks = [i for i in 1:length(start) if resource[i] > 0 && duration[i] > 0]
num_tasks = length(tasks)
times_min_a = round.(Int,[JuMP.lower_bound(start[i]) for i in tasks])
times_min = minimum(times_min_a)
times_max_a = round.(Int,[JuMP.upper_bound(start[i])+duration[i] for i in tasks])
times_max = maximum(times_max_a)
for t in times_min:times_max
bs = @variable(model, [1:num_tasks], Bin)
bt = @variable(model, [1:num_tasks], Bin)
b = @variable(model, [1:num_tasks], Bin)
for i in tasks
# is this task active during this time t?
@constraint(model, bs[i] := {start[i] <= t})
@constraint(model, bt[i] := {t <= start[i]+duration[i]-1}) # (should be '<')
@constraint(model, b[i] := { bs[i] + bt[i] == 2})
end
# Check that there's no conflicts in time t
@constraint(model,sum([b[i]*resource[i] for i in tasks]) <= limit)
end
end
function furniture_moving1(print_solutions=true,all_solutions=false)
cbc_optimizer = optimizer_with_attributes(Cbc.Optimizer, "logLevel" => 0)
glpk_optimizer = optimizer_with_attributes(GLPK.Optimizer)
ipopt_optimizer = optimizer_with_attributes(Ipopt.Optimizer)
model = Model(optimizer_with_attributes(CS.Optimizer,
"logging"=>[],
"traverse_strategy"=>:BFS,
"branch_split"=>:InHalf, # <-
"time_limit"=>6,
# "lp_optimizer" => cbc_optimizer,
"lp_optimizer" => glpk_optimizer,
# "lp_optimizer" => ipopt_optimizer,
))
# Furniture moving problem
n = 4
# [piano, chair, bed, table]
durations = [30,10,15,15]
resources = [3,1,3,2] # people needed per task
@variable(model, 0 <= start_times[1:n] <= 60, Int)
@variable(model, 0 <= end_times[1:n] <= 60, Int)
@variable(model, 1 <= limit <= 3, Int)
for i in 1:n
@constraint(model,end_times[i] == start_times[i] + durations[i])
end
cumulative(model, start_times, durations, resources, limit)
# This throws: MethodError: no method matching iterate(::Nothing)
# @objective(model,Min,limit)
optimize!(model)
status = JuMP.termination_status(model)
if status == MOI.OPTIMAL
num_sols = MOI.get(model, MOI.ResultCount())
println("num_sols:$num_sols\n")
if print_solutions
for sol in 1:num_sols
println("solution #$sol")
start_timesx = convert.(Integer,JuMP.value.(start_times; result=sol))
end_timesx = convert.(Integer,JuMP.value.(end_times; result=sol))
max_timex = convert.(Integer,JuMP.value.(max_time; result=sol))
limitx = convert.(Integer,JuMP.value.(limit; result=sol))
println("start_times:$start_timesx")
println("durations :$durations")
println("end_times :$end_timesx")
println("resources :$resources")
println("limit :$limitx")
end
end
end
end
@time furniture_moving1()
Reactions are currently unavailable