#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 с пользовательским кодом, как предложил Тим.