使用PyMProg软件包约束中的For循环问题

时间:2019-06-11 15:47:21

标签: python constraints mathematical-optimization

我正在使用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

1 个答案:

答案 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调用中创建一个列表。

您可以运行该程序,并查看它与您要执行的操作有多接近,因为我不确定自己。