Какие обратные вызовы CPEX я должен использовать, чтобы решить подзадачу, и использовать результат, чтобы помочь основной проблеме как ленивые ограничения? - PullRequest
0 голосов
/ 12 марта 2019

Я работаю над проблемой MIP в CPLEX. Основная цель модели - минимизировать функцию, скажем, min f (x).

Следующие шаги - идея того, что я хочу сделать:

  1. Я хочу сделать паузу или прекратить работу после того, как найдется подходящее решение - для этого я использую cplex.parameters.mip.limits.solutions.set (1), чтобы остановить решатель
  2. Затем я хочу создать и решить другую подзадачу, скажем, min g (x), в которой решение g (x) является частью ограничений основной модели.
  3. После получения решения подзадачи я добавляю ограничение к основной проблеме, используя добавление ограничений или, возможно, обратный вызов отложенного ограничения.
  4. Наконец, основная модель стала новой и лучшей моделью, которую я могу найти для решения.

Однако я хочу выполнить шаги с 1) по 4) итеративно, пока основная модель не станет оптимальной.

Я не достиг этого, потому что это сложно. Если кто-то может направить меня, указать мне правильное направление или привести несколько примеров, я буду очень признателен.

1 Ответ

0 голосов
/ 11 июля 2019

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

Вы можете реализовать обратный вызов с отложенным ограничением либо с помощью устаревшего API обратного вызова, либо с помощью универсального обратного вызова (впервые с версии 12.9).Посмотрите на примеры bendersatsp.py и bendersatsp2.py, поставляемые с CPLEX.Сосредоточьтесь на функциях __call__ в первом и invoke во втором.Замените различные separate функции, вызываемые оттуда, кодом, который разделяет ваши ограничения.

...