如何在Benders分解算法中将母版的当前解决方案用于子问题约束中?

时间:2019-07-08 13:40:12

标签: python algorithm mathematical-optimization cplex decomposition

我正在使用Benders Decomposition,目前正在使用bendersatsp.py文件,以使此代码适应我自己的MIP问题。 这种情况是,在我的情况下,与该bendersatsp.py文件不同,母版的解决方案参与了子问题的某些约束。这意味着对于母版的每个当前解决方案,我都必须修改这些约束的系数。

那么,为了将母版的当前求解向量用于子问题,我可以/必须写些什么?

目前,我已将此约束块写入separate函数中,但是最佳目标值并不正确。 为什么这不是一个好方法?

谢谢!

1 个答案:

答案 0 :(得分:2)

BendersLazyConsCallback中,使用self.get_values方法:

  

返回当前节点的解决方案值。

     

在节点LP无界的情况下,此方法返回一个   对应于无界方向的向量,按比例缩放以便   它的至少一个元素的大小为cplex.infinity。因此,通常   该向量可以直接使用,例如,将惰性   约束。但是,由于向量中存在较大的值   必须注意避免潜在的数值错误。如果有疑虑,   重新缩放向量,并将其用作无界射线而不是   原始向量。

解向量被传递到workerLP.separate中,并用于修改workerLP物镜的线性系数。相反,听起来您想以某种方式修改workerLP的约束。

而不是打电话:

cpx.objective.set_linear(zip(thevars, thecoefs))

您应该在Cplex.linear_constraints界面中调用方法。