如何在Julia-JuMP中为整数规划建模‘then’约束?
在Julia-JuMP中建模整数规划的「Then」逻辑约束
「Then」逻辑约束本质是蕴含关系(若P成立,则Q必须成立),等价于「非P 或 Q」。在整数规划里,这类约束需要转化为线性约束,常用方法是大M法,需要根据变量类型(二进制/连续)选择合适的大M值(足够大但不影响最优解的常数)。以下结合你的代码给出常见场景的实现:
场景1:二进制变量间的蕴含约束
比如需求是「若x[i,j]=1(第i个对象分配到第j组),则y[j]=1(标记j组被使用)」,约束可直接写为:
@variable(mo, y[1:S], Bin) # 若已有该变量可省略 @constraint(mo, [i=1:N, j=1:S], y[j] >= x[i,j])
如果是「若x[i,j]=1,则y[j]=0」,则约束为:
@constraint(mo, [i=1:N, j=1:S], y[j] <= 1 - x[i,j])
场景2:二进制变量触发连续变量约束
比如需求是「若x[i,j]=1,则a[j] >= c[i,j]」(c[i,j]是给定的阈值),用大M法实现:
# 先定义大M,需大于a[j]可能的最大取值范围,根据实际问题调整 M = 1000 @constraint(mo, [i=1:N, j=1:S], a[j] >= c[i,j] - M*(1 - x[i,j]))
- 当x[i,j]=1时,约束简化为
a[j] >= c[i,j],符合需求; - 当x[i,j]=0时,右边为
c[i,j]-M,因M足够大,该约束自动满足,不会限制a[j]的取值。
如果需求是「若x[i,j]=1,则a[j] <= d[i,j]」,则约束改为:
@constraint(mo, [i=1:N, j=1:S], a[j] <= d[i,j] + M*(1 - x[i,j]))
结合你的现有代码示例
假设你的需求是「只要有对象分配到第j组(即sum(x[i,j]) >=1),则a[j] >= K」,可以用两种方式实现:
方式1:引入辅助二进制变量
@variable(mo, z[1:S], Bin) # z[j]=1表示j组有对象分配 @constraint(mo, [j=1:S], sum(x[i,j] for i=1:N) <= N*z[j]) @constraint(mo, [j=1:S], a[j] >= K - M*(1 - z[j]))
方式2:直接利用求和约束
@constraint(mo, [j=1:S], a[j] >= K - M*(N - sum(x[i,j] for i=1:N)))
当j组有分配时,sum(x[i,j])>=1,N - sum(...) <= N-1,右边等价于K - M*(<=N-1),因M足够大,约束等价于a[j]>=K;当j组无分配时,约束自动满足。
内容的提问来源于stack exchange,提问作者sana ullah
相关产品推荐
相关产品推荐

