C#实现A*寻路

网上有关A*算法的文章已经非常丰富了,各种语言各种思路都有,本来我实在不想再写一篇,,但因为最近工作动荡因此专门抽空又看了一下,然后就想写个文章防止以后印象模糊,好歹看自己写的东西可以很快回忆起来。如果是初次接触A*算法的朋友可以先看看这篇参考文章,我这边只是做一个总结,然后先贴上我之前的笔记吧:

二维数组map数据: 

0=可通过的格子,S=起点,E=终点,B=障碍物
基础定义:G=目标点到起点的步长总和 H=目标点到终点的步长总和(曼哈顿距离),F=两总和之和
定义:OpenList,CloseList,current,adjacentCube,g(步长,这个例子假定为1)

  1.将起点A加入到OpenList中,遍历OpenList,每次取最小F值的item,将其赋值给current,随后将这个item从OpenList中删除,加入到CloseList(例子中在这里遍历CloseList中是否存在目标点,有的话则立刻break,我个人觉得没必要每次都遍历,直接判断取到的current是否目标路径即可)。
  2.获取到该item四周的item(需要判断map该位置是否为"0"或"E",否则过滤,因为障碍物和边缘不能加入寻路OpenList中),设置X和Y并insert入adjacentCube中。
  3.遍历adjacentCube,检查每个item是否已存在于OpenList中,两种情况:
  (1.)已存在OpenList中,则判断如果current的G值+g步长和大于这个item的G值的话,则将这个item的parent置为current,同时将这个item的G值更新为current父物体的G值+g步长(主要是找一个相对最短的路径,因为最短路径最终需要从终点通过parent回溯,而不是正向寻找一遍就结束了)。
   (2.)未存在OpenList中,则设置这个item的各种属性值(G,H,F)以及parent,然后将其insert入OpenList中。
  4.重复以上步骤,直到找到目标点则break随后开始回溯输出。回溯的过程比较简单,因为之前有记录parent,所以当前current的parent已经记录了一条最短的路径。

然后如果你看过原文章的代码的话可能会发现那个变量g会有问题,源码每次OpenList遍历一次g值就会+1,但是有可能会有一种情况就是顺着一个格子C的周围的其中一条路径走了一段发现是错误的(即F值不再是OpenList中最小的),这时需要继续从OpenList中重新找最小F值的item继续找

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值