如何使变量充当求和约束的上限

问题描述 投票:0回答:1

我有一个整数变量,

M
,它可以从
1, 2, .. 10
获取值。现在,我想使用这个变量作为求和的上限。例如,如果在求解期间
M
的值解析为
5
,那么我想对另一个列表的前
5
元素求和,例如
P
P
是给我们的。

所以本质上,我想计算并在下面施加约束:

sum{i from 1 to M} P_i
linear-programming mixed-integer-programming
1个回答
0
投票

您可以引入中间变量:

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
是占位符

© www.soinside.com 2019 - 2024. All rights reserved.