2010-09-08 88 views
5

我有包含与属性FOO中的相同类的实例许多可变大小的列表,以及对于每个列表,我必须应用等的规则:如果有一个元件如何检查列表中元素之间的约束/是否约束编程?

  • FOO = A不能有在以foo元素[ B,C,d]
  • 如果有一个元素富= X必须有由至少一个以foo在[Y,Z]
  • 可以有MIN和MAX元件之间富= 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一个问题吗?我实际上并不需要解决东西,得到的结果,我需要验证我的名单对一些约束和检查它们是否满意或不满意。你如何分类这个问题,你将如何解决它?

为什么它的价值,我在Python编码,但我欢迎一个泛型编程答案:)如果事实证明我必须深入研究约束编程我可能会开始尝试python-constraint

回答

4

简短的回答 - 是的,这可以用约束规划进行检查,实际上你提供一个解决方案,并检查它反对的约束,而不是通过潜力的领域寻找匹配的解决方案的求解器搜索。哪种类型的约束编程过度使用,尤其是如果您使用的是可以轻松检查这些条件的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 

基本上,我会说,除非约束会得到更加复杂,或者你会希望找到解决办法,而不是只是测试我的代码,而不是约束编程棒。