在constraint programming中,objective是不起作用的,调用optimize!(model)后,会给出满足约束的可行解。
使用JuMP的约束规划API,可以极大简化模型。
每一个变量都是一个不同的数值。AllDifferent中的参数表示有多少个不同的数值
@variable(model, 2 <= x[1:4] <= 5, Int)
@constraint(model, x in MOI.AllDifferent(4))
x1-x4求解为2,5,4,3
BinPacking的参数:第一个是每个bin的容量,第二个是每个物品的size列表;输出为每个物品的bin的id编号
weights, capacity,number_of_bins = Float64[1, 1, 2, 2, 3], 3.0, 3;
@variable(model, 1 <= x[1:length(weights)] <= number_of_bins, Int)
@constraint(model, x in MOI.BinPacking(capacity, weights))
x1-x5为2,1,2,1,3,表示第一个和第三个在bin2,第二个和第四个在bin1,第五个在bin3.
Circuit的参数:表示有几个数;输出结果为1~n的一个排列
@variable(model, x[1:4], Int)
@constraint(model, x in MOI.Circuit(4))
CountAtLeast的参数:第一个表示计数的阈值;第二个是x的划分列表;第三个是用于计数的数值集合
例如下面的例子表示:首先按照[3,3],划分为 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3和 x 4 , x 5 , x 6 x_4,x_5,x_6 x4,x5,x6,然后每个划分要满足至少2个数值在Set([4,3])中。结果为3,0,3,3,0,4,可以看出 x 1 , x 2 , x 3 x_1,x_2,x_3 x1,x2,x3有2个3,而 x 4 , x 5 , x 6 x_4,x_5,x_6 x4,x5,x6有1个3和1个4,都满足要求。
@variable(model, 0<=x[1:6]<=5, Int)
@constraint(model, x in MOI.CountAtLeast(2,[3,3], Set([4,3])))
和上面类似,第一个参数是列表长度,列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。
@variable(model, 0 <= x[i = 1:4] <= 4, Int)
@variable(model, n, Int)
@objective(model, Max, sum(x))
set = Set([4, 3])
@constraint(model, [n; x] in MOI.CountBelongs(1 + length(x), set))
和上面类似,第一个参数是列表长度,其中列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。
@variable(model, 0 <= x[i = 1:4] <= i, Int)
@variable(model, n, Int)
@objective(model, Max, sum(x))
@constraint(model, x[4]==3)
@constraint(model, [n; x] in MOI.CountDistinct(1 + length(x)))
和上面类似,第一个参数是列表长度,其中列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。
@variable(model, 0 <= x[i = 1:4] <= i, Int)
@variable(model, n, Int)
@variable(model, 3 <= y <= 4, Int)
@objective(model, Max, sum(x))
@constraint(model, [n; y; x] in MOI.CountGreaterThan(1 + 1 + length(x)))
结果为(2.0, 3.0, [1.0, 2.0, 3.0, 4.0])
表示2 > 3.0在[1.0, 2.0, 3.0, 4.0]中出现的次数
Table表示从matrix中选择一行:
table = Float64[2 2 3; 1 2 2; 2 0 2; 2 2 1]
@variable(model, x[i = 1:3], Int)
@constraint(model, x in MOI.Table(table))
下面是个地图染色问题的简单例子:
using JuMP,HiGHS
model = Model(HiGHS.Optimizer)
set_silent(model)
@variable(model, 0<=belgium<=3,Int)
@variable(model, 0<=denmark<=3,Int)
@variable(model, 0<=france<=3,Int)
@variable(model, 0<=germany<=3,Int)
@variable(model, 0<=luxembourg<=3,Int)
@variable(model, 0<=netherlands<=3,Int)
@constraint(model, [belgium,france] in MOI.AllDifferent(2))
@constraint(model, [belgium, germany] in MOI.AllDifferent(2))
@constraint(model, [belgium,luxembourg] in MOI.AllDifferent(2))
@constraint(model, [belgium, netherlands] in MOI.AllDifferent(2))
@constraint(model, [denmark, germany] in MOI.AllDifferent(2))
@constraint(model, [france, germany] in MOI.AllDifferent(2))
@constraint(model, [france, luxembourg] in MOI.AllDifferent(2))
@constraint(model, [germany, luxembourg] in MOI.AllDifferent(2))
@constraint(model, [germany, netherlands] in MOI.AllDifferent(2))
optimize!(model)
value.([belgium,denmark,france,germany,luxembourg,netherlands])