Python constraint库代码持续运行无输出,请求故障排查
问题排查:Python constraint库代码无输出且持续运行
问题代码
from constraint import * from constraint import Problem, AllDifferentConstraint problem = Problem() customers = ["Freda", "Opal", "Penny", "Sarah", "Vicky"] locations = ["Brownfield", "Durham", "Iowa Falls", "Los Altos", "Redding"] brands = ["Dodge", "Fiat", "Hyundai", "Jeep", "Nissan"] durations = [2, 3, 4, 5, 6] for i in range(1, 6): problem.addVariable(f"Customer_{i}", customers) problem.addVariable(f"Location_{i}", locations) problem.addVariable(f"Brand_{i}", brands) problem.addVariable(f"Duration_{i}", durations) for attr in ["Customer", "Location", "Brand", "Duration"]: problem.addConstraint(AllDifferentConstraint(), [f"{attr}_{i}" for i in range(1, 6)]) problem.addConstraint(lambda c1, c2, c3, c4: len({c1, c2, c3, c4}) == 4, ["Customer_5", "Location_4", "Location_2", "Brand_2"]) problem.addConstraint(lambda brand, location: brand != "Jeep" or location != "Iowa Falls", ["Brand_3", "Location_3"]) problem.addConstraint(lambda c, d: c != "Penny" or d != 6, ["Customer_4", "Duration_4"]) solutions = problem.getSolutions() for solution in solutions: print(solution)
排查与解决步骤
1. 确认库的正确性
很多用户会误装同名第三方库导致功能异常,正确的约束编程库是python-constraint,执行以下命令重新安装:
pip uninstall -y constraint pip install python-constraint
安装完成后,运行极简测试用例验证库是否正常:
from constraint import Problem, AllDifferentConstraint p = Problem() p.addVariables(['a','b'], [1,2]) p.addConstraint(AllDifferentConstraint()) print(p.getSolutions())
若输出[{'a': 1, 'b': 2}, {'a': 2, 'b': 1}],说明库功能正常。
2. 优化搜索空间(核心问题)
你的代码包含20个变量(5个位置×4类属性),每个属性类有5个可选值,加上全异约束后,总搜索空间达(5!)^4 = 207360000种可能,默认回溯算法遍历该空间会耗时极久,表现为程序“持续运行无输出”。
可通过以下方式剪枝优化:
- 临时缩小范围:给某个变量固定值快速验证,比如添加:
# 固定第一个顾客为Freda,缩小搜索范围 problem.addConstraint(lambda c: c == "Freda", ["Customer_1"]) - 切换高效求解器:使用
BacktrackingSolver并调整变量遍历顺序,比如:from constraint import BacktrackingSolver problem.setSolver(BacktrackingSolver()) - 移除冗余约束:第一个自定义约束
len({c1,c2,c3,c4})==4是冗余的——Customer_5、Location_2/Location_4、Brand_2来自三个无重叠值的列表,且Location_2与Location_4因全异约束必然不同,四个变量的值天然全异,移除该约束可减少计算开销。
3. 检查约束逻辑矛盾
若极简测试用例正常但你的问题仍无输出,需检查是否存在隐性约束矛盾,比如确认所有自定义约束是否互相冲突,导致问题无解。
内容的提问来源于stack exchange,提问作者Sai Kumar Murugavel
相关产品推荐
相关产品推荐

