线性规划:为偏离最优值的变量添加惩罚(x=0除外)
解决方案
要实现「x=0时不施加偏离惩罚」的需求,你需要引入一个二进制标记变量区分x的状态,再调整约束和目标函数逻辑:
1. 引入二进制变量
新增一个0-1整数变量y,用来标记x的状态:
- 当
x=0时,y=0(无惩罚) - 当
x≠0时,y=1(启用惩罚)
2. 添加变量关联约束
给x和y添加约束,确保两者状态绑定:
# M是足够大的正数(需大于x的最大可能取值,比如设为100) M = 100 self.prob += x <= M * y
这个约束保证:如果x>0,y必须等于1;如果x=0,求解器会自动选择y=0(因为这样能消除惩罚项,更优)。
3. 调整惩罚约束
修改原有的_SP约束,让惩罚仅在y=1时生效:
# 当y=1时,约束退回到原有的|x-3| ≤ _SP;当y=0时,约束自动宽松(允许_SP=0) self.prob += x - 3 <= _SP + M * (1 - y) self.prob += 3 - x <= _SP + M * (1 - y) self.prob += _SP >= 0 # 确保_SP非负
4. 修改目标函数的惩罚项
让惩罚仅在y=1时计入目标:
objective += other_values - 0.1 * _SP * y
调整后效果:
- 当
x=0时,y=0,惩罚项消失,_SP可取0,无惩罚产生 - 当
x≠0时,y=1,惩罚逻辑和原方案一致,约束会保证_SP覆盖x与3的偏差
内容的提问来源于stack exchange,提问作者XxcoralloxX
相关产品推荐
相关产品推荐

