Переменные ограничения Python, которые принимают свое имя вместо значения
Я хочу умножить диапазон каждой переменной, потому что я не могу использовать более 5 кг и 50 евро, поэтому я умножаю вес каждого продукта и его значение, но вместо этого программа возвращает мне ошибку, что она принимает значение an вместо диапазон.
from constraint import *
problem = Problem()
problem.addVariable("a",range(0,51))
problem.addVariable("b",range(0,51))
problem.addVariable("c",range(0,11))
problem.addVariable("d",range(0,6))
problem.addConstraint(MaxSumConstraint(5000),['a'*340, 'b'*120,'c'*105,'d'*300])
problem.addConstraint(MaxSumConstraint(50),['a'*2,'b','c'*4,'d'*5])
soluciones = problem.getSolutions()
for solucion in soluciones:
solucion_string = ""
for i in range(4):
solucion_string += "("+str(i)+","+str(solucion[i])+")"
print(solucion_string)
print(len(soluciones))
Я хочу использовать значение диапазона каждой переменной и умножить его.
1 ответ
Я не уверен, что понимаю, чего вы пытаетесь достичь, но если я правильно понимаю, вы используете меньший диапазон и в конечном итоге хотите умножить значение этой переменной.
Будет ли лучше, если вы выполните умножение в конце метода печати решения и вместо этого скорректируете условия MaxSumConstraint в сторону уменьшения.
То, что вы здесь делаете, не сработает:
['a'*340, 'b'*120,'c'*105,'d'*300]
Это не целочисленные переменные, это буквально просто строка «a» и т. д., поэтому вы не можете ее умножить.
Если вам нужно, чтобы на них повлияли раньше, вам, возможно, придется создать свою собственную ограничительную функцию, учитывающую умножение.
Я не уверен в цели этого фрагмента кода, но если я правильно его понимаю, можно ли вместо этого использовать что-то вроде этого:
def func1(a, b, c, d):
return (a * 340 + b * 120 + c * 105 + d * 300) <= 5000
def func2(a, b, c, d):
return (a * 2 + b + c * 4 + d * 5) <= 50
Что вы бы назвали так:
problem.addConstraint(func1, variables)
problem.addConstraint(func2, variables)