JavaScript – 计算两点之间的最短路径

我在过去几周里一直在使用nodejs和websockets的多人HTML5游戏。

我一直困在这个问题上。
想像一下,我将这个tileheet映射用数组实现(如下图所示)。

1或棕色瓷砖 – 有障碍的方式,玩家不能通过它。

0或绿色瓷砖 – 是允许玩家移动的自由路径。

通过致电:访问地图上的任何瓦片

 array[x][y]

tilesheet map - calculate the shortest route

我想创建最快的算法,以找出地图两点之间的最短路线(如果有的话)。你会如何处理这个问题?我知道这是常见的问题。

例:

位置上的玩家(1,7)用一些AI发射一个子弹,将向位置上的敌方玩家(6,0)发射。子弹必须计算2名选手之间的最短路线,如果没有任何东西只会在墙上爆炸。

题:

如何有效地找到两点之间的最短路线?

最佳答案
这是一个共同的graph theory problem algorithm

StackOverflow文档中的图形算法

In graph theory, the shortest path problem is the problem of finding a
path between two vertices (or nodes) in a graph such that the sum of
the weights of its constituent edges is minimized.

The problem of finding the shortest path between two intersections on
a road map (the graph’s vertices correspond to intersections and the
edges correspond to road segments, each weighted by the length of its
road segment) may be modeled by a special case of the shortest path
problem in graphs.

现在存在这个算法的lot of implementations。更简单的实现是Dijkstra’s algorithm,最差的性能表现为O(| E | | V | log | V |)

> | V |是节点的数量
> | E |是边数

算法工作插图

enter image description here

Dijkstra最短路径算法的定义

>初始节点 – 我们开始的节点。
>节点Y的距离 – 从初始节点到Y的距离。

算法将分配一些初始距离值,并尝试逐步改进:

>为每个节点分配一个暂时的距离值:将其设置为0为我们的初始节点,对于所有其他节点为∞。
>将初始节点设置为current。标记所有其他节点未访问。创建一组称为未访问集的未访问节点。
>对于当前节点,考虑其所有未访问的邻居并计算其临时距离。将新计算的临时距离与当前分配的值进行比较,并分配较小的值。
>当我们考虑当前节点的所有邻居时,将当前节点标记为已访问,并将其从未访问集中移除。将不会再次检查被访问的节点。
>如果目的地节点已被标记为访问(在两个特定节点之间规划路由时),或者未访问集合中的节点之间的最小暂定距离为∞(当计划完整遍历时,则在初始化之间没有连接时发生)节点和剩余的未访问节点),然后停止。算法已经完成。
>否则,选择标有最小暂定距离的未访问节点,将其设置为新的“当前节点”,然后返回步骤3。

 Dijkstra的StackOverflow文档算法

可以在github repository mburst/dijkstras-algorithm上找到更多Dijkstra算法的实现。

例如这里是JavaScript implementation

转载注明原文:JavaScript – 计算两点之间的最短路径 - 代码日志