Какие обратные вызовы CPEX я должен использовать для решения подзадачи и использовать result для решения основной проблемы в качестве отложенных ограничений?

#callback #cplex

#обратный вызов #cplex

Вопрос:

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

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

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

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

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

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

1. Я видел файлы admipex и bendersatsp, они являются примерами использования обратного вызова в CPLEX. Однако я все еще не уверен, какие обратные вызовы мне следует использовать. Моя идея состоит в том, чтобы использовать BranchCallback для получения информации из возможного решения для создания подзадачи на шаге 2. , использовать LazyConstraintCallback для добавления ограничений, полученных из подзадачи, и использовать SolveCallback для указания CPLEX непрерывно работать с self.use_solution() .

2. Из синтаксиса, который вы используете в своем вопросе, похоже, что вы используете CPLEX Python API. Это правильно? Похоже, вы могли бы сделать это, используя новый универсальный обратный вызов , который был представлен в CPLEX 12.8. Я думаю, bendersatsp2.py пример должен показать вам, что вам нужно.

3. Спасибо, rkersh! Я впервые работаю над CPLEX и использую CPEX Python API. Я рассмотрю новый общий обратный вызов.

Ответ №1:

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

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