#callback #cplex
#обратный вызов #cplex
Вопрос:
Я работаю над проблемой MIP в CPLEX. Основная цель модели — минимизировать функцию, скажем, min f (x).
Следующие шаги — это идея того, что я хочу сделать:
- Я хочу приостановить или завершить работу после того, как он найдет приемлемое решение — для этого я использую cplex.parameters.mip.limits.solutions.set(1), чтобы остановить решатель
- Затем я хочу создать и решить другую подзадачу, скажем, для min g (x), в которой решение g (x) является частью ограничений основной модели.
- После получения решения подзадачи я добавляю ограничение к основной проблеме, используя добавление ограничений или, возможно, обратный вызов с отложенным ограничением.
- Наконец, основная модель стала новой и лучшей моделью, которую я могу использовать для решения.
Тем не менее, я хочу выполнять шаги с 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
функции, вызываемые оттуда, кодом, который разделяет ваши ограничения.