使用Pulp进行线性编程优化

问题描述

我想问您关于优化线性程序的问题。我已经成功设置了模型。但是,我在设置元启发法以减少计算时间方面遇到问题。基本的优化模型可以在这里看到:

在元启发式算法中,有一个while循环,其条件如下:
同时 $ \ sum_ {i = 1} ^ I b_i y_i \ leq \ sum_ {k = 1} ^ K q_k $

我尝试通过以下代码实现这种情况:

while lpSum(b[i]*y[i] for i in I)<=lpSum(q[k] for k in K): 

如果分别计算两个总和,我将得到正确的结果。但是,当我将它们置于此条件下时,即使条件得到满足,代码也将陷入无限循环,并且它应该中断循环。我想这与数据类型有关,并且参数不能为LpAffineExpression。但是,我真的很难理解这个问题。

希望您能理解我的问题,非常感谢您的想法和解释!请告诉我,如果您需要有关特定内容的更多信息-抱歉,是初学者。

非常感谢和最诚挚的问候, 伯恩哈德

解决方法

lpSum没有值,就像常规的总和一样。

使用__eq__之类的内置公式,可以将任何Python对象与其他对象进行比较。我就是这样说date(2000,1,1) < date(2000,2)。但是,lpAffineExpressionslpSum是其中的一种)是要在约束中使用的。它们的内容是变量,由LP解算器解决,因此它们还没有任何值。

因此,lpSum(x) <= lpSum(y)的返回值不是true还是false,就像正常方程式一样,而是一个方程式。并且方程不是NoneFalse或任何其他假值。您所说的等同于while <some object>:,这始终是正确的。因此是无限循环。


在这种情况下,我不知道“使用元启发式方法减少计算时间”意味着什么-也许您运行了LP解算器的几次迭代,然后对结果应用元启发式。

如果是这种情况,请使用b[i].value()来获取该解决方案中变量b[i]的值,并确保以规则的总和计算总数。