DoCplex: Использование подмножества переменных в «теплом старте»

#cplex #docplex

Вопрос:

Я использую теплый старт в DoCplex. В самом начале я намерен использовать подмножество переменных принятия решений из предыдущей модели, которые привели к непустым значениям. Например, если у меня есть двоичные переменные решения, x_1,...,x_5 и решение в первой модели есть x_1=1,x_2=1 , а остальное равно нулю. Итак, в самом начале я хочу иметь только переменные принятия решений x_1 and x_2 . Таким образом, я могу уменьшить размер модели и повысить производительность. Учитывая, что у меня есть тысячи переменных для принятия решений, как я могу выбрать подмножество этих переменных в самом начале?

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

1. Просто сделайте что-то вроде цикла над всеми вашими переменными и добавьте те, которые имели ненулевые значения в вашем предыдущем решении, в прогрев с их значениями из предыдущего решения. Если вы хотите еще больше сократить этот набор, просто добавьте дополнительные критерии, например, на основе структуры вашей проблемы, поэтому, например, включайте в свой «теплый старт» только переменные и значения, которые представляют время начала занятий, или какое транспортное средство выполняет каждую доставку, или в какой комнате преподается урок, или что угодно.

Ответ №1:

Решение Docplex можно экспортировать в файл запуска MIP (формат MST) с write_level параметром. Этот необязательный параметр является перечисляемым значением из docplex.mp.constants/WriteLevel класса.

Это перечисление имеет четыре значения, реализующих декартово произведение двух флагов:

  • сохраняйте только дискретные переменные или сохраняйте все
  • оставьте нулевые значения или все значения

В частности: значение WriteLevel.DiscreteNonZeroVars сохраняется как MST только для дискретных переменных с ненулевыми значениями. Код для этого таков:

 sol = mdl.solve
mst1 = sol.export_as_mst(write_level=WriteLevel.DiscreteNonZeroVars)
 

Обратите внимание, что передача 4 (числовое значение перечисления) также будет работать, хотя и менее читабельно.

Если ни один из этих вариантов не соответствует вашим потребностям, вы всегда можете создать решение MST с пользовательским кодом, как предложил Тим.