通过没有终点的特定顶点的路径

Path through specific vertices without an end point

我正在尝试编写解决一种迷宫的算法。它可能看起来像这样:

玩家角色是红色圆圈,目标是收集所有蓝色方块。玩家可以向上、向下、向左或向右移动,但只有在撞到墙壁时才会停止。 我首先将迷宫转换成图表(space 到 space,然后找到我可以从那里移动到的其他 space)。蓝色方块成为边缘的属性(一点和另一点之间的路径)。现在我需要一个算法来找到穿过所有带有蓝色方块的边的最短路径。希望有人能帮忙。

以下是我对问题建模的方式:

让我们创建一个有向图,其节点对应于带有蓝色方块的单元格,以及一个附加节点,即玩家的初始位置(红点)。让我们在每对节点 A 和 B 之间创建一条边,其权重等于它们之间的曼哈顿距离(在网格中相互到达的步数),因此从 A 到 B 和从 B 到 A 的两条边具有相同的权重除了对应于玩家初始位置的节点(我们称它为 X)和蓝色方块之间的边,从 X 到所有其他节点的边都是按照前面提到的相同方式构建的,但是从所有节点到 X 的边必须具有相等的权重到0,因为我们不必真正return到初始位置,我们只需要穿过所有蓝色方块并在任何位置完成即可。

现在你的问题变成了一个众所周知的问题TSP (Traveling Salesman Problem),这个问题要求找到一个最小权重的哈密顿循环,哈密顿循环是从某个节点开始并恰好通过所有节点一次的循环,环的权重是其中节点之间的边权重之和。

这个问题有一个蛮力解决方案,您可以遍历节点的所有可能排列并选择给出最小权重的那个。此解决方案在 O(N!) 中运行。

此问题的另一种解决方案是使用带位掩码的动态规划,其运行时间为 O(2^N * N^2)。