AMPL中二进制变量关联约束及对应专业术语咨询
嘿,我来帮你搞定这两个AMPL里的约束问题,都是整数规划中很常见的场景,咱们一步步拆解:
这类约束本质是逻辑蕴含(如果A成立,那么B必须成立),AMPL本身支持线性约束,我们只需要把逻辑规则转成数学表达式就行,分两种场景来看:
基础单条件触发
假设我们有两个二进制变量:
var x binary;(x=1代表“激活”状态)var y binary;(y=1代表“生效”状态)
要实现「如果x激活,y必须生效」,直接写下面的线性约束就够了:
subject to activate_y_when_x: y >= x;
解释一下:当x=1时,y必须≥1,而y是二进制变量,只能取1;当x=0时,y可以是0或1,完全符合需求。
如果y是连续变量,要求x激活时y必须达到某个阈值(比如≥5),可以用大M法(M取一个足够大的常数,别影响其他约束就行),其实这里有更简洁的写法:
var x binary; var y >= 0; subject to enforce_y_threshold: y >= 5 * x;
x=0时y≥0本身就满足;x=1时y≥5刚好符合要求,完全不用复杂的大M公式。
多条件组合触发
比如要求「当x1、x2、x3中至少2个激活时,y必须生效」,先算激活变量的总数,再转成约束:
var x1 binary; var x2 binary; var x3 binary; var y binary; subject to activate_y_on_multiple: y >= (x1 + x2 + x3) - 1;
验证一下:当激活数≥2时,右边≥1,y必须取1;当激活数≤1时,右边≤0,y可以随意取值,完美匹配需求。
如果是更复杂的组合(比如「x1激活且x2不激活时,y必须生效」),先把逻辑式转成线性约束:
逻辑规则:x1=1 且 x2=0 → y=1
等价的线性约束:
subject to complex_condition: y >= x1 - x2;
当x1=1、x2=0时,y≥1 → y=1;其他情况右边≤0,y不受限制,完全符合逻辑。
这个需求就是要把两个变量「绑定」在一起,要么都选,要么都不选,在AMPL里直接写等式约束就搞定了:
先定义变量:
var select_team{1..20} binary; # 假设有20个团队,select_team[i]=1表示选中第i个团队
然后加约束:
subject to team_10_12_binding: select_team[10] = select_team[12];
这样就强制了两个变量完全等价,绝对不会出现单独选中其中一个的情况。
对应的专业术语
在你给出的三个选项里,这个场景对应的是条件性约束——因为它本质是双向的条件关联(选Team10当且仅当选Team12);而「多准则」是指优化目标有多个维度,「互补性」一般指变量互斥(比如x+y=1),都不符合这个场景。
内容的提问来源于stack exchange,提问作者bigboy-

