#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. Единственный способ гарантировать одинаковые решения — отправить в решатель одну и ту же модель, чего нельзя сделать, когда вы используете две совершенно разные системы моделирования.