Я хотел бы найти способ снабжать CPLEX решениями, пока он занимается минимизацией MIP. Эти решения основаны на эвристике, которую я запускаю параллельно с CPLEX. Весь подход смоделирован на Java, и я вызываю CPLEX с помощью IloCplex.
Я попытался установить ограничение по времени для CPLEX и после паузы передать новое решение модели CPLEX с помощью MIPStarts. Однако, когда я снова запускаю модель CPLEX, она говорит, что предоставленные мной решения неосуществимы, хотя я уверен, что они есть. На самом деле, CPLEX принимает эти решения, когда я полностью перезапускаю модель, чего я не хочу, потому что при этом исследование дерева b&b начинается заново с корневого узла.
если вы хотите обойти все проверки, вы можете использовать nocheck в качестве уровня запуска MIP.
NoCheck CPLEX accepts the MIP start without any checks.
Вместо того, чтобы полностью останавливать CPLEX, чтобы обеспечить мип-старт, вы можете захотеть использовать обратные вызовы и внедрять решения во время поиска. Соответствующий раздел Руководства пользователя — https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/CPLEX/UsrMan/topics/progr_adv/callbacks/introCallbacks.html, а ссылка на Java API — https://www.ibm.com/support/knowledgecenter/SSSA5P_12.9.0/ilog.odms.cplex.help/refjavacplex/html/ilog/cplex/IloCplex.Callback.html.
Кажется странным, что решение будет принято как мип-старт в начале поиска, а не тогда, когда поиск уже запущен и CPLEX прерван. Если вы можете воспроизвести это поведение с помощью CPLEX Interactive, я предлагаю вам разместить вопрос на https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000002059 и прикрепить файлы, которые позволят воспроизвести проблему.
Пожалуйста, взгляните на ibm.com/developerworks/community/forums/html/…. В частности, вы хотите следовать шагам Дэниела, упомянутым в его первом ответе.
Спасибо за ваш ответ. Я реализовал свой подход, используя эвристический обратный вызов, и у меня возникла та же проблема. Я использую функцию setSolution(vars, vals) для передачи решения, которое я получаю из своей эвристики, и когда я это делаю, я не получаю никаких ошибок или предупреждений. Однако, когда модель CPLEX продолжает работать после обратного вызова, она просто не принимает во внимание мое решение (решение осуществимо, поскольку оно работает при подаче в виде mip-start в новой модели). Вы знаете, должно ли это решение быть рассмотрено немедленно?, или есть временная задержка, прежде чем оно будет рассмотрено CPLEX?.