我有一个整数变量,
M
,它可以从1, 2, .. 10
获取值。现在,我想使用这个变量作为求和的上限。例如,如果在求解期间 M
的值解析为 5
,那么我想对另一个列表的前 5
元素求和,例如 P
。 P
是给我们的。
所以本质上,我想计算并在下面施加约束:
sum{i from 1 to M} P_i
您可以引入中间变量:
y_i
。请看下面的代码清单,我使用了 Google-OR-tool 进行说明。
from ortools.linear_solver import pywraplp
s = pywraplp.Solver("", pywraplp.Solver.SCIP_MIXED_INTEGER_PROGRAMMING)
M = s.IntVar(1, 10, name="")
y = {}
for i in range(1, 11):
y[i] = s.BoolVar("")
# fixing M to be 5 to test the logic
s.Add(M == 5)
# below constraints will ensure that y_1 = y_2 = y_3 = y_4 = y_5 = 1
# and remaining y_i are 0
s.Add(sum(y[i] for i in range(1, 11)) == M)
for i in range(1, 11):
s.Add(i * y[i] <= M)
s.Solve()
{i: y[i].SolutionValue() for i in range(1, 11)}
以上结果为
{1: 1.0, 2: 1.0, 3: 1.0, 4: 1.0, 5: 1.0, 6: 0.0, 7: 0.0, 8: 0.0, 9: 0.0, 10: 0.0}
现在你可以用
y_i
来表达:
s.Add(sum(y[i] * p[i] for i in range(1, 11)) >= x)
x
是占位符