使用 PyMProg 包的约束中的 For 循环问题
Issue with For Loop in Constraint Using PyMProg Package
我正在使用 PyMathProg 包。可以在此处找到文档:http://pymprog.sourceforge.net/.
我已经创建了一个基本的 MIP 程序,但是我 运行 遇到了我的约束的语法问题。我按照上面文档中的深入教程进行了修改。
from pymprog import *
a = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
b = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
c = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
d = (5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
s = (2, 8, 5, 4, 6, 1, 4, 3, 8, 10)
begin('example')
verbose(True)
x = var('x', 10, kind=bool)
maximize(sum(s[i]*x[i] for i in range(10)))
for i in range(10):
sum(x[i]) == 5
sum(a[i]*x[i]) >= 5
sum(b[i]*x[i]) >= 250
sum(c[i]*x[i]) >= 15
sum(d[i]*x[i]) >= 90
solve()
我不确定为什么会出现以下错误。
sum(x[i]) == 5
TypeError: '_var' object is not iterable
您使用的是求和,这很好。它需要一个列表并将它们相加
sum([1,2,3])
6
问题是,您向其中传递的不是列表,x[i]
其他的是单个元素。
这就是它说 TypeError: '_var' object is not iterable
的原因。因为您传递的是列表 x 中的元素,它是使用 var
.
创建的
我知道你想做的是这样的:
from pymprog import *
a = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
b = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
c = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
d = (5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
s = (2, 8, 5, 4, 6, 1, 4, 3, 8, 10)
begin('example')
verbose(True)
x = var('x', 10, kind=bool)
maximize(sum(s[i]*x[i] for i in range(10)))
for i in range(10):
sum(x[j+i] for j in range(3)) == 5
sum(a[i]*x[j] for j in range(3)) >= 5
sum(b[i]*x[j] for j in range(3)) >= 250
sum(c[i]*x[j] for j in range(3)) >= 15
sum(d[i]*x[j] for j in range(3)) >= 90
solve()
您可以看到我在哪里将第二个 [i]
更改为 [j]
并添加了 for j in range (3)
。这意味着将在 sum
调用中创建一个列表。
您可以 运行 看看它与您尝试做的事情有多接近,因为我自己也不确定。
我正在使用 PyMathProg 包。可以在此处找到文档:http://pymprog.sourceforge.net/.
我已经创建了一个基本的 MIP 程序,但是我 运行 遇到了我的约束的语法问题。我按照上面文档中的深入教程进行了修改。
from pymprog import *
a = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
b = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
c = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
d = (5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
s = (2, 8, 5, 4, 6, 1, 4, 3, 8, 10)
begin('example')
verbose(True)
x = var('x', 10, kind=bool)
maximize(sum(s[i]*x[i] for i in range(10)))
for i in range(10):
sum(x[i]) == 5
sum(a[i]*x[i]) >= 5
sum(b[i]*x[i]) >= 250
sum(c[i]*x[i]) >= 15
sum(d[i]*x[i]) >= 90
solve()
我不确定为什么会出现以下错误。
sum(x[i]) == 5
TypeError: '_var' object is not iterable
您使用的是求和,这很好。它需要一个列表并将它们相加
sum([1,2,3])
6
问题是,您向其中传递的不是列表,x[i]
其他的是单个元素。
这就是它说 TypeError: '_var' object is not iterable
的原因。因为您传递的是列表 x 中的元素,它是使用 var
.
我知道你想做的是这样的:
from pymprog import *
a = (1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
b = (10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
c = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
d = (5, 10, 15, 20, 25, 30, 35, 40, 45, 50)
s = (2, 8, 5, 4, 6, 1, 4, 3, 8, 10)
begin('example')
verbose(True)
x = var('x', 10, kind=bool)
maximize(sum(s[i]*x[i] for i in range(10)))
for i in range(10):
sum(x[j+i] for j in range(3)) == 5
sum(a[i]*x[j] for j in range(3)) >= 5
sum(b[i]*x[j] for j in range(3)) >= 250
sum(c[i]*x[j] for j in range(3)) >= 15
sum(d[i]*x[j] for j in range(3)) >= 90
solve()
您可以看到我在哪里将第二个 [i]
更改为 [j]
并添加了 for j in range (3)
。这意味着将在 sum
调用中创建一个列表。
您可以 运行 看看它与您尝试做的事情有多接近,因为我自己也不确定。