我正在使用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
答案 0 :(得分:1)
您使用的是sum,这很好。它需要一个列表并将其添加
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
调用中创建一个列表。
您可以运行该程序,并查看它与您要执行的操作有多接近,因为我不确定自己。