Gurobi:Objective Primal 的值不等于 dual(传输问题)
Gurobi: Objective Value of Primal not equal to dual (transportation problem)
将解决方案 here 用于模型的运输问题:
m = Model("transport_problem_2")
flow = {}
for c in cities:
for b in bases:
flow[c,b] = m.addVar(obj=distance[c,b], name='flow_%s_%s' %(c,b))
m.update()
for c in cities:
m.addConstr(quicksum(flow[c,b] for b in bases) <= supply[c], 'supply_%s' %(c))
for b in bases:
m.addConstr(quicksum(flow[c,b] for c in cities) >= demand[b], 'demand_%s' %(b))
m.optimize()
为了练习,我在Gurobi中写了上面程序的对偶:
m_dual = Model("transport_problem_2_dual")
alpha = m_dual.addVars(cities,name='alpha')
beta = m_dual.addVars(bases,name='beta')
m_dual.setObjective(alpha.prod(supply)+beta.prod(demand), GRB.MAXIMIZE)
m_dual.addConstrs((alpha[c] + beta[b] <= distance[c,b] for c,b in arcs), 'alpha_beta')
m_dual.optimize()
不幸的是,尽管对偶是正确的,但两个最佳 objective 值是不同的。 (我使用 m_dual.display() 手动检查了它)。有人知道为什么吗?我认为 Strong Duality Theorem 保证了这个 属性 因为两个 objective 值都是最优的。
编辑:为了使对偶 LP 工作,我必须正确绑定对偶中的变量(正如答案所指出的)
alpha = m_dual.addVars(cities,name='alpha',lb=-GRB.INFINITY)
我认为对偶公式中的变量可能存在符号错误。这是我用过的:
将解决方案 here 用于模型的运输问题:
m = Model("transport_problem_2")
flow = {}
for c in cities:
for b in bases:
flow[c,b] = m.addVar(obj=distance[c,b], name='flow_%s_%s' %(c,b))
m.update()
for c in cities:
m.addConstr(quicksum(flow[c,b] for b in bases) <= supply[c], 'supply_%s' %(c))
for b in bases:
m.addConstr(quicksum(flow[c,b] for c in cities) >= demand[b], 'demand_%s' %(b))
m.optimize()
为了练习,我在Gurobi中写了上面程序的对偶:
m_dual = Model("transport_problem_2_dual")
alpha = m_dual.addVars(cities,name='alpha')
beta = m_dual.addVars(bases,name='beta')
m_dual.setObjective(alpha.prod(supply)+beta.prod(demand), GRB.MAXIMIZE)
m_dual.addConstrs((alpha[c] + beta[b] <= distance[c,b] for c,b in arcs), 'alpha_beta')
m_dual.optimize()
不幸的是,尽管对偶是正确的,但两个最佳 objective 值是不同的。 (我使用 m_dual.display() 手动检查了它)。有人知道为什么吗?我认为 Strong Duality Theorem 保证了这个 属性 因为两个 objective 值都是最优的。
编辑:为了使对偶 LP 工作,我必须正确绑定对偶中的变量(正如答案所指出的)
alpha = m_dual.addVars(cities,name='alpha',lb=-GRB.INFINITY)
我认为对偶公式中的变量可能存在符号错误。这是我用过的: