用于推导时间线/年表的算法

时间:2015-01-08 01:33:32

标签: algorithm graph-algorithm

我正在寻找算法上的线索,以推断出一系列小说的时间表/年表。我把文本拆分成几天并创建了一个关系数据库,例如:X是Y,Y和Z连续前的一个月,Z的日期已知,X是星期二,等等。有不确定性( '月'实际上只意味着大约30天),也是矛盾。我可以将某些关系标记为比其他关系更可靠,以帮助解决歧义和矛盾。

从这种数据中推导出最合适的年表,存在哪种算法,为每天分配最高概率的日期?至少时间是一维的,但处理具有不一致性的复杂关系图似乎是非平凡的。我有一个CS背景,所以我可以编写代码,但对适用算法的名称有所了解会有所帮助。我想我所拥有的是一个图表,其中天数作为节点作为边缘关系。

2 个答案:

答案 0 :(得分:0)

约束编程是您所需要的。在基于传播的CP中,您可以在(a)在搜索树中的当前选择点做出决策和(b)尽可能地传播该决策的后果之间进行切换。从理论上讲,您可以通过为每个问题变量D维护一个x个可能值的域来实现此目的,这样D(x)就是x的值集,这些值尚未被排除沿着当前的搜索路径。在您的问题中,您可以将其减少为一大组布尔变量x_ij,如果事件x_ij位于事件i之前,则j为真。最初D(x) = {true, false}表示所有变量。决定只是减少未定变量的域(对于布尔变量,这意味着将其域减少为单个值,true或false,这与赋值相同)。如果搜索路径D(x)中的任何一点在任何x处变为空,那么您已达到死胡同并且必须回溯。

如果您很聪明,您将尝试从每次失败中学习,并根据需要撤回搜索树,以避免冗余搜索(这称为回跳 - for例如,如果您确定您在第7级达到的死胡同是由您在第3级做出的选择引起的,那么仅回溯到第6级就没有意义,因为没有解决方案存在在这个子树中给出你在3级做出的选择!)。

现在,鉴于您对数据有不同程度的信任,您实际上存在优化问题。也就是说,您不只是在寻找满足必须为真的所有约束的解决方案,而是最能满足其他" soft"根据您对它们的信任程度进行约束。您需要做的是决定目标函数为给定的一组满足/违反的部分约束分配分数。然后,当您发现当前搜索路径无法改进以前找到的最佳解决方案时,您希望修剪搜索。

如果你决定采用布尔方法,你可以有利地研究SAT解算器,它解决了这些问题。但我看到的第一个地方是MiniZinc,这是一种CP语言,它映射到各种各样的最先进的约束求解器。

祝你好运!

答案 1 :(得分:0)

对您的问题的简单粗略的第一个近似是存储信息,例如" A发生在B"之前。在有向图中,其边缘类似于" A - > B&#34 ;.测试图表以查看它是否是有向无环图(DAG)。如果是这样的话,信息是一致的,因为在其他事情之前有一致的年代表。您可以通过打印"拓扑排序"来获得样本线性年表。 DAG的(topsort)。如果事件C和D同时发生或者没有信息说明哪一个出现在另一个之前,它们可能会作为ABCD或ABDC出现在topsort中。您甚至可以使用topsort算法打印所有可能性(因此ABCD和ABDC),以便使用更详细的信息进行进一步分析。

如果您获得的图形不是DAG,则可以使用类似Tarjan算法的算法快速识别强连通组件"这些图形区域包含时间顺序矛盾循环的形式。然后,您可以更仔细地分析它们,以确定可以去除哪些不太可靠的边缘来解决矛盾。识别要去除的边缘以消除周期的另一种方法是搜索"最小反馈弧集"。这通常是NP难的,但如果你的强连接组件很小,那么搜索是可行的。