我有许多可变大小的列表,其中包含具有属性 foo 的同一类的实例,并且对于每个列表,我必须应用如下规则:
- 如果有元素 foo=A 则 [B,C,D] 中不能有带 foo 的元素
- 如果有元素 foo=X 则必须至少有一个在 [Y,Z] 中带有 foo
- MIN 和 MAX 元素之间可以有 foo=BAR
组合以上三个规则可能足以表达我需要的任何类似约束。这有点像软件包中的依赖性检查,但我有数量但缺少版本:)
一个天真的方法是:
R_CONFLICT={ A: [B,C,D] }
R_DEPENDS ={ X: [ [Y,Z], W, .. } # means: A depends on either Y or Z, and W
R_MIN ={BAR: n, BAZ: m}
R_MAX ={BAR: o, BAZ: p}
# now just loop over lists to check them..
这是Constraint programming的问题吗? ?我实际上不需要解决某事来获得结果,我需要根据某些约束验证我的列表并检查它们是否满足。您如何对这个问题进行分类以及如何解决它?
就其值(value)而言,我正在用 Python 编码,但我欢迎通用编程答案 :) 如果事实证明我必须深入研究约束编程,我可能会先尝试 python-constraint .
最佳答案
简短的回答 - 是的,这可以使用约束规划来检查,实际上您正在提供一个解决方案并根据约束检查它,而不是让求解器在潜在的域中搜索匹配的解决方案。哪一种会使约束编程变得过大,尤其是当您使用 Python 时,它可以很容易地检查这些类型的条件。
我在这台机器上没有 Python,所以这段代码中可能有拼写错误/错误,但它显示了你所追求的,而不需要参与约束编程。
conflict = set([B, C , D])
foos = set([x.foo for x in list])
if A in foos:
if len(foos & conflict): #Set intersection
return false
len([x for x in list where x.foo == BAR]) #Gives you number of occurances of BAR
基本上我会说,除非约束变得更加复杂,或者您想要找到解决方案而不只是测试,否则我会坚持使用代码而不是约束编程。
关于python - 如何检查列表中元素之间的约束/这是约束编程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3666246/