CPLEX python API warmstart

#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 и т.д.).