簡體   English   中英

如何檢查列表中元素之間的約束/這是約束編程嗎?

[英]How to check constraints between elements in a list / is this Constraint Programming?

我有許多可變大小的列表,包含具有屬性foo的相同類的實例,並且對於每個列表,我必須應用如下規則:

  • 如果有一個元素foo = A,則[B,C,D]中不能有foo元素
  • 如果有一個元素foo = X必須至少有一個foo在[Y,Z]
  • 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編程的問題嗎? 我實際上並不需要解決某些問題以獲得結果,我需要針對某些約束驗證我的列表並檢查它們是否滿意。 您如何對此問題進行分類,您將如何解決?

為了它的價值,我用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

基本上我會說,除非約束要復雜得多,或者你想要找到解決方案,而不是僅僅測試我堅持使用代碼而不是約束編程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM