Skip to content

Commit 5924ae8

Browse files
committed
Add scheduling constraints and problem. Error function is weak.
1 parent a246689 commit 5924ae8

File tree

4 files changed

+113
-98
lines changed

4 files changed

+113
-98
lines changed

src/scheduling.jl

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,44 @@
1-
function scheduling(processing_times, due_dates, ::Val{:JuMP})
2-
model = JuMP.Model(CBLS.Optimizer)
1+
function scheduling(processing_times, due_dates, ::Val{:raw})
2+
m = model(; kind = :scheduling)
33
n = length(processing_times) # number of jobs
44
max_time = sum(processing_times)
55

6-
minus_eq_param(param) = x -> x[1] - x[2] == param
7-
less_than_param(param) = x -> x[1] param
6+
d = domain(0:max_time)
7+
foreach(_ -> variable!(m, d), 1:n) # C (1:n)
8+
foreach(_ -> variable!(m, d), 1:n) # S (n+1:2n)
9+
10+
minus_eq_param(param) = x -> abs(x[1] - x[2] - param)
11+
less_than_param(param) = x -> abs(x[1] - param)
812
sequential_tasks(x) = x[1] x[2] || x[3] x[4]
913

14+
for i in 1:n
15+
constraint!(m, minus_eq_param(processing_times[i]), [i, i + n])
16+
constraint!(m, less_than_param(due_dates[i]), [i])
17+
end
18+
for i in 1:n, j in 1:n
19+
i == j && continue
20+
constraint!(m, sequential_tasks, [i, j + n, j, i + n])
21+
end
22+
23+
return m
24+
end
25+
26+
function scheduling(processing_times, due_dates, ::Val{:JuMP})
27+
model = JuMP.Model(CBLS.Optimizer)
28+
n = length(processing_times) # number of jobs
29+
max_time = sum(processing_times)
1030

1131
@variable(model, 0 C[1:n] max_time, Int) # completion
1232
@variable(model, 0 S[1:n] max_time, Int) # start
1333

14-
@constraint(model, C in AllDifferent())
15-
@constraint(model, S in AllDifferent())
16-
1734
for i in 1:n
18-
@constraint(model, [C[i], S[i]] in Predicate(minus_eq_param(processing_times[i])))
19-
# @constraint(model, [C[i]] in Predicate(less_than_param(due_dates[i])))
35+
@constraint(model, [C[i], S[i]] in MinusEqualParam(processing_times[i]))
36+
@constraint(model, [C[i]] in LessThanParam(due_dates[i]))
37+
end
38+
for i in 1:n, j in 1:n
39+
i == j && continue
40+
@constraint(model, [C[i], S[j], C[j], S[i]] in SequentialTasks())
2041
end
21-
# for i in 1:n, j in 1:n
22-
# i == j && continue
23-
# @constraint(model, [C[i], S[j], C[j], S[i]] in Predicate(sequential_tasks))
24-
# end
2542

2643
return model, C, S
2744
end

test/JuMP.jl

