我正在为路径搜索和演绎棋盘游戏建模,练习我在学校学习的一些概念。这是我为您分析图表的第一次尝试,我希望得到一些关于什么样的数据结构可能适合我想做的事情的建议。
我正在建模的游戏呈现为一系列约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和#34;)会让我想要从上面修剪树""通过分支机构向下穿过,并切断任何被揭示信息无效的分支。
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")
在我看来,天真的树方法将是一个混乱的命题,所以我想我会就这里使用的最佳数据结构提出任何建议或建议,或者如何更好地解决问题。
答案 0 :(得分:0)
为您的案例提供建议真的很难,因为任何优化都应该先进行分析。听起来你需要某种类型和/或关联矩阵的bitset。对于BitSet,您可以使用Batteries implementation或使用Zarith library使用OCaml任意精度数字来实现自己的。对于关联矩阵,您可以选择琐碎的_ array array
,使用Bigarray模块,或者再次使用Zarith并使用按位运算实现您自己的高效表示。
如果我是你,我将从定义你需要的抽象(即接口)开始,然后从实现中删除,然后通过替换实现来基于实际输入进行优化。