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