2010-09-08 135 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 

基本上,我會說,除非約束會得到更加複雜,或者你會希望找到解決辦法,而不是隻是測試我的代碼,而不是約束編程棒。