【发布时间】: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