簡體   English   中英

DOcplex:對偶的對偶與原始的不一樣?

[英]DOcplex: the dual of the dual is not the same as primal?

我有一個非常簡單的原始問題,定義如下:

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 告訴我對偶目標和原始目標是不同的。 那么對偶的對偶問題與原始問題不同嗎? 我很納悶。 有什么幫助嗎? 謝謝。

Iteration log . . .
Iteration:     1   Dual objective     =         60900.000000
objective: 66100.000
  pump=200.000
  hour=16.667

原因是因為沒有完整的日志顯示。 假設您使用原始方法求解 2 個模型 primal 和 dual

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)

然后你會得到

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM