问题描述
我想迭代地求解模型,并且在每次迭代中,时间都会增加一个周期。在每次迭代中,我都会再次求解模型。所以,我想知道我是否可以将第一次迭代中决策变量的第一期结果分配给第二次迭代中的第一期。例如,在第一次迭代中,时间段为T=7
,而在下一次迭代中,它变为T=8
。如果决策变量是 x_t,n
,其中 t
是时间,n
是迭代计数器,我可以将 x_1,1
结果分配给 docplex 中的 x_1,2
吗?我的目标是使用水平滚动技术。
解决方法
在这个答案中,我假设您使用的是 DOcplex 模型的一个实例。 模型是增量和可编辑,也就是说,一旦求解,您仍然可以向模型添加新的变量和约束并再次求解。之前的解决方案将用作起点(如果可行)或用作启发式(如果不可行)。
有几种方法可以设置变量值:
- 首先将其下限和上限设置为相同的值 v:这是一个硬约束,如
x.lb = 3
x.ub = 3
- 或者通过添加显式约束 这也是一个硬约束,为问题添加一个约束。 CPLEX 预求解自然会简化此过程,但这会增加复杂性。当模型可能变得不可行时,这种方法可能是首选;使用优先级,您可以探索通过放宽一些限制使其恢复可行的方法。
示例代码
c3 = (x==3)
mdl.add(c3)
另一种方法是构建一个带有变量值的“热启动”解决方案,用作起点,假设您正在解决一个混合整数程序。
在这种方法中,值被用作启发式起点,而不是硬约束;
换句话说,求解可以改变值。
有关详细信息,请参阅 Model.add_mip_start()
。