Я пытаюсь решить проблему 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. Сначала мне нужно обработать результаты.