Проблема с циклом For в ограничении при использовании пакета PyMProg - PullRequest
0 голосов
/ 11 июня 2019

Я использую пакет 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 Ответ

1 голос
/ 11 июня 2019

Вы используете сумму, которая в порядке.Он берет список и складывает их

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 вызова.

Вы можете запустить это и посмотреть, насколько это близко к тому, что вы пытаетесь сделать, поскольку я сам не совсем уверен.

...