我想使用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]
你在此处使用零目标。根据所使用的算法,首先找到哪个可行的解决方案都将报告为“解决方案”。内部点方法将始终以中心解决方案为目标,而单纯形将返回顶点解决方案-如果没有任何后处理,它们将永远不会完全相等。
你应该只使用非零目标重新运行测试,以更好地比较这两种解决方案。
谢谢你,你知道古罗比支持内点法吗?
是的,它确实。您只需将Method参数设置为2。默认情况下,单纯形和内部点(也称为障碍)会同时运行。
当然,我会尽力