4 个版本 (2 个重大更新)

新增 0.7.5 2024 年 8 月 20 日
0.7.4 2024 年 6 月 26 日
0.7.3 2024 年 5 月 13 日
0.7.1 2024 年 3 月 11 日
0.3.2 2022 年 6 月 28 日

#220数据结构

Download history 118/week @ 2024-05-01 208/week @ 2024-05-08 231/week @ 2024-05-15 67/week @ 2024-05-22 60/week @ 2024-05-29 171/week @ 2024-06-05 66/week @ 2024-06-12 71/week @ 2024-06-19 221/week @ 2024-06-26 20/week @ 2024-07-03 126/week @ 2024-07-24 61/week @ 2024-07-31 350/week @ 2024-08-07 126/week @ 2024-08-14

663 每月下载量

MIT 许可证

180KB
4K SLoC

chronologic

本软件包致力于处理时间推理。它处理时间约束,传播它们并维护一个与用户约束一致的所有可能日期的议程。

它被设计用来高效管理数千个瞬间,例如用于规划或调度问题。

时间结构

提供多种时间结构(区间、集合)以简化时间操作。

此时间数据定义了多个操作符,用于并集、交集和两种方式的平移

  • 通过使用标准操作符(交集使用 &,并集使用 |,平移使用 +/-
  • 通过使用迭代器特性(请参阅模块 iter),允许以节省内存分配的方式进行时间操作(不需要中间结构)

如果我们想检查三个时间集 I、J、K 是否满足 (I u J)&K 为空,我们可以通过以下操作符进行

if ((I | J) & K).is_empty() { ... }

但是使用迭代器特性可能更高效,因为不需要构建中间时间集

I.into_iter().union(J).intersection(K).is_none()

graph 模块处理时间约束图,主要提供两种结构

  • graph::TimeGraph:时间约束图,时间约束定义为两个瞬间之间的持续时间间隔,可以将图视为时间约束的集合
  • graph::TimeScheduler:调度器根据其时间图维护一个槽位集合(每个瞬间一个槽位)

时间约束管理

图表示为一个 (Max,+) 正方形矩阵。

此矩阵用于实现时间约束图,如下所示:单元格(i,j)表示从这一刻i到这一刻j的时间约束的下限。请注意,在这种情况下,对角线填充了0元素。

全局传播算法

我们使用Floyd-Warshall路径一致性算法[3]:我们通过探索它们之间的每条路径来计算两个节点之间的最小距离。换句话说,我们提取出约束更多的路径。

实际上,由于图的完备性,这项任务并不困难:在这种情况下,我们知道局部一致性保证了全局一致性。因此,我们只需研究三个节点的所有路径(约束的端点和任何中间节点)[2]。

一个可能的算法是迭代此计算,直到约束保持稳定。另一个算法提议传播的时间复杂度为O(n3),其中n是图的大小[1]。

增量传播算法

为了向用户提供有用的反馈,我们使用一个派生算法,该算法逐个传播约束,每一步的复杂度为O(n2)。因此,在最坏的情况下,我们达到的复杂度为O(n4)(因为最坏的情况是对于每个节点对都有一个约束,所以n2个约束)。

参考文献

  1. C. Dousson. 《进化监控与编年史识别》博士论文(法语),计算机科学,人工智能,保罗·萨巴蒂埃大学,图卢兹(1994)
  2. U. Montanari. 《约束网络:基本性质及其在图像处理中的应用》信息科学7,1974,第95-132页。
  3. C.H. Papadimitriou和K. Steiglitz. 《组合优化:算法与复杂性》普伦蒂斯-霍尔,恩格尔伍德克利夫斯,新泽西州1982。

依赖关系

~3MB
~57K SLoC