如何使用 CPLEX 求解器在 CVXPY 中手动设置初始解

How to manually set Initial Solution in CVXPY using CPLEX solver

我正在尝试通过在 CVXPY 中对问题建模并使用 CPLEX 求解器来解决单位承诺问题(MIQP 问题)。我已经成功地使用 CPLEX 使一切都与 CVXPY 一起工作。但是,这是针对小型系统的。现在我想对一个更大的系统做同样的事情。

旁注:我已经使用 CPLEX 在 MATLAB 中成功解决了 MIQP 问题。对于 MATLAB 中的大型系统,我使用了问题的 MILP 公式的初始解,并使用 "timelimit" 参数限制了 CPLEX 求解器的时间。这在短时间内成功地为我提供了最佳解决方案。

现在,当我尝试对 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)

然后是创建 objective 和约束的部分。然后我阅读了 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})

不确定这是否是执行此操作的正确方法。还要注意。初始解来自 MILP 公式,优化变量将不同于 MIQP 公式。所以我不能直接从 MILP 中提取解决方案并将其插入 MIQP 公式中。我首先需要处理结果。

让我稍微改变一下 bus and zoo example

# 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)

我确定热启动功能不适用于 CPLEX 求解器,或者这不是将热启动功能用于 CPLEX 的正确方法。这是通过使用与 https://www.cvxpy.org/tutorial/advanced/index.html#solve-method-options 中的热启动部分相关的示例完成的。将求解器指定为 CPLEX 时,求解时间没有差异。