You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python-constraint变量取值错误:约束中误用变量名而非变量值

问题分析与修正方案

你的核心错误有两个:

  1. 约束中误用字符串重复(如'a'*340),这是生成重复字符串,而非变量取值乘以系数
  2. 遍历解的时候错误使用数字索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:25:51