combinatorics - 生成候选解决方案以在 Clingo/ASP 中匹配人员

标签 combinatorics answer-set-programming clingo

我有一个人员列表,我想将他们全部配对,然后根据偏好进行一些过滤。当我生成候选解决方案时,如何避免创建重新配对人员的候选解决方案。

例如:

person(a;b;c;d) .
{match(X, Y): person(Y)}1 :- person(X) .

这会生成候选解决方案,其中包括 match(a,b) match(c,b) ...

我只想要不重新匹配任何人的候选解决方案,例如:match(a,b) match(c,d) ...

我的目标是不必通过额外的限制来过滤重新匹配。此外,并不是每个人都需要匹配。谢谢!

最佳答案

person(a;b;c;d).
{match(A,B) : person(A), person(B), A < B}.
:- person(A), 1 < {match(A,B); match(B,A)}.

您排除与单个人匹配超过 1 个的解决方案。

在没有附加约束的情况下,不可能简单地选择一组正确的原子。由于 match(a,b)match(b,c) 可能出现在不同的答案集中,因此需要创建这两个变量。只有一个约束才能排除两者不会出现在同一答案集中。

另请注意您的生成器规则

{match(X, Y): person(Y)}1 :- person(X) .

已经是一个快捷方式编写

{match(X, Y): person(Y)} :- person(X).
:- person(X), 2 {match(X, Y): person(Y)}.

因此,只要您的生成器选择规则具有非平凡的边界,您就已经在使用约束了。

PS:使用 --stats=2 检查不同版本的约束计数,使用 --text 检查生成的约束类型的粗略近似值。

关于combinatorics - 生成候选解决方案以在 Clingo/ASP 中匹配人员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67994887/

相关文章:

Julia:具有唯一整数的 Vector 的 `n` 条目的所有可能总和(有重复)

algorithm - 如何计算第 n 个排列(或告诉给定排列的字典顺序)?

logic - 如何在答案集编程中表示要推理的未知知识?

answer-set-programming - 使用答案集编程的 N 皇后问题

PHP 嵌套数组组合/排列

algorithm - 在矩阵中查找 k 组不相交的行

java - 使用 Runtime.exec() 从 Java 程序运行 ASP 程序时出现问题

answer-set-programming - 生成区间信息的问题

answer-set-programming - clingo 中的聚集体