Модель LP не дает ожидаемого ответа

Я хочу использовать 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]

person GPrathap    schedule 01.12.2020    source источник
comment
Не глядя на код: есть проблемы с неуникальными решениями. Сравнение x здесь может быть просто неверным. Проверьте статус, цель и выполнимость ограничений. Если все в порядке, то в этих решателях нет вины, а только в ожиданиях. Разница в векторах решения может быть усилена scipy = ipm -> interioir-point + gurobi = simplex (по умолчанию) -> базовое возможное решение. Но это лишь побочное замечание.   -  person sascha    schedule 01.12.2020


Ответы (1)


Вы используете нулевую цель здесь. В зависимости от используемого алгоритма, какое из допустимых решений будет найдено первым, будет сообщено как решение. Метод внутренней точки всегда будет нацелен на центральное решение, в то время как симплекс будет возвращать вершинное решение - они никогда не будут точно равными без какой-либо постобработки.

Вам следует просто повторно запустить тест с ненулевой целью, чтобы лучше сравнить два решения.

person mattmilten    schedule 01.12.2020
comment
спасибо, вы знаете, что gurobi поддерживает метод внутренних точек? - person GPrathap; 02.12.2020
comment
Да, это так. Вы просто устанавливаете для параметра Method значение 2. По умолчанию симплекс и внутренняя точка, также известная как барьер, запускаются одновременно. - person mattmilten; 02.12.2020
comment
конечно, я попробую - person GPrathap; 02.12.2020