【问题标题】:LP model does not give expected answerLP 模型没有给出预期的答案
【发布时间】:2020-12-01 09:09:37
【问题描述】:

我想使用 gurobi 而不是 scipy,但我得到的答案与我在 scipy 中得到的答案不同,有人可以帮我看看这里出了什么问题吗?

import gurobipy as gp
from scipy.optimize import linprog
import numpy as np
 
lp_m = gp.Model()
w = np.array([1., 5., 1.])
halfspaces = np.array([
[1.*w[0], 1.*w[1], 1.*w[2], -10 ],
[ 1., 0., 0., -4],
[ 0., 1., 0., -4],
[ 0., 0., 1., -4],
[-1., 0., 0., 0],
[ 0., -1., 0., 0],
[ 0., 0., -1., 0]
])
 
A = halfspaces[:,0:3]
b = -1*halfspaces[:,-1]
cost = np.zeros(A.shape[1])
 
opt_x = lp_m.addMVar((A.shape[1],), name="x")
lp_m.setObjective(cost@opt_x)
lp_m.addConstr(A@opt_x <= b)
lp_m.optimize()
print(opt_x.X) #  [0. 0. 0.]
 
res = linprog(c=cost, A_ub=A, b_ub=b, method='interior-point')
print(res.x) # [1.65708642 1.040279 1.65708642]

【问题讨论】:

  • 不看代码:非唯一解存在问题。在这里比较 x 可能是错误的。检查状态、目标以及约束是否可行。如果所有这些都没问题,那么这些求解器就没有错,而只是期望值。解决方案向量的差异可能会被 scipy = ipm -> interioir-point + gurobi = simplex (default) -> 基本可行解决方案放大。但这只是一个旁白。

标签: python optimization linear-programming gurobi


【解决方案1】:

您在这里使用的是零目标。根据所使用的算法,首先找到的可行解决方案将被报告为“解决方案”。内点法将始终以中心解为目标,而单纯形法将返回顶点解——如果没有任何后处理,它们永远不会完全相等。

您应该使用非零目标重新运行测试,以更好地比较两个解决方案。

【讨论】:

  • 谢谢你,你知道gurobi支持内点法吗?
  • 是的,确实如此。您只需将 Method parameter 设置为 2。默认情况下,单纯形和内点(也称为屏障)同时运行。
  • 当然,我会试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-18
  • 2018-06-25
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多