求解后加入更多变量。如何更新对象和约束而不必重建?

2024-04-25 07:57:07 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我想给一个已经存在于PULP内存中的问题添加更多的变量,是否需要重新定义/重新声明目标函数和约束以包含/使用这些新变量?或者有什么简化的方法来添加它们,让prob为我做这些?在

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

我在文件中也看到了一个命令:“addVariableToConstraints(e)”

有没有人能举例说明这些用法?我不太擅长使用源代码来推断用法。另外,我没有看到类似的函数可以向objective中添加变量,当我试图用prob+=lpSum(…)执行此操作时,我收到了消息“Overwriting previous set objective”


Tags: 方法函数内存文档声明用法目标定义
1条回答
网友
1楼 · 发布于 2024-04-25 07:57:07

所以在PuLP中,问题的约束存储在有序字典对象中。当然,这意味着您可以根据需要修改它。你的问题有点不清楚,但这里有所有的方法,你可以修改你当前的问题,在不同的情况下,它的工作。为了便于解释,我们假设您要添加的两个变量分别称为var1和var2。在

1。改变目标

在本例中,您的目标似乎是一个lpSum()方法,但我不确定,因为您的问题不够具体。在

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

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

2。更改现有约束

同样,假设这是您最初的约束:var3 + 5*var4 >= 20。假设要将约束改为:var3 + 5*var4 + var1 - 2*var2 >= 20

那么最简单的方法就是在添加约束时预先标记所有约束。因此,在创建原始约束时,应执行以下操作:

^{pr2}$

然后,要更改约束并添加其他变量,可以执行以下操作:

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

注意: 你在上面的问题中提出的方法,即在原始问题中添加一个新的约束,而不是改变现有的约束,可能并不总是有效的。这是因为如果旧的约束更具约束性,并且您计划通过在新变量中增加额外的灵活性来放松约束或使其更具弹性,那么它将失败。选择旧的约束和新的约束,因为这两个约束将得到更多。因此,一切都不会改变。在

相关问题 更多 >