这个Prolog谓词如何比指数谓词更快?

这个Prolog谓词如何比指数谓词更快?,prolog,Prolog,我有一个谓词,它将检查一个房间是否在给定的时间表(由事件组成)内可用 检查房间是否可用且未被其他事件占用目前正在以指数方式工作。我想对此进行优化 我目前正在做的是: 我取第一个事件,验证它是否与任何其他事件重叠。然后我取第二个事件,我验证它没有与任何其他剩余事件重叠。依此类推,直到列表为空 我一直在考虑这个问题,但我认为要使它更有效,唯一的办法就是使用断言 我想知道除了使用资产,是否还有其他方法可以提高效率?最优调度肯定是一个指数问题。这类似于最佳的箱子包装。这是一个完整的研究领域 在我看来,你

我有一个谓词,它将检查一个房间是否在给定的时间表(由事件组成)内可用

检查房间是否可用且未被其他事件占用目前正在以指数方式工作。我想对此进行优化

我目前正在做的是:

我取第一个事件,验证它是否与任何其他事件重叠。然后我取第二个事件,我验证它没有与任何其他剩余事件重叠。依此类推,直到列表为空

我一直在考虑这个问题,但我认为要使它更有效,唯一的办法就是使用断言


我想知道除了使用资产,是否还有其他方法可以提高效率?

最优调度肯定是一个指数问题。这类似于最佳的箱子包装。这是一个完整的研究领域

在我看来,你所做的是O(n2):你将列表中的每个元素与列表中的每个其他元素进行比较。但是您只做了一次,因为您要比较列表中该元素之后的每个元素。所以元素1和N-1其他元素进行比较,但是元素N-1只和1其他元素进行比较。对于您的问题来说,这并不是一个荒谬的时间复杂性

一种方法可能是一种显著的改进,因为您实际上不会将每个元素与每个其他元素进行比较。这将最坏情况下的时间复杂度降低到O(N logn),这被认为是一个相当大的改进,假设您的事件集足够大,从而可以降低使用平衡树的恒定因子成本

但我怀疑这并不是性能问题所在。你可能不想要你能建立的第一个时间表,你可能想看看你能制定的冲突最少的时间表,这将意味着尝试不同的排列。这是你的算法真正遇到麻烦的地方,不幸的是,这是我知识枯竭的地方;我不知道如何进一步优化这个过程。但我知道,有很多关于流程理论和调度理论的著作,如果你想找的话,它们可以帮助你

我不认为您的问题归结为需要更好地使用某些Prolog技术,例如动态存储。但是,您可以随时分析您的代码,并查看它在哪里花费时间,也许我们可以解决一些悬而未决的问题


为了更进一步,我认为我们需要更多地了解您的问题。

使用断言如何使其性能更好?当断言了大量事实时,如果要查看新查询是否匹配,Prolog仍然必须搜索它们。所以它并没有真正摆脱根本的指数问题。如何确定“重叠”?是否有“重叠”属性允许您跳过某些重叠检查,而知道其他重叠检查的结果?Prolog程序倾向于遵循生成测试周期。如果您对您的程序进行基准测试,您通常会发现其中一个方面效率低下:要么生成太多的可能性进行检查,要么检查成本太高。这听起来像是后一种情况,您可以通过更丰富的数据结构来改善这种情况——也许?了解事情需要多长时间,处理多少房间和事件可能会有所帮助。