找到2D阵列中最短的方法

时间:2014-03-23 12:28:38

标签: algorithm path-finding

我正在寻找一种算法,可以让我找到各点之间的最短路径' T'和' C'。

##############################
#.....T........###############
#.......................#.#..#
#.#######################.#..#
#.....##......##......#....###
#...####..##..##..##..#..#...#
#.........##......##.....#.C.#
##############################

我最近被介绍过这类问题。 我在这里找到了一个几乎类似的问题,这个问题是用李算法解决的,但不能用于我的情况。

其他一些朋友建议我使用递归算法,但我仍然不熟悉。

您能否概述一下如何解决这个问题以及应该采用何种算法?

2 个答案:

答案 0 :(得分:6)

您尝试解决的问题称为path finding


推荐的算法之一是A*

在A *中,单元格的值是两部分的总和 - 到达该单元格所需的实际成本,以及从该单元格到达目的地的预期成本(称为'启发式&#39 )。对于启发式,我们可以简单地使用名为the Manhattan distance的东西,这是x中的差异加上y的差异。

然后想法保留priority queue个可能的候选人(我们可以保留一个单元格的坐标,以及到达那里的路径,代表候选人),让我们选择一个期望在每一步都处于最短路径。然后我们从这个优先级队列中的源单元开始,然后我们删除最小值,检查它是否是目的地,然后将所有未探测的邻居添加回优先级队列,并继续这样直到我们得到到目的地。

为了跟踪未探测的邻居,我们可以保持相同大小的布尔矩阵,初始化为所有假值,并且如果它被探索则将每个值设置为true(然后显然检查相应的单元格是否设置为true检查细胞是否被探查过。)


另一种推荐的方法是Dijkstra's algorithm,但实际上这对于加权图(其中两个步骤可能有不同的成本),尽管它也适用于此。我们实际上更喜欢breadth-first search (BFS),这可以被认为是Dijkstra算法的一个特例。

在BFS中,我们保留一个queue由所有可能的候选者组成,然后从队列中出列一个元素,检查它是否是目的地,并将所有未探索的邻居排队,并继续这种方式直到我们到达目的地。


Dijkstra的算法/ BFS将是更简单的方法,但也需要更长的时间才能找到最短的路径。

你必须小心A *,因为选择一个不是'admissible'的启发式(意味着它可能会高估目的地的成本)会有问题 - 但上面提到的曼哈顿距离并不是#39; t有这个问题。

(动画由维基百科提供)

答案 1 :(得分:2)

这个想法是在一步中填写你可以从T到达的所有点,并记录下这些点;那么你可以通过两个步骤达到所有点,依此类推,直到你达到C.

标记您访问的所有点,并保留以K步骤到达的列表。扫描列表,标记所有未访问的邻居并更新列表以形成“K + 1”列表。

##############################
#54321T12345678###############
#65432123456789012345678#5#..#
#7#######################4#..#
#89012##901234##123456#1234###
#901####89##45##01##67#12#567#
#012345678##567890##78901#6C.#
##############################

在给定的例子中,C以47个步骤到达,四个点无法到达,一个在C之后到达。