计算 no.of 以少于 k 步从节点 i 移动到 i 的最佳方式
Optimal way to calculate no.of ways to move from node i to i in less than k steps
我有一个 n*n 无向图。我必须找到在不到 k 步内从某个节点移动到相同节点的方法。我需要一种比 k*n^3 更快的方法。
我会做一个修改版本的 A* 从起始节点回到它本身。您所要做的就是更改结束条件。
因此,不是在到达目标节点后结束,而是在达到 k 步后才结束。你将从 i->i 开始,成本为零,然后根据 A* 扩展子节点。在所有这些后续步骤中,如果您达到了目标,请记录路径;如果你还在k步的限制下,继续扩展节点并在到达i时打印路径。
达到 k 步限制后,结束循环。
编辑:我想我没有解释为什么我会选择 A*。如果您不熟悉 A* (you can read more here),它是一种最佳优先搜索算法。这意味着它将选择可用节点集中的最佳节点来构建路径(最佳意味着到目标的最短距离)。这是基于访问节点的已知成本和对目标距离的猜测(通常使用欧几里德距离完成)。
我认为 A* 对这个问题很好的原因是因为你已经知道你已经达到了目标,所以它本质上是在为你倒退,寻找下一个最佳路径,直到你告诉它停止或它扩展了图中的所有节点。
我有一个 n*n 无向图。我必须找到在不到 k 步内从某个节点移动到相同节点的方法。我需要一种比 k*n^3 更快的方法。
我会做一个修改版本的 A* 从起始节点回到它本身。您所要做的就是更改结束条件。
因此,不是在到达目标节点后结束,而是在达到 k 步后才结束。你将从 i->i 开始,成本为零,然后根据 A* 扩展子节点。在所有这些后续步骤中,如果您达到了目标,请记录路径;如果你还在k步的限制下,继续扩展节点并在到达i时打印路径。
达到 k 步限制后,结束循环。
编辑:我想我没有解释为什么我会选择 A*。如果您不熟悉 A* (you can read more here),它是一种最佳优先搜索算法。这意味着它将选择可用节点集中的最佳节点来构建路径(最佳意味着到目标的最短距离)。这是基于访问节点的已知成本和对目标距离的猜测(通常使用欧几里德距离完成)。
我认为 A* 对这个问题很好的原因是因为你已经知道你已经达到了目标,所以它本质上是在为你倒退,寻找下一个最佳路径,直到你告诉它停止或它扩展了图中的所有节点。