运筹系列88:JuMP中的约束规划(constraint programming)

本文介绍了如何在ConstraintProgramming中使用JuMP库的API,如AllDifferent、BinPacking、Circuit等解决实际问题,包括变量的不同性约束、物品分配、排列组合等,并通过地图染色问题示例展示了如何构建和优化模型。
摘要由CSDN通过智能技术生成

在constraint programming中,objective是不起作用的,调用optimize!(model)后,会给出满足约束的可行解。
使用JuMP的约束规划API,可以极大简化模型。

1. 常用API

1.1. AllDifferent

每一个变量都是一个不同的数值。AllDifferent中的参数表示有多少个不同的数值

@variable(model, 2 <= x[1:4] <= 5, Int)
@constraint(model, x in MOI.AllDifferent(4))

x1-x4求解为2,5,4,3

1.2 BinPacking

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.

1.3 Circuit

Circuit的参数:表示有几个数;输出结果为1~n的一个排列

@variable(model, x[1:4], Int)
@constraint(model, x in MOI.Circuit(4))

1.4 CountAtLeast

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])))

1.5 CountBelongs

和上面类似,第一个参数是列表长度,列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。

@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))

1.6 CountDistinct

和上面类似,第一个参数是列表长度,其中列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。

@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)))

1.7 CountGreaterThan

和上面类似,第一个参数是列表长度,其中列表第一项表示计数阈值,后面表示变量;第二个参数是用于计数的数值集合。

@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]中出现的次数

1.8 Table

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))

2. 简单例子

下面是个地图染色问题的简单例子:

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])
  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值