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

时间:2013-10-05 10:50:06

标签: prolog logic-programming

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

  • 每个消费者都有一组他们可以使用的资源类型,
  • 每个资源都是唯一的,
  • 每个消费者必须收到n> 0个资源
  • 必须分发所有资源。

电子。 G。我们有这个消费者名单和他们的偏好:

  • 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程序是微不足道的,但我想要的是一个可以解决任何此类问题的通用程序,或者告诉我没有针对给定数据的解决方案。

我应该在哪里查看,我应该google什么,此问题是否有名称?

1 个答案:

答案 0 :(得分: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相对于标准术语顺序提升,因此如果它回答{{1}则没有(进一步)解决方案}。