DOcplex疑问:对偶问题的对偶为何与原问题不一致?
线性规划原问题与对偶问题目标值不符排查
原问题代码
mdl = Model(name='tubs_primal') aqua = mdl.continuous_var(name='aqua') hydro = mdl.continuous_var(name='hydro') typhoon = mdl.continuous_var(name='typhoon') pump = mdl.add_constraint(aqua + hydro + typhoon <= 200, 'pump') hour = mdl.add_constraint(9*aqua + 6*hydro + 8*typhoon<= 1566, 'hour') tubing = mdl.add_constraint(12*aqua+16*hydro + 13*typhoon <= 2880, 'tubing') profit = 350*aqua + 300*hydro + 320*typhoon mdl.maximize(profit)
对偶问题代码
mdl = Model(name='tubs_dual') pump = mdl.continuous_var(name='pump', lb=None) hour = mdl.continuous_var(name='hour', lb=None) tubing = mdl.continuous_var(name='tubing', lb=None) aqua = mdl.add_constraint(pump + 9*hour + 12*tubing >= 350, 'aqua') hydro = mdl.add_constraint(pump + 6*hour + 16*tubing >= 300, 'hydro') typhoon = mdl.add_constraint(pump + 8*hour + 13*tubing >= 320, 'typhoon') cost = 200*pump + 1566*hour + 2880*tubing mdl.minimize(cost)
问题描述
原问题代码运行正常,但运行对偶问题时,CPLEX显示对偶目标值与原问题目标值不同。疑惑点:对偶问题的对偶为何与原问题不一致?
运行日志
迭代日志... 迭代次数: 1 对偶目标值 = 60900.000000 目标值: 66100.000 pump=200.000 hour=16.667
问题原因及解决方法
- 对偶变量边界约束错误:原问题是最大化线性规划,所有约束均为
<=类型,对应的对偶变量必须是非负的(lb=0),而你设置了lb=None(无下界),导致对偶问题解空间被错误放大,违反强对偶定理的前提条件。 - 修正方案:将对偶问题中三个变量的下界设为0,修正后代码如下:
mdl = Model(name='tubs_dual') # 修正:对偶变量设置非负下界 pump = mdl.continuous_var(name='pump', lb=0) hour = mdl.continuous_var(name='hour', lb=0) tubing = mdl.continuous_var(name='tubing', lb=0) aqua = mdl.add_constraint(pump + 9*hour + 12*tubing >= 350, 'aqua') hydro = mdl.add_constraint(pump + 6*hour + 16*tubing >= 300, 'hydro') typhoon = mdl.add_constraint(pump + 8*hour + 13*tubing >= 320, 'typhoon') cost = 200*pump + 1566*hour + 2880*tubing mdl.minimize(cost)
- 强对偶定理说明:当原问题和对偶问题均有可行解时,两者最优目标值必然相等。修正对偶变量的非负约束后,对偶问题的最优目标值会与原问题一致。
内容的提问来源于stack exchange,提问作者qqzj
相关产品推荐
相关产品推荐

