Гуроби определяет проблему как неосуществимую, хотя это не так - PullRequest
0 голосов
/ 18 июня 2019

Я попытался решить несколько подобных проблем оптимизации, используя Gurobi и Pyomo.Проблемы отличаются лишь несколькими параметрами.Каждая задача запускается три раза, каждый раз с теми же ограничениями, но с другой целевой функцией.

Была одна проблема, для которой Гуроби мог решить только две из указанных мной целевых функций.Для третьей целевой функции она не смогла решить проблему, указав проблему как «неосуществимую».Но это не имело смысла для меня, поскольку выполнимая область была точно такой же, как и тогда, когда две другие целевые функции использовались для решения проблемы.

Я выключил и снова включил компьютер и снова попытался решить проблему на PyCharm и Spyder.Гуроби все еще говорил мне, что проблема невозможна.Тем не менее, я был уверен, что проблема была вполне осуществимой, основываясь на моих наблюдениях за другими подобными проблемами.Поэтому я попытался решить ту же проблему на другом компьютере.На этот раз это сработало! ...

Таким образом, я частично решил свою проблему.У меня есть результаты, которые мне нужны, но, поскольку я не понимаю, что происходит с Гуроби на моем компьютере, я могу столкнуться с такой же проблемой в будущем.

Кто-нибудь имеет представление об этой "ошибке"?

1 Ответ

0 голосов
/ 18 июня 2019

Вам следует убедиться, что вы, Гуроби, сообщаете о статусе"неосуществимом", а не "неосуществимом или неограниченном". Вы можете проверить возврат статуса или журнал или отключить предварительное разрешение Dual Reductions . Если у вас большие коэффициенты, вы можете увидеть предыдущий вопрос о целочисленном программировании и вытекающих абстракциях. Вы можете проверить один показатель численной сложности вашей задачи с помощью атрибута KappaExact . Как @ LarrySnyter610 , предложенный в комментариях, Гуроби также может не хватать времени.

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

Предположим, у вас есть 2 цели, obj1, obj2 для одного и того же набора целей. Вы можете решить их последовательно

m.setObjective(obj1)
m.optimize()
if m.SolCount > 0:
   solution1 = m.getAttr('X', m.getVars())
m.setObjective(obj2)
if m.SolCount > 0:
   solution2 = m.getAttr('X', m.getVars())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...