prolog中对称解的剪枝

prolog中对称解的剪枝,prolog,Prolog,假设我们想在nativeprolog中编写谓词schedule/6,在给定作业列表的情况下,为N个工人创建一个时间表,其中每个工人最多可以工作H小时 作业表示为: job(Name, time(StartTime, EndTime)) prolog源代码可能如下所示:(假设overlapping/3检查某个作业是否与当前分配的作业重叠) 表明哪个人接受了哪个工作。 通过请求更多的解决方案,谓词生成下一个可能的排列 问题是,如何防止它显示对称解? 例如,如果输入作业列表为 [ job(a1, t

假设我们想在nativeprolog中编写谓词schedule/6,在给定作业列表的情况下,为N个工人创建一个时间表,其中每个工人最多可以工作H小时

作业表示为:

job(Name, time(StartTime, EndTime))
prolog源代码可能如下所示:(假设overlapping/3检查某个作业是否与当前分配的作业重叠)

表明哪个人接受了哪个工作。 通过请求更多的解决方案,谓词生成下一个可能的排列

问题是,如何防止它显示对称解? 例如,如果输入作业列表为

[ job(a1, time(0,3)), job(a2, time(4,6)), job(a3, time(1,2)) ]
然后,以下调用的一些输出将是:

schedule(2,1, 10, [ job(a1, time(0,3)), job(a2, time(4,6)), job(a3, time(1,2)) ], Schedule).

Schedule = [1 - a1, 1 - a2, 2 - a3]

;

Schedule = [2 - a1, 2 - a2, 1 - a3]
但这两种解决方案被认为是对称的。
在本机prolog中不使用setof/3是否可以做到这一点?(对于大型问题,这会很麻烦)。

您的问题中没有具体的问题。
[1-a1,1-a2,2-a3]
[2-a1,2-a2,1-a3]
被认为是对称的吗?这是显而易见的,并且<代码> SET/3 也不会认为它们是相同的。如果两个参数是对称的,也许你需要一个成功的规则?然后你可以用它来建立你的解决方案列表,避免对称的解决方案。@lower这就是我在写这篇文章之前所做的。我这样做是为了让我的参数返回一个列表的排序列表,表示解决方案(每个内部列表表示一个人的分配),然后setof/3会在找到所有解决方案后自动将其删除。当涉及到大问题时,这是非常有问题的。我想要的是一种在递归谓词中删减所说的解决方案的方法,以避免实际上必须找到每个解决方案。通常,您希望在选择过程中尽可能快地删减。我不确定你的对称性标准是什么,所以具体适合你的问题取决于这个。
[ job(a1, time(0,3)), job(a2, time(4,6)), job(a3, time(1,2)) ]
schedule(2,1, 10, [ job(a1, time(0,3)), job(a2, time(4,6)), job(a3, time(1,2)) ], Schedule).

Schedule = [1 - a1, 1 - a2, 2 - a3]

;

Schedule = [2 - a1, 2 - a2, 1 - a3]