PULP求解后添加更多变量.如何用它们更新obj和约束而不必重建



如果我想在PULP中向内存中已经存在的问题添加更多变量,我是否需要重新定义/声明目标函数和约束以包括/使用这些新变量?或者有没有一些简化的方法来添加它们,并有可能为我做到这一点?

现在,我在PULP文档中看到LpVariable类有一个参数选项:"e–用于基于列的建模:与变量在目标函数和约束中的存在有关">

我还在文档中看到了一个命令:"addVariableToConstraints(e)">

有人举过这些用法的例子吗?我不太擅长使用源代码来推断用法。此外,我没有看到类似的函数可以将变量添加到目标中,当我尝试使用prob+=lpSum(…)时,我得到了消息"覆盖先前设置的目标">

因此,在PuLP中,问题的约束存储在Ordered Dictionary对象中。当然,这意味着您可以根据需要对其进行更改。你的问题有点不清楚,但以下是你可以根据不同情况修改当前问题的所有方法。为了解释起见,让我们假设你试图添加的两个变量被称为var1和var2。

1.更改目标

在这种情况下,你的目标似乎是一个lpSum()方法,尽管我不确定,因为你的问题不够具体。

problem += problem.objective + 2*var1 - 3*var2 

这确保了您不必重新计算当前的问题目标并再次调用lpSum(),因为如果您一遍又一遍地这样做,这将是一个沉重的计算开销。当然,每当你更改目标时,你都会收到一个通知,说你正在覆盖之前设置的目标。

2.更改现有约束

再次假设这是您最初的约束条件:var3 + 5*var4 >= 20。假设您想将约束更改为:var3 + 5*var4 + var1 - 2*var2 >= 20

然后最简单的方法是在添加所有约束时预先标记它们。因此,在创建原始约束时,您可以执行以下操作:

problem += var3 + 5*var4 >= 20, "ConstraintName #1" 

然后要更改约束并添加额外的变量,您可以执行以下操作:

problem.constraints["ConstraintName #1"] = var3 + 5*var4 + var1 - 2*var2 >= 20

注意:您在上面的问题中提出的方法,即在原始问题中添加新的约束,而不是更改现有约束,可能并不总是有效的。这是因为,如果旧的约束更具约束性/限制性,并且您计划通过添加新变量的额外灵活性来放松约束或使其更具弹性,那么它将失败。因为求解器将同时获得旧的&新约束,然后选择约束性更强的约束(即旧约束)。因此,一切都不会改变。

最新更新