首页 > 解决方案 > 如何在 Pulp Python 中添加指标约束?

问题描述

我有一个问题,我不知道如何在pulp. 谁能帮我?
例如:我有一个决策变量x[(i,j)],LpBinary和一个连续变量,u[i]x[(i,j)]等于时1,那么u[i] + q[j] == u[j]q只是客户的需求)谢谢您的帮助。

标签: pythonoptimizationpulp

解决方案


欢迎来到 SO!

我对您的问题的解释是您有二进制变量x[(i,j)]和连续变量u[i]。当x[(i,j)]==1您想要强制执行约束时,如下所示u[i] + q[j] == u[j]。如果x[(i,j)]==0那么没有这样的约束被强制执行。

这可以按如下方式完成:

for i in set_I:
    for j in set_J:
        u[j] >= u[i] + q[j] - (1 - x[(i,j)])*M
        u[j] <= u[i] + q[j] + (1 - x[(i,j)])*M

哪里M是一个比值的最大可能范围u[i]+ 最大可能值稍大的q[j]值。要理解为什么这可行,请考虑这两种情况,首先如果x[(i,j)]==1这些约束变为:

    u[j] >= u[i] + q[j]
    u[j] <= u[i] + q[j]

可以简写为:u[j] == u[i] + q[j],在这种情况下你想要的约束x[(i,j)]==1

在这种x[(i,j)]==0情况下,这些约束变为:

    u[j] >= u[i] + q[j] - M
    u[j] <= u[i] + q[j] + M

回想一下,M 是一个很大的数字,我们所说的是u[j] >= some_value - large_number,只要您选择M它,使其足够大就不会产生任何影响(根据需要)。类似地,如果足够大,约束u[j] <= some_value + large_number没有效果。M


推荐阅读