【问题标题】:What is the best data structure to model a path through an undirected graph?对通过无向图的路径进行建模的最佳数据结构是什么?
【发布时间】:2018-05-14 03:06:46
【问题描述】:

我正在为路径搜索和推理棋盘游戏建模,以练习我在学校学习的一些概念。这是我第一次尝试分析图表,我希望能得到一些关于哪种数据结构可能适合我正在尝试做的事情的建议。

我正在建模的游戏呈现为一系列约 200 个相互连接的节点,如下所示。给定对手的已知起始位置(例如,下图中的节点 84),目标是识别对手藏身之处的可能位置。对手远离 84 的举动,自然是未知的。

Fig 1 - Illustrative Sub-Graph with Adversary Initial Position at Node 84

最初,这会导致如下情况。鉴于对手从 84 开始,他/她在第一次回合后只能处于 66、86 或 99。以此类推。

Fig 2 - Possible Locations for Adversary after 1, 2 and 3 Turns (Based on Fig 1 Graph)

到目前为止,我已将板本身建模为无向图 - 使用 OCaml 的 ocamlgraph 库的实现。我现在要做的是通过图对对手采取的路径进行建模,以便在每次转弯后识别对手的潜在位置。

虽然便于说明,但上图暗示的树表示有几个缺点:

首先,跟踪通过网络的所有可能路径是不必要的(我只关心对手藏身之处的终端位置,而不是所走的路径)而且很繁琐:每个节点平均连接到大约 7 个其他节点.等到我们结束游戏的 15 回合时,已经有很多分支了!

其次,我怀疑修剪也会成为一个问题。事实上,这里的部分练习是最大限度地利用随着游戏进行而揭示的关于对手动作的有限信息。该信息要么表明攻击者“从未到过节点 X”,要么“之前访问过节点 X”。

第一种类型的信息(例如“对手从未到过节点 65”)会导致我想要“从上方”修剪树,方法是向下穿过树枝并切断任何被揭示无效的树枝信息。

Fig 3 - Pruning from the Top ("Adversary Has Never Been to Node 65")

但是,第二种类型的信息(例如“对手已访问节点 100”)会邀请“从下方”修剪以切断任何与信息不一致的分支。

Fig 4 - Pruning from the Bottom (e.g. "Adversary Has Visited Node 100")

在我看来,幼稚的树方法将是一个混乱的命题,所以我想我会就此处使用的最佳数据结构或如何更好地解决问题寻求任何建议或建议。

【问题讨论】:

  • 您描述的两种修剪策略似乎并不关心顺序。因此,您可以用集合而不是树来表示不同的路径。您将有很多集合而不是很多分支,但是修剪操作会更快一些。值得注意的是,通过减少重复,您会有所收获。

标签: ocaml graph-theory modeling 2d-games


【解决方案1】:

很难为您的案例提供建议,因为任何优化都应该在分析之前进行。听起来您需要某种类型的位集和/或关联矩阵。对于 BitSet,您可以使用 Batteries implementation 或使用 OCaml 任意精度数字和 Zarith library 实现您自己的。对于关联矩阵,您可以选择简单的_ array array,使用 Bigarray 模块,或者再次使用 Zarith 并使用按位运算实现您自己的高效表示。

如果我是你,我会从定义你需要的抽象(即接口)开始,然后从实现的下降开始,然后通过替换实现基于实际输入进行优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多