Python-constraint变量取值错误:约束中误用变量名而非变量值
问题分析与修正方案
你的核心错误有两个:
- 约束中误用字符串重复(如
'a'*340),这是生成重复字符串,而非变量取值乘以系数 - 遍历解的时候错误使用数字索引
i,但变量名是"a","b","c","d",并非数字键
修正后的代码
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)) # 自定义重量约束:340*a + 120*b + 105*c + 300*d <= 5000 def weight_constraint(a, b, c, d): return 340 * a + 120 * b + 105 * c + 300 * d <= 5000 # 自定义价值约束:2*a + b + 4*c +5*d <=50 def value_constraint(a, b, c, d): return 2 * a + b + 4 * c + 5 * d <= 50 # 添加约束,指定对应的变量顺序 problem.addConstraint(weight_constraint, ["a", "b", "c", "d"]) problem.addConstraint(value_constraint, ["a", "b", "c", "d"]) soluciones = problem.getSolutions() # 正确遍历解中的变量 for solucion in soluciones: solucion_string = "" # 按a、b、c、d的顺序拼接结果 for var in ["a", "b", "c", "d"]: solucion_string += f"({var}, {solucion[var]})" print(solucion_string) print(f"总解数:{len(soluciones)}")
关键修改说明
- 约束部分:用自定义函数实现带系数的求和限制,约束函数会自动传入指定变量的当前取值,返回
True即代表满足约束条件 - 遍历解部分:通过变量名
"a","b","c","d"访问解中的值,避免因键不存在导致的报错 - 使用f-string简化字符串拼接,提升代码可读性
内容的提问来源于stack exchange,提问作者Arévalo
相关产品推荐
相关产品推荐

