【问题标题】:Logic programming: how to distribute resources among consumers?逻辑编程:如何在消费者之间分配资源?
【发布时间】:2015-07-04 16:19:55
【问题描述】:

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

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

E. G。我们有这个消费者列表和他们的偏好:

  • 答:{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 logic-programming


    【解决方案1】:

    这是一个无穷无尽的资源分配任务的例子,逻辑编程确实非常适合并经常使用。相关任务在文献中被称为运输和分配问题,尽管这个公式中的细节有所不同。将此 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,则没有(进一步的)解决方案。

    【讨论】:

    • 谢谢!它做我想做的事。
    猜你喜欢
    • 1970-01-01
    • 2016-01-21
    • 2018-11-16
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多