如何使用NODE GRAPH与Dijkstra的最短路径一起使用?

时间:2012-07-29 09:31:18

标签: c++ graph dijkstra

我正在使用Dijkstra的算法并找到了许多关于它的网站和代码片段,并认为我能够掌握它,但我没有找到关于如何构建图形本身的信息。也许我不知道谷歌搜索的正确术语,但我找不到任何关于如何构建自己的图形的信息。

我正在制作一个学习项目,一个小型的c ++吃豆人游戏,并希望使用这个算法来控制跟随pac-man的幽灵。我有一个地图(位图),并希望在迷宫的每个交叉点放置一个“节点”。

我该怎么做?这是我无法理解的。如何构建图表本身?

是否有可视图形编辑器?任何建议都会很棒。

3 个答案:

答案 0 :(得分:2)

您可以将网格视为图形,并且可以使用图形显示搜索空间表示:

Picture of how a grid is like a graph

块A,B,C,D是图的节点,节点之间的权重可以表示节点之间的路径距离。

答案 1 :(得分:1)

图形可以通过编程方式定义,常见的表示形式如下所述。(注意:对于djiksta的算法,您还需要存储各种边的权重)。 例如,图表A连接到B(权重= 5),B连接到C(权重= 1)。

1)邻接列表:用于将边表示为列表,并且更常用于稀疏图。 它将具有A-> B(5)和B-> C(1)。 (它可以按主题表示为链表的数组,其中链表的每个节点都存储了传出的顶点标识和权重)

2)邻接矩阵: 它将具有定义为:

的二维矩阵
    A B C
A   0 5 0
B   0 0 1
C   0 0 0

编辑:您可以在图表的this topcoder tutorial系列中找到更多详细信息:第1部分讨论图表表示,第3部分讨论dijksta算法。

答案 2 :(得分:0)

这都是抽象的。因此,我将描述我在Android游戏中如何做图形。最终你可以随意定义它,但这是我的实现。

有一点背景,游戏是塔防,图表代表敌人从源头到水槽的路径。对我来说,为我的模型编写Dijkstra的算法并不需要太多。我有3个主要课程:GraphNodeConnection

Graph是主要对象。它包含节点列表和Connections列表。此类包含addConnection(Node n1, Node n2, int magnitude)(这是我实际构建图表的方式),getAllSinks()getAllSources()getNeighbors(Node n)等方法(返回与参数共享连接的所有节点)节点)。这可能是findShortestPath(Node start, Node stop)方法的用途。

由于这是游戏,因此Node在屏幕上显示其位置的X和Y.节点还有一个NodeType,它是Source,Sink和Normal(以及其他与游戏相关的用途,如塔)的枚举。 dijkstra不需要NodeType。

我的Connection是从一个节点到另一个节点的1对1链接,它是双向的。如果你区分两个Node端点,你可以使它具有方向性,我只是不需要在我的游戏中这样做。 Connection存储连接的权重。在我的情况下,我将图形加权为距离来源的距离,因此敌人总是可以尝试采用“最重”的路径来尝试将其设置为接收器,例如塔防的路径尽头。重量可以是距离或任何你想要的东西。此类包含getOtherEndpoint(Node n)getBothEndpoints()getWeight()等方法。

所有这些课程都是我自己的建筑。他们不会继承任何东西。您可以按照您想要的方式构建它们,并将您需要的任何信息绑定到图形的任何部分。这只是我在Java中的实现。你可以用C ++做同样的事情,如果你想要,或者如果你受到启发而自己写作,那么我就不会把它当作糟糕的。