【问题标题】:How can I define a married couple in Clingo?我如何在 Clingo 中定义已婚夫妇?
【发布时间】:2022-12-12 22:57:49
【问题描述】:

我正在尝试创造 5 对婚姻,给定 5 名女性和 5 名男性以及他们对彼此的偏好。

homem(miguel).
homem(joao).
homem(pedro).
homem(marco).
homem(carlos).

mulher(maria).
mulher(paula).
mulher(carla).
mulher(cristina).
mulher(ana).

所有的婚姻都是稳定的(如果婚姻之外的两个人比他们的配偶更喜欢对方,那是不稳定的),我有他们对彼此的偏好等级:

pref(miguel,paula,5).
pref(miguel,ana,4).
pref(miguel,maria,3).
pref(miguel,carla,2).
pref(miguel,cristina,1).

pref(maria,carlos,5).
pref(maria,miguel,4).
pref(maria,marco,3).
pref(maria,joao,2).
pref(maria,pedro,1).

pref(joao,maria,5).
pref(joao,paula,4).
pref(joao,carla,3).
pref(joao,cristina,2).
pref(joao,ana,1).

pref(paula,marco,5).
pref(paula,carlos,4).
pref(paula,joao,3).
pref(paula,miguel,2).
pref(paula,pedro,1).

pref(pedro,paula,5).
pref(pedro,carla,4).
pref(pedro,ana,3).
pref(pedro,cristina,2).
pref(pedro,maria,1).

pref(carla,miguel,5).
pref(carla,marco,4).
pref(carla,joao,3).
pref(carla,pedro,2).
pref(carla,carlos,1).

pref(marco,maria,5).
pref(marco,carla,4).
pref(marco,paula,3).
pref(marco,cristina,2).
pref(marco,ana,1).

pref(cristina,pedro,5).
pref(cristina,joao,4).
pref(cristina,marco,3).
pref(cristina,miguel,2).
pref(cristina,carlos,1).

pref(carlos,ana,5).
pref(carlos,carla,4).
pref(carlos,paula,3).
pref(carlos,maria,2).
pref(carlos,cristina,1).

pref(ana,marco,5).
pref(ana,joao,4).
pref(ana,pedro,3).
pref(ana,carlos,2).
pref(ana,miguel,1).
casamento(1..5). 

% every person belongs to one group only. 
1{in(H,M): casamento(C)}1 :- homem(H), mulher(M).

:- homem(H1), mulher(M1), homem(H2), mulher(M2), 
      pref(H1,M2,P1),pref(H1,M1,P2), P1>P2,
      pref(M2,H1,P3), pref(M2,H2,P4); P3>P4.

但这不起作用,我不知道为什么。

【问题讨论】:

    标签: answer-set-programming clingo


    【解决方案1】:

    问题1

    规则

    1{in(H,M): casamento(C)}1 :- homem(H), mulher(M).
    

    并不是说“每个人只属于一个群体”,而是“每一对男女都属于一个婚姻。这相当于说每一个男人结婚了每一个女士。

    相反,你应该表达相反的意思:每一段婚姻都应该恰好“产生”一对人:

    1{in(H,M,C): homem(H), mulher(M)}1 :- casamento(C) .
    

    但这并不妨碍一个男人(或女人)属于两个不同的婚姻。所以你还应该添加:

    :- in(H,M1,C1), in(H,M2,C2), C1!=C2 .
    :- in(H1,M,C1), in(H2,M,C2), C1!=C2 .
    

    问题2

    此外,在你的限制下,你正在考虑每一对人(不是每一对已婚人们!)。所以你应该用in(H1,M1,C1), in(H2,M2,C2)替换homem(H1), mulher(M1), homem(H2), mulher(M2)

    固定码

    casamento(1..5) .
    
    1{in(H,M,C): homem(H), mulher(M)}1 :- casamento(C) .
    :- in(H,M1,C1), in(H,M2,C2), C1!=C2 .
    :- in(H1,M,C1), in(H2,M,C2), C1!=C2 .
    
    :- in(H1,M1,C1), in(H2,M2,C2), 
       pref(H1,M2,P1), pref(H1,M1,P2), P1>P2,
       pref(M2,H1,P3), pref(M2,H2,P4), P3>P4 .
    

    该程序(加上您示例中的 EDB)生成以下联姻:

    in(miguel,carla,2) in(marco,paula,3) in(joao,cristina,1) in(carlos,maria,4) in(pedro,ana,5)
    

    可选的

    如果您不想对 5 进行硬编码并使其适用于输入中的任意数量的人,您可以动态计算女性(或男性,假设相同)的数量。

    因此,您可以将 casamento(1..N). 替换为:

    casamento(1..N) :- N = #count{ X : mulher(X) } .
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 1970-01-01
      • 2023-03-03
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多