如何修改递归算法以找到最短路径?

https://vimeo.com/70999946

我实现了一个递归路径查找算法。这个递归算法基于预设的相互连接的节点工作。每个节点都有四个指针,包含进一步的方向:上、下、左、右。递归算法只是简单地遍历每个节点,并依次查找这四个方向中的每一个,以达到其最终目的地;举个例子,考虑以下7个节点:A、B、C、D、E、F、G、H。

    A (下->D, 右->B)    B (右->C, 左->B)    C (左->B)    D (下->G, 右->E, 上->A)    E (右->F, 左->D)    F (左->E)    G (右->H, 上->D)    H (左->G)

这些节点在整体视图中将显示以下图形。

A—B—C|D—E—F|G—H

在这个例子中,假设行走者从节点A开始,并希望到达节点H作为其最终目的地。节点A按顺序查看自己的右、下、左、上;它的右侧指向节点B,因此它选择前往节点B;节点B以相同的方式选择前往其右侧的节点C。当行走者到达节点C时;由于其右、上、下都被阻塞,节点C返回到节点B。同样,节点B返回到节点A。行走者再次回到起点。然后,节点A根据顺序前往其下方的节点;这意味着它前往节点D。节点D前往其右侧的节点E,然后是节点F。由于节点F被阻塞;它返回到节点E和节点D。之后,节点D根据行走者的顺序选择前往其下方的节点G。从那里节点G前往节点H。最终,行走者到达其最终目的地。

伪代码:递归路径查找算法ArrayList findPath(GameObject currentPoint , GameObject targetPoint , ArrayList InputArrayList){1-复制InputArrayList为tempArrayList2-如果currentPoint等于targetPoint返回inputArrayList//*** 找到目标的结束条件3-如果currentPoint的右侧为空跳到步骤43.1-将currentPoint添加到tempArrayList//*** 调用右侧3.2- tempArrayList = findPath(currentpoint.Right, targetPoint, tempArrayList);3.3- 如果tempArrayList不为空返回tempArrayList4-如果currentPoint的下侧为空跳到步骤54.1-将currentPoint添加到tempArrayList//*** 调用下侧4.2- tempArrayList = findPath(currentpoint.Button, targetPoint, tempArrayList);4.3- 如果tempArrayList不为空返回tempArrayList5-如果currentPoint的左侧为空跳到步骤65.1-将currentPoint添加到tempArrayList//*** 调用左侧5.2- tempArrayList = findPath(currentpoint.Left, targetPoint, tempArrayList);5.3- 如果tempArrayList不为空返回tempArrayList6-如果currentPoint的上侧为空跳到步骤76.1-将currentPoint添加到tempArrayList//*** 调用上侧6.2- tempArrayList = findPath(currentpoint.Top, targetPoint, tempArrayList);6.3- 如果tempArrayList不为空返回tempArrayList7-返回null;//*** 未找到目标的结束条件}

注意:实际代码是用C#编写的,您可以从这个链接下载。

案例研究中问题的出现:当您理解这段代码时;它有一个弱点,为了说明这一点;考虑以下节点的整体视图,假设起始节点是节点A,最终目的地是节点H。

A—B—C|D—E—F—I|   | |G—H—J—K

尽管最佳路径解决方案是(A, D, G, H),但所解释的递归路径查找算法找到的解决方案是(A, D, E, F, I, K, J, H);这真的看起来像是机器人是一个愚蠢的机器人:D!

图1:递归路径查找算法enter image description here

图2:具有学习能力的递归路径查找算法enter image description here

我通过为节点添加学习能力解决了这个问题。您可以从这个链接看到问题的详细信息。但是,我想知道是否有人能修改递归算法以找到最短路径。

谢谢,


回答:

您正在进行深度优先搜索,而您真正想要的是广度优先搜索。后者需要使用队列而不是递归。维基百科页面很好地解释了如何实现它,所以我在这里就不重复了。

从那里开始,实施A*算法不会有太多的工作,这应该会加速您的结果。这将需要一个优先级队列而不是普通队列;C#的基础库中没有优先级队列,但幸运的是,我是一个针对路径查找优化的C#优先级队列实现的作者。

另外,既然您提到了Unity,我要指出有许多专门为Unity构建的路径查找库。这可能是最安全的途径,因为在视频游戏中高效的路径查找是非平凡的任务。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注