разница в цене теневой целлюлозы с gurobi

#linear-programming #gurobi #pulp

#линейное программирование #gurobi #целлюлоза

Вопрос:

Я сравниваю значения для теневой цены (pi), рассчитанные с помощью gurobi и pulp. Я получаю разные значения для одного и того же ввода, и я не уверен, как это сделать с pulp. Вот файл lp, который я использую:

 Minimize
  x[0]   x[1]   x[2]   x[3]
Subject To
  C[0]: 7 x[0] >= 211
  C[1]: 3 x[1] >= 395
  C[2]: 2 x[2] >= 610
  C[3]: 2 x[3] >= 97
Bounds
End 
  

Для приведенного выше файла lp gurobi дает мне теневые цены:

 [0.14285714285714285, 0.3333333333333333, 0.5, 0.5]
  

и с целлюлозой я получаю:

 [0.14285714, 0.33333333, 0.5, 0.5]
  

Но если я выполню следующую модель lp:

 Minimize
  x[0]   x[1]   x[2]   x[3]   x[4]
Subject To
 C[0]: 7 x[0]   2 x[4] >= 211
 C[1]: 3 x[1] >= 395
 C[2]: 2 x[2]   2 x[4] >= 610
 C[3]: 2 x[3] >= 97
Bounds
End
  

С gurobi я получаю:

 [0.0, 0.3333333333333333, 0.5, 0.5]
  

и с целлюлозой я получаю:

 [0.14285714, 0.33333333, 0.5, 0.5]
  

Правильное значение — это то, которое возвращает gurobi (я думаю?).

Почему я получаю одинаковые теневые цены с pulp для разных моделей? Как я могу получить те же результаты, что и gurobi?

(Я не предоставил исходный код, потому что вопрос будет слишком длинным, я думаю, что моделей lp достаточно)

Ответ №1:

Во втором примере есть два оптимальных двойных решения: то, которое дает вам PuLP, и то, которое вы получаете, вызывая Gurobi напрямую. Уникальное оптимальное первичное решение [0.0, 131.67, 199.5, 48.5, 105.5], что делает пробелы для всех ограничений равными 0 в оптимальном первичном решении. Для c [0] если вы уменьшите правую часть, вы не получите уменьшения цели, но если вы увеличите ее, самый дешевый способ сделать ограничение выполнимым — увеличить x[0] . Gurobi гарантирует только то, что вы создадите оптимальное первичное и двойное решение. Конкретное оптимальное решение, которое вы получаете, является произвольным.

Первый пример — это просто проблема точности.

Комментарии:

1. Есть ли способ для второго решения получить тот же результат от PuLP, что и от Gurobi. Мне нужно получить [0.0, 0.33, 0.5, 0.5] из PuLP (проблему точности можно игнорировать)?

2. Единственный способ гарантировать одинаковые решения — отправить в решатель одну и ту же модель, чего нельзя сделать, когда вы используете две совершенно разные системы моделирования.