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

c# – 如何修改递归算法以找到最短路径?,第1张

概述https://vimeo.com/70999946 我实现了递归路径查找算法.该递归算法基于连接在一起的预先设定的节点而工作.每个节点有四个包含更多方向的指针:Top,Button,Left和Right.递归算法简单地遍历每个节点并逐个寻找这四个方向中的每一个以到达其最终目的地;举例说明,考虑以下7个节点:A,B,C,D,E,F,G,H. A (Button->D, Right->B) https://vimeo.com/70999946

我实现了递归路径查找算法.该递归算法基于连接在一起的预先设定的节点而工作.每个节点有四个包含更多方向的指针:top,button,left和Right.递归算法简单地遍历每个节点并逐个寻找这四个方向中的每一个以到达其最终目的地;举例说明,考虑以下7个节点:A,B,C,D,E,F,G,H.

A (button->D,Right->B)    B (Right->C,left->B)    C (left->B)    D (button->G,Right->E,top->A)    E (Right->F,left->D)    F (left->E)    G (Right->H,top->D)    H (left->G)

进入整体视图时,这些节点将显示下图.

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

在此示例中,假设walker已启动节点为节点A,并且希望将节点H作为其最终目标.节点A按顺序查看自己的Right,left和top;它的右边指向节点B,因此他选择去节点B;相同模式的节点B选择向右移动,节点C.当步行者到达节点C时;当它的右边,顶部和按钮被阻塞时,节点C恢复到节点B.同样,节点B恢复节点A.步行器再次返回起始点.然后节点A根据订单转到其按钮节点;这意味着它进入节点D.节点D进入其右侧节点E,然后进入节点F.节点F被阻止;它返回到节点E和节点D.然后,节点D根据步行器顺序选择其按钮,节点G.从那里节点G进入节点H.最后,步行者到达其最终目的地.

Pseudocode: Recursive Path Finding AlgorithmArrayList findpath(GameObject currentPoint,GameObject targetPoint,ArrayList inputArrayList){1-Duplicate inputArrayList as tempArrayList2-If the currentPoint equals to target Point return inputArrayList//*** End Condition found target3-If the Right sIDe of the currentPoint is empty goto step 43.1- Add currentPoint to tempArrayList//*** Call Right3.2- tempArrayList = findpath(currentpoint.Right,targetPoint,tempArrayList);3.3- If tempArrayList is not null return tempArrayList4-If the button sIDe of the currentPoint is empty goto step 54.1- Add currentPoint to tempArrayList//*** Call button4.2- tempArrayList = findpath(currentpoint.button,tempArrayList);4.3- If tempArrayList is not null return tempArrayList5-If the left sIDe of the currentPoint is empty goto step 65.1- Add currentPoint to tempArrayList//*** Call left5.2- tempArrayList = findpath(currentpoint.left,tempArrayList);5.3- If tempArrayList is not null return tempArrayList6-If the top sIDe of the currentPoint is empty goto step 76.1- Add currentPoint to tempArrayList//*** Call top6.2- tempArrayList = findpath(currentpoint.top,tempArrayList);6.3- If tempArrayList is not null return tempArrayList7-Return null;//*** End Condition does not found target}

注意:实际代码是C#,您可以从link下载.

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

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

虽然最佳路径解是(A,H),但解释的递归路径寻找算法找到(A,I,K,J,H)作为其解;这真的看起来机器人是一个愚蠢的机器人:D!

图1:递归路径查找算法

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

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

谢谢,

解决方法 你正在做 depth-first search,你想要做的是 breadth-first search.后者需要 queue而不是递归.维基页面很好地解释了如何实现它,所以我在此不再重复.

从那里开始,实施A*并没有多大工作,这应该可以加快你的结果.这将需要优先级队列而不是队列; C#在基本库中没有优先级队列,但幸运的是,我是专门用于寻路的optimized C# priority-queue implementation的作者.

此外,既然你提到了Unity,我会指出有专门为Unity构建的a number of pathfinding libraries.这可能是最安全的路线,因为视频游戏中的有效寻路是非常重要的.

总结

以上是内存溢出为你收集整理的c# – 如何修改递归算法以找到最短路径?全部内容,希望文章能够帮你解决c# – 如何修改递归算法以找到最短路径?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1247963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存