首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOcplex:对偶的对偶和原始的不一样吗?

DOcplex:对偶的对偶和原始的不一样吗?
EN

Stack Overflow用户
提问于 2022-09-27 20:42:31
回答 1查看 23关注 0票数 0

我有一个非常简单的原始问题定义如下:

代码语言:javascript
复制
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)

我还写下了这样的双重问题

代码语言:javascript
复制
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告诉我,对偶目标和原始目标是不同的。那么对偶的对偶问题与原始问题是不一样的?我很困惑。有什么帮助吗?谢谢。

代码语言:javascript
复制
Iteration log . . .
Iteration:     1   Dual objective     =         60900.000000
objective: 66100.000
  pump=200.000
  hour=16.667
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-28 07:30:44

原因是日志显示不完整。假设用原始方法求解两个模型:原始模型和对偶模型。

代码语言:javascript
复制
from docplex.mp.model import Model

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.parameters.lpmethod=1

mdl.solve(log_output=True)

print("obj=",mdl.objective_value)

mdl2 = Model(name='tubs_dual')

pump = mdl2.continuous_var(name='pump', lb=None)    
hour = mdl2.continuous_var(name='hour', lb=None)    
tubing = mdl2.continuous_var(name='tubing', lb=None)

aqua = mdl2.add_constraint(pump + 9*hour + 12*tubing >= 350, 'aqua')
hydro = mdl2.add_constraint(pump + 6*hour + 16*tubing >= 300, 'hydro')
typhoon = mdl2.add_constraint(pump + 8*hour + 13*tubing >= 320, 'typhoon')

cost = 200*pump + 1566*hour + 2880*tubing

mdl2.minimize(cost)
mdl2.parameters.lpmethod=1

mdl2.solve(log_output=True)

print("obj=",mdl2.objective_value)

然后你会得到

代码语言:javascript
复制
Iteration log . . .
Iteration:     1    Objective     =         60900.000000
obj= 66100.0


Iteration log . . .
Iteration:     1    Scaled infeas =             0.000000
Switched to devex.
Iteration:     2    Objective     =         66100.000000
obj= 66100.0
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73873615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档