【问题标题】:Algorithms for Deducing a Timeline / Chronology推导时间线/年表的算法
【发布时间】:2015-03-06 01:34:50
【问题描述】:

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

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

【问题讨论】:

  • 基本上,我相信您在谈论基于约束的编程,其中包含概率。类似this?
  • 谢谢;这为我提供了很多跟进的线索。如果我能找到要点击的刻度线,我会将此标记为“已回答”。
  • 虽然这不是一个很好的答案,即使它引导你朝着正确的方向前进。随意在您自己的答案中总结您的发现,并检查;我相信它会比我现在做的更详细。

标签: algorithm graph-algorithm


【解决方案1】:

您需要的是约束编程。在基于传播的 CP 中,您在 (a) 在搜索树中的当前选择点做出决策和 (b) 尽可能传播该决策的后果之间交替进行。从概念上讲,您可以通过维护每个问题变量x 的可能值的域D 来做到这一点,这样D(x)x 的值集,这些值尚未沿当前搜索路径被排除。在您的问题中,您可以将其简化为一大组布尔变量x_ij,其中x_ij 为真,如果事件i 早于事件j。最初 D(x) = {true, false} 用于所有变量。决策只是减少未决定变量的域(对于布尔变量,这意味着将其域减少为单个值,真或假,这与赋值相同)。如果在搜索路径上的任何点D(x) 对任何x 都为空,则您已经走到了死胡同,必须回溯。

如果你很聪明,你会尝试从每次失败中学习,并尽可能向后退到搜索树以避免冗余搜索(这被称为 backjumping - 例如,如果您确定您在第 7 级到达的死胡同是由您在第 3 级所做的选择造成的,那么回溯到第 6 级是没有意义的,因为在这个子树中没有解决方案存在选择你在第 3 级成功!)。

现在,鉴于您对数据的信心程度不同,您实际上遇到了优化问题。也就是说,您不仅要寻找一种满足所有必须为真的约束的解决方案,而且还要根据您的信任程度最好地满足其他“软”约束他们。您需要在这里做的是决定一个目标函数,将分数分配给给定的一组满足/违反的部分约束。然后,每当您发现当前的搜索路径无法改进之前找到的最佳解决方案时,您就想修剪您的搜索。

如果您确实决定采用布尔方法,您可以研究 SAT 求解器,它可以解决这些问题。但我首先要看的是MiniZinc,这是一种映射到各种最先进的约束求解器的 CP 语言。

祝你好运!

【讨论】:

    【解决方案2】:

    对您的问题的一个简单、粗略的初步近似是将诸如“A 发生在 B”之类的信息存储在具有“A -> B”之类的边的有向图中。测试该图以查看它是否是有向无环图 (DAG)。如果是,则信息是一致的,即在发生其他事情之前存在一致的年表。您可以通过打印 DAG 的“拓扑排序”(topsort)来获得样本线性年表。如果事件 C 和 D 同时发生,或者没有信息可以说明哪个在另一个之前发生,它们可能会以 ABCD 或 ABDC 的形式出现在顶部排序中。您甚至可以获取 topsort 算法来打印所有可能性(包括 ABCD 和 ABDC),以便使用更详细的信息进行进一步分析。

    如果你得到的图不是DAG,你可以使用Tarjan算法等算法快速识别出“强连通分量”,即图中包含循环形式的时序矛盾的区域。然后,您可以更仔细地分析它们,以确定可以删除哪些不太可靠的边缘来解决矛盾。另一种识别边缘以消除循环的方法是搜索“最小反馈弧集”。这通常是 NP 难的,但如果您的强连接组件很小,则搜索可能是可行的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 2016-02-05
      • 2013-05-29
      • 1970-01-01
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多