#python #linear-programming #cplex
#python #линейное программирование #cplex
Вопрос:
Я пытаюсь реализовать warmstart в CPLEX python API.
Я знаю, что должен использовать следующую функцию:
set_start(self, col_status, row_status, col_primal, row_primal, col_dual, row_dual)
Давайте предположим, что у меня есть пять переменных [«x1», «x2», «x3», «x4», «x5»], и я хочу присвоить им следующие значения [0, 1, 0, 0, 1] для теплого запуска.
Я хотел бы сделать что-то вроде:
set_start(col_status=[],
row_status=[],
col_primal=["x1", "x2", "x3", "x4", "x5"],
row_primal=[0, 1, 0, 0, 1],
col_dual=[],
row_dual=[])
но в документации написано, что:
Каждая запись col_primal и row_primal должна быть с плавающей точкой, указывающей начальные первичные значения для столбцов и строк соответственно.
и я не понимаю, почему.
Как я могу сделать это на практике?
Ответ №1:
В документации для set_start также говорится:
Аргументы col_status, col_primal и col_dual являются списками, которые либо имеют длину, равную числу переменных, либо являются пустыми. Если col_status пуст, то row_status также должен быть пустым. Если значение col_primal пусто, то значение row_primal также должно быть пустым.
Например, мы можем вызвать set_status
, вот так:
>>> import cplex
>>> c = cplex.Cplex()
>>> indices = c.variables.add(names=["x" str(i) for i in range(5)])
>>> c.start.set_start(col_status=[],
... row_status=[],
... col_primal=[0., 1., 0., 0., 1],
... row_primal=[],
... col_dual=[],
... row_dual=[])
В примере обратите внимание, что индексы переменных, которые соответствуют ["x1", "x2", "x3", "x4", "x5"]
являются [0, 1, 2, 3, 4]
, и что в модели всего 5
переменных. Значения, передаваемые в col_primal
, также должны соответствовать этому списку индексов (например, для переменной с индексом 0 значение равно 0.0, для переменной с индексом 1 значение равно 1.0 и т.д.).