2013-10-05 44 views
4

我有一個任務,我必須在消費者中分配獨特的資源。規則是:邏輯編程:如何在消費者之間分配資源?

  • 每個消費者都有一套他們可以使用的資源類型,
  • 每個資源是獨一無二的,
  • 每個消費者必須接受N> 0的資源,
  • 所有資源必須分配。

E. g。我們的消費者和他們的喜好名單:

  • 答:{X,W}
  • B:{X,Y,V}
  • C:{X,Z}
  • d: {Z}

我們有一個資源列表:[X,W,Y,V,Z]。

如果我們通過迭代消費者列表並通過向其提供第一個可用資源來分配資源,那麼我們就會因爲只有Z已經分配給C而失敗。更好的解決方案是:A( W),B(Y,V),C(X),D(Z)。

對我來說看起來像是一個邏輯編程問題!雖然編寫一個Prolog程序爲這個特殊情況提供解決方案是微不足道的,但我想要的是一個能夠解決任何此類問題的通用程序,或者告訴我對於給定數據不存在解決方案。

我應該在哪裏看,我該怎麼谷歌,這個問題有一個名字?

回答

4

這是一個無數種資源分配任務的例子,其邏輯編程確實非常適合並且經常使用。相關任務在文獻中被稱爲運輸和分配問題,儘管這個公式中的細節是不同的。考慮這個Prolog的配方,使用它可以解決這樣的任務工作的出發點:

distribution([], [], []). 
distribution([C-Ps|CPs], Rs0, [C-As|CAs]) :- 
     allocation(Ps, As, Rs0, Rs1), 
     As = [_|_], 
     distribution(CPs, Rs1, CAs). 

allocation(_, [], Rs, Rs). 
allocation(Ps0, [A|As], Rs0, Rs) :- 
     select(A, Ps0, Ps1), 
     select(A, Rs0, Rs1), 
     allocation(Ps1, As, Rs1, Rs). 

distribution/3預計作爲第一個參數對形式Consumer-Preferences的列表,並作爲其第二個參數的資源列表。它將此實例描述與Consumer-Allocated resources對形式的解決方案相關聯。與SWI-Prolog的例子查詢具體的任務,您指定:

?- distribution([a-[x,w],b-[x,y,v],c-[x,z],d-[z]], [x,w,y,v,z], Ds). 
Ds = [a-[w], b-[y, v], c-[x], d-[z]] ; 
Ds = [a-[w], b-[v, y], c-[x], d-[z]] ; 
false. 

你可以使用這個配方的所有這類任務。該公式是完成:它報告所有存在的解決方案(有些是冗餘的,因爲分配的資源可能以任何順序陳述,正如您在上面的示例中已經看到的;您可以在allocation/4中引入對稱性破壞約束來避免這種情況 - 解決此問題的一種方法是堅持As相對於標準術語順序是上升的),因此如果它回答false,則不存在(進一步)解決方案。

+0

謝謝!它做我想要的。 –

相關問題