我有一个问题,我不知道如何在pulp
中添加指标约束。谁能帮我吗?
例如:我有一个决策变量x[(i,j)]
,LpBinary和一个连续变量u[i]
,当x[(i,j)]
等于1
时,u[i] + q[j] == u[j]
(q
是只是客户的需求)谢谢您的帮助。
答案 0 :(得分:0)
欢迎您!
我对您的问题的解释是您有二进制变量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
就不会生效。