Lines changed: 79 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,82 @@
1-
# @testset "JuMP: constraints" begin
2-
# m = Model(CBLS.Optimizer)
3-
4-
# err = _ -> 1.0
5-
# concept = _ -> true
6-
7-
# @variable(m, X[1:10], DiscreteSet(1:4))
8-
9-
# @constraint(m, X in Error(err))
10-
# @constraint(m, X in Predicate(concept))
11-
12-
# @constraint(m, X in AllDifferent())
13-
# @constraint(m, X in AllEqual())
14-
# @constraint(m, X in AllEqualParam(2))
15-
# @constraint(m, X in AlwaysTrue())
16-
# @constraint(m, X[1:4] in DistDifferent())
17-
# @constraint(m, X[1:2] in Eq())
18-
# @constraint(m, X in Ordered())
19-
# end
20-
21-
# @testset "JuMP: sudoku 9x9" begin
22-
# m, X = sudoku(3)
23-
# optimize!(m)
24-
# solution_ = value.(X)
25-
# display(solution_, Val(:sudoku))
26-
# end
27-
28-
# @testset "JuMP: golomb(5)" begin
29-
# m, X = golomb(5)
30-
# optimize!(m)
31-
# @info "JuMP: golomb(5)" value.(X)
32-
# end
33-
34-
# @testset "JuMP: magic_square(3)" begin
35-
# m, X = magic_square(3)
36-
# optimize!(m)
37-
# @info "JuMP: magic_square(3)" value.(X)
38-
# end
39-
40-
# @testset "JuMP: n_queens(5)" begin
41-
# m, X = n_queens(5)
42-
# optimize!(m)
43-
# @info "JuMP: n_queens(5)" value.(X)
44-
# end
45-
46-
# @testset "JuMP: qap(12)" begin
47-
# m, X = qap(12, qap_weights, qap_distances)
48-
# optimize!(m)
49-
# @info "JuMP: qap(12)" value.(X)
50-
# end
51-
52-
# @testset "JuMP: basic opt" begin
53-
# model = Model(CBLS.Optimizer)
54-
# set_optimizer_attribute(model, "iteration", 100)
55-
# @test get_optimizer_attribute(model, "iteration") == 100
56-
# set_time_limit_sec(model, 5.0)
57-
# @test time_limit_sec(model) == 5.0
58-
59-
# @variable(model, x in DiscreteSet(0:20))
60-
# @variable(model, y in DiscreteSet(0:20))
61-
62-
# @constraint(model, [x,y] in Predicate(v -> 6v[1] + 8v[2] >= 100 ))
63-
# @constraint(model, [x,y] in Predicate(v -> 7v[1] + 12v[2] >= 120 ))
64-
65-
# objFunc = v -> 12v[1] + 20v[2]
66-
# @objective(model, Min, ScalarFunction(objFunc))
67-
68-
# optimize!(model)
69-
70-
# @info "JuMP: basic opt" value(x) value(y) (12*value(x)+20*value(y))
71-
# end
72-
73-
# @testset "JuMP: Chemical equilibrium" begin
74-
# m, X = chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy)
75-
# # set_optimizer_attribute(m, "iteration", 10000)
76-
# # set_time_limit_sec(m, 120.0)
77-
# optimize!(m)
78-
# @info "JuMP: $compounds_names ⟺ $mixture_name" value.(X)
79-
# end
1+
@testset "JuMP: constraints" begin
2+
m = Model(CBLS.Optimizer)
3+
4+
err = _ -> 1.0
5+
concept = _ -> true
6+
7+
@variable(m, X[1:10], DiscreteSet(1:4))
8+
9+
@constraint(m, X in Error(err))
10+
@constraint(m, X in Predicate(concept))
11+
12+
@constraint(m, X in AllDifferent())
13+
@constraint(m, X in AllEqual())
14+
@constraint(m, X in AllEqualParam(2))
15+
@constraint(m, X in AlwaysTrue())
16+
@constraint(m, X[1:4] in DistDifferent())
17+
@constraint(m, X[1:2] in Eq())
18+
@constraint(m, X in Ordered())
19+
end
20+
21+
@testset "JuMP: sudoku 9x9" begin
22+
m, X = sudoku(3)
23+
optimize!(m)
24+
solution_ = value.(X)
25+
display(solution_, Val(:sudoku))
26+
end
27+
28+
@testset "JuMP: golomb(5)" begin
29+
m, X = golomb(5)
30+
optimize!(m)
31+
@info "JuMP: golomb(5)" value.(X)
32+
end
33+
34+
@testset "JuMP: magic_square(3)" begin
35+
m, X = magic_square(3)
36+
optimize!(m)
37+
@info "JuMP: magic_square(3)" value.(X)
38+
end
39+
40+
@testset "JuMP: n_queens(5)" begin
41+
m, X = n_queens(5)
42+
optimize!(m)
43+
@info "JuMP: n_queens(5)" value.(X)
44+
end
45+
46+
@testset "JuMP: qap(12)" begin
47+
m, X = qap(12, qap_weights, qap_distances)
48+
optimize!(m)
49+
@info "JuMP: qap(12)" value.(X)
50+
end
51+
52+
@testset "JuMP: basic opt" begin
53+
model = Model(CBLS.Optimizer)
54+
set_optimizer_attribute(model, "iteration", 100)
55+
@test get_optimizer_attribute(model, "iteration") == 100
56+
set_time_limit_sec(model, 5.0)
57+
@test time_limit_sec(model) == 5.0
58+
59+
@variable(model, x in DiscreteSet(0:20))
60+
@variable(model, y in DiscreteSet(0:20))
61+
62+
@constraint(model, [x,y] in Predicate(v -> 6v[1] + 8v[2] >= 100 ))
63+
@constraint(model, [x,y] in Predicate(v -> 7v[1] + 12v[2] >= 120 ))
64+
65+
objFunc = v -> 12v[1] + 20v[2]
66+
@objective(model, Min, ScalarFunction(objFunc))
67+
68+
optimize!(model)
69+
70+
@info "JuMP: basic opt" value(x) value(y) (12*value(x)+20*value(y))
71+
end
72+
73+
@testset "JuMP: Chemical equilibrium" begin
74+
m, X = chemical_equilibrium(atoms_compounds, elements_weights, standard_free_energy)
75+
# set_optimizer_attribute(m, "iteration", 10000)
76+
# set_time_limit_sec(m, 120.0)
77+
optimize!(m)
78+
@info "JuMP: $compounds_names$mixture_name" value.(X)
79+
end
8080

8181
@testset "JuMP: Scheduling" begin
8282
model, completion_times, start_times = scheduling(processing_times, due_times)

test/instances.jl

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,5 @@ mixture_name = "½⋅N₂H₄ + ½⋅O₂"
7575

7676
equation = compounds_names * " = " * mixture_name
7777

78-
# processing_times = [3, 2, 1]
79-
# due_times = [5, 6, 8]
80-
processing_times = [3, 2]
81-
due_times = [5, 6]
78+
processing_times = [3, 2, 1]
79+
due_times = [5, 6, 8]

test/runtests.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ using Test
88

99
@testset "ConstraintModels.jl" begin
1010
include("instances.jl")
11-
# include("raw_solver.jl")
12-
# include("MOI_wrapper.jl")
11+
include("raw_solver.jl")
12+
include("MOI_wrapper.jl")
1313
include("JuMP.jl")
1414
end

0 commit comments

Comments
 (0)