Как вручную установить Initial Solution в CVXPY с помощью решателя CPLEX - PullRequest
0 голосов
/ 28 апреля 2020

Я пытаюсь решить проблему Unit Commitment (проблема MIQP) путем моделирования проблемы в CVXPY и использования решателя CPLEX. Мне удалось заставить все работать с CVXPY с использованием CPLEX. Однако это было для небольшой системы. Теперь я хотел бы сделать то же самое с гораздо большей системой.

Примечание. Я успешно решил проблему MIQP в MATLAB с помощью CPLEX. Для более крупной системы в MATLAB я использовал исходное решение из постановки задачи MILP и ограничил время решения CPLEX с помощью параметра "timelimit". Это успешно дало мне оптимальное решение за короткий промежуток времени.

Теперь, когда я пытаюсь сделать то же самое с CVXPY и CPLEX, решатель CPLEX дает сбой для более крупной системы. Также для меньшей системы я не замечаю никакой разницы во времени для решения проблемы. Я отметил это на основе значения "solver.stats.solve_time". Поэтому я не уверен, что первоначальное решение используется или им пренебрегают. Это пример кода для того, что я сделал. Это мои переменные оптимизации:

power = cp.Variable((nUnits, nHours))
isOn = cp.Variable((nUnits, nHours), integer=True)
startup = cp.Variable((nUnits, nHours), integer=True)

У меня есть раздел, где я создаю свою цель и ограничения. Затем я прочитал исходное решение из Excel и внес необходимые изменения, чтобы оно выглядело как решение:

initial_power_soln_df = pd.read_excel(r'C:\Users\micah\Downloads\OneDrive-2020-04-17\init.xlsx', sheet_name='Sheet1', header=None)
initial_isOn_soln_df = pd.read_excel(r'C:\Users\micah\Downloads\OneDrive-2020-04-17\init.xlsx', sheet_name='Sheet2', header=None)
initial_startup_soln_df = pd.read_excel(r'C:\Users\micah\Downloads\OneDrive-2020-04-17\init.xlsx', sheet_name='Sheet3', header=None)

power.value = initial_power_soln_df.to_numpy().T
isOn.value = initial_isOn_soln_df.to_numpy().T
startup.value = initial_startup_soln_df.to_numpy().T

Наконец, я создаю свою проблему и настраиваю решатель:

problem = cp.Problem(cp.Minimize(cost), constr)
problem.solve(solver=cp.CPLEX, cplex_params={"timelimit": 300})

Не уверен, что это правильный способ сделать это. Также NB. исходное решение исходит из формулировки MILP, а переменные оптимизации будут отличаться от формулировки MIQP. Поэтому я не могу просто взять решение из MILP и подключить его к формулировке MIQP. Сначала мне нужно обработать результаты.

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Я определил, что функциональность горячего старта не работает с решателем CPLEX или что это НЕ правильный способ использовать функциональность теплого старта с CPLEX. Это было сделано с помощью примера, связанного с секцией горячего старта в https://www.cvxpy.org/tutorial/advanced/index.html#solve -method-options . При указании решателя в качестве CPLEX нет разницы во времени решения.

0 голосов
/ 28 апреля 2020

позвольте мне немного изменить пример шины и зоопарка .

# Import packages.
import cvxpy as cp


# Define and solve the CVXPY problem.
nbBus40 = cp.Variable(integer=True)
nbBus30 = cp.Variable( integer=True)
cost = 500*nbBus40+400*nbBus30
prob = cp.Problem(cp.Minimize(cost),[40*nbBus40+30*nbBus30>=300,
                                     nbBus40==8,nbBus30==0
                                     ])

prob.solve(solver=cp.CPLEX,verbose=True)

prob = cp.Problem(cp.Minimize(cost),[40*nbBus40+30*nbBus30>=300,
                                     nbBus40>=0,nbBus30>=0
                                     ])

prob.solve(solver=cp.CPLEX,verbose=True,warm_start=True)

print("status = ",prob.status)

# Print result.
print("\nThe minimal cost is", prob.value)

print("number buses 40 seats = ",nbBus40.value)
print("number buses 30 seats = ",nbBus30.value)
...