Prolog 逻辑编程:如何在消费者之间分配资源?

Prolog 逻辑编程:如何在消费者之间分配资源?,prolog,logic-programming,Prolog,Logic Programming,我有一项任务,我必须在消费者之间分配独特的资源。规则是: 每个使用者都有一组他们可以使用的资源类型 每种资源都是独一无二的 每个使用者必须接收n>0个资源 必须分配所有资源 例如。我们有以下消费者及其偏好列表: A:{X,W} B:{X,Y,V} C:{X,Z} D:{Z} 我们有一个资源列表:[X,W,Y,V,Z] 如果我们通过迭代消费者列表并向他们提供其集合中的第一个可用资源来天真地分配资源,那么我们在D上失败,因为唯一的Z已经分配给C。更好的解决方案是:A(W),B(Y,V),C(

我有一项任务,我必须在消费者之间分配独特的资源。规则是:

  • 每个使用者都有一组他们可以使用的资源类型
  • 每种资源都是独一无二的
  • 每个使用者必须接收n>0个资源
  • 必须分配所有资源
例如。我们有以下消费者及其偏好列表:

  • A:{X,W}
  • B:{X,Y,V}
  • C:{X,Z}
  • D:{Z}
我们有一个资源列表:[X,W,Y,V,Z]

如果我们通过迭代消费者列表并向他们提供其集合中的第一个可用资源来天真地分配资源,那么我们在D上失败,因为唯一的Z已经分配给C。更好的解决方案是:A(W),B(Y,V),C(X),D(Z)

在我看来,这是一个逻辑编程问题!虽然编写一个为这种特殊情况提供解决方案的Prolog程序很简单,但我想要的是一个能够解决任何此类问题的通用程序,或者告诉我给定数据不存在任何解决方案


我应该看哪里,我应该搜索什么,这个问题有名字吗?

这是一个例子,说明了各种各样的资源分配任务,逻辑编程确实非常适合并且经常使用。相关的任务在文献中被称为运输和分配问题,尽管这个公式中的细节有所不同。考虑这个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
的第一个参数是消费者偏好表的成对列表,第二个参数是资源列表。它将此实例描述与成对的解决方案相关联
消费者分配的资源
。使用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

谢谢!它做了我想做的事情,就没有(进一步的)解决方案了。