A*算法 求最优解

算法一直维护两个表: Open和Close

  • 将起点S加入Open中

  • 将所有S可到达的点(障碍物以及位于Close表中的点均看成不可达)加入到Open中。将起点从Open中删去,并加入到Close中

  • ①从Open中删去F值最小的点Min,并将其加入到Close中

  • ②将Min点所有可到达的点加入Open中,并设这些点的父节点为Min。若某点已经在Open中,则比较其F值,若新路径F值较小,说明从Min走路更短,更新其父节点为Min;否则不更新此点

  • 循环①②,直到Open中出现目的点E

公式表示为: f(n)=g(n)+h(n),

其中 f(n) 是从初始状态经由状态n到目标状态的代价估计,

g(n) 是在状态空间中从初始状态到状态n的实际代价,

h(n) 是从状态n到目标状态的最佳路径的估计代价。

通俗一点讲:

g(n)代表你从起始点到下一点的实际距离(制定到下一点的距离的规则)

h(n)是自己设计的函数,可以是到目的地大致的距离

可将循环过程封装成函数:

[cpp] view plaincopy
  1. while (isNotEnd()) {
  2. Find_deleteMinFromOpen_AddToClose();
  3. putReachableIntoOpen(close.back());
  4. }

举个栗子:

对于以下图:5行15列

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

其中x为墙壁,s为起点,e为终点,建立合适的模型,调用A star算法,找到一条s到e的最短路径。

取直走G值为10,斜走G值为14

这里H值设定为无视障碍到达终点所需的 步数*10

我们看开始的几步:

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

灰色的点G=10,H=9*10 ,其F值最小,加入Close

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

灰色的点G=10+10,H=8*10 ,其F值最小,加入Close

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

灰色的点G=10+10+10,H=7*10 ,其F值最小,加入Close

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

灰色的点G=10+10+10+10,H=6*10 ,其F值最小,加入Close

以此循环,直到e在Open中,此时只需要沿着父节点往回走就可以到达起点了,这条路就是当前情况下最优的解

结果:

000000000000000

0000000x0000000

00s0000x0000e00

0000000x0000000

000000000000000

C++实现:

[cpp] view plaincopy
  1. #include#include#include#includeusing namespace std;
  2. char square[5][15] = {//待求数据
  3. '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0',
  4. '0','0','0','0','0','0','0','x','0','0','0','0','0','0','0',
  5. '0','0','s','0','0','0','0','x','0','0','0','0','e','0','0',
  6. '0','0','0','0','0','0','0','x','0','0','0','0','0','0','0',
  7. '0','0','0','0','0','0','0','0','0','0','0','0','0','0','0'
  8. };
  9. class point {
  10. public:
  11. point(char s) {
  12. v = s;
  13. G = 0;
  14. H = 0;
  15. F = 0;
  16. }
  17. pair ParentPosi;
  18. pair posi;
  19. char v;//value
  20. int F;
  21. int G;
  22. int H;
  23. int UpdateF() {
  24. F = G + H;
  25. return F;
  26. }
  27. int UpdateH() {
  28. int x = posi.first - 2;
  29. int y = posi.second - 12;
  30. x *= 10;
  31. y *= 10;
  32. if (x < 0) {
  33. x = -x;
  34. }
  35. if (y < 0) {
  36. y = -y;
  37. }
  38. H = x + y;
  39. return H;
  40. }
  41. void setPosi(pair x) {
  42. posi = x;
  43. }
  44. void setParentPosi(pair x) {
  45. ParentPosi= x;
  46. }
  47. void setG(int g) {
  48. G = g;
  49. }
  50. void setH(int h) {
  51. H = h;
  52. }
  53. point &operator = (point &s) {
  54. (*this).v=(s).v;
  55. (*this).ParentPosi = s.ParentPosi;
  56. (*this).posi = s.posi;
  57. (*this).F = s.F;
  58. (*this).G = s.G;
  59. (*this).H = s.H;
  60. return *this;
  61. }
  62. };
  63. vector open;
  64. vector close;
  65. point squ[5][15] = {
  66. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
  67. 0,0,0,0,0,0,0,'x',0,0,0,0,0,0,0,
  68. 0,0,'s',0,0,0,0,'x',0,0,0,0,'e',0,0,
  69. 0,0,0,0,0,0,0,'x',0,0,0,0,0,0,0,
  70. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  71. };
  72. bool isInOpenList(pair s) {
  73. for (int i = 0;i<open.size();i++) {
  74. if (open[i].posi == s) {
  75. return true;
  76. }
  77. }
  78. return false;
  79. }
  80. bool isInCloseList(pair s) {
  81. for (int i = 0;i<close.size();i++) {
  82. if (close[i].posi == s) {
  83. return true;
  84. }
  85. }
  86. return false;
  87. }
  88. void putReachableIntoOpen(point min) {
  89. int x = min.posi.first;
  90. int y = min.posi.second;
  91. int direc[8][2] = {
  92. 0,1,
  93. 1,1,
  94. 1,0,
  95. 1,-1,
  96. 0,-1,
  97. -1,-1,
  98. -1,0,
  99. -1,1
  100. };
  101. for (int i = 0;i < 8;i++) {
  102. x = x + direc[i][0];
  103. y = y + direc[i][1];
  104. if (isInOpenList(make_pair(x, y))&&close.size()>0) {
  105. int tempi = 0;
  106. for (int i = 0;i < open.size();i++) {
  107. if (open[i].posi == make_pair(x, y)) {
  108. tempi = i;
  109. }
  110. }
  111. if (direc[i][0] * direc[i][1] != 0) {//斜向
  112. int G_now = close.back().G + 14;
  113. if (G_now < open[tempi].G) { //G比较小就更新路径
  114. open[tempi].ParentPosi = make_pair(x, y);
  115. squ[open[tempi].posi.first][open[tempi].posi.second].ParentPosi = make_pair(x, y);
  116. }
  117. }
  118. else {
  119. int G_now = close.back().G + 10;
  120. }
  121. continue;
  122. }
  123. //既不在关闭也不在开启列表中而且可到达 就将其加入开启列表
  124. if ((!isInOpenList(make_pair(x, y))) && (!isInCloseList(make_pair(x,y)))&&x >= 0 && x < 5 && square[x][y] != 'x') {
  125. squ[x][y].setParentPosi(min.posi);
  126. open.push_back(squ[x][y]);
  127. if (direc[i][0] * direc[i][1] != 0) {//斜向
  128. squ[x][y].setG(squ[x][y].G+14);
  129. }
  130. else {
  131. squ[x][y].setG(squ[x][y].G + 10);
  132. }
  133. //cout << "(" << squ[x][y].posi.first << "," << squ[x][y].posi.second << ")" << endl;
  134. }
  135. x = x - direc[i][0];
  136. y = y - direc[i][1];
  137. }
  138. //cout << "------------------------" << "(" << x << "," << y << "):" << "------------------------" << endl;
  139. }
  140. void Find_deleteMinFromOpen_AddToClose() {
  141. point min_= open[0];
  142. int tempi = 0;
  143. for (int i = 0;i < open.size();i++) {
  144. if (open[i].UpdateF() < min_.UpdateF()) {
  145. min_ = open[i];
  146. tempi = i;
  147. }
  148. }
  149. close.push_back(min_);
  150. std::vector::iterator it=open.begin()+tempi;
  151. open.erase(it);
  152. //cout << "close:           (" << min_.posi.first << "," << min_.posi.second << ")" << endl;
  153. //cout << "closeSize()=" << close.size() << endl;
  154. //cout << "openSize()=" << open.size() << endl;
  155. }
  156. bool isNotEnd() {
  157. for (int i=0;i<open.size();i++) {
  158. if (open[i].v == 'e') {
  159. open[i].ParentPosi=close.back().posi;
  160. return false;
  161. }
  162. }
  163. return true;
  164. }
  165. void findPath(pair begin,pairend) {
  166. //将起点放入open
  167. open.push_back(squ[2][2]);
  168. putReachableIntoOpen(squ[2][2]);
  169. int tempi = 0;
  170. for (int i = 0;i < open.size();i++) {
  171. if (open[i].v == 's') {
  172. tempi = i;
  173. }
  174. }
  175. std::vector::iterator it = open.begin()+tempi;//删除起点
  176. while (isNotEnd()) {
  177. Find_deleteMinFromOpen_AddToClose();
  178. putReachableIntoOpen(close.back());
  179. }
  180. }
  181. void print_path() {
  182. for (int i = 0;i < 5;i++) {
  183. for (int j = 0;j < 15;j++) {
  184. squ[i][j].posi = make_pair(i, j);

A star算法优化一相关推荐

  1. 「游戏」寻路算法之A Star算法原理及实现

    前言 自动寻路是在一些如MMORPG等类型游戏中常见的一种功能,其给了玩家良好的游戏体验,使得玩家在游戏过程中省去了大量游戏坐标点的记录以及长时间的键盘操作,不必记忆坐标,不必担心迷路,用最快捷的方法 ...

  2. deeplearning算法优化原理

    deeplearning算法优化原理 目录 • 量化原理介绍 • 剪裁原理介绍 • 蒸馏原理介绍 • 轻量级模型结构搜索原理介绍 Quantization Aware Training量化介绍 1.1 ...

  3. 数据结构与算法(5)字符串(BF算法、KMP算法及KMP算法优化)

    目录 一.BF算法(暴力算法) 二.KMP算法 三.KMP算法优化 一.BF算法(暴力算法) 一个一个往后匹配,匹配失败继续从母串下一个和头(子串的头)往后继续匹配. 虽然简单,但是需要较多的时间复杂 ...

  4. 蚁群算法优化神经网络matlab源程序,粒子群优化神经网络的程序大集合

    粒子群程序集合 866867259psobp psobp.m pso(粒子群算法)优化神经网络 粒子群算法(PSO)应用于神经网络优化[matlab] PSOt A Particle Swarm Op ...

  5. MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度

    MAT之PSO:利用PSO算法优化二元函数,寻找最优个体适应度 目录 实现结果 设计代码 实现结果 设计代码 figure [x,y] = meshgrid(-5:0.1:5,-5:0.1:5); z ...

  6. 初等数论--同余--MILLER-RABIN素性检测算法优化

    初等数论--同余--MILLER-RABIN素性检测算法优化 Euler theorem.Fermat's little theorem Primality Test: Fermat.MILLER-R ...

  7. 群友福利 | 55 本《AI 嵌入式系统: 算法优化与实现》免费送

    一年春至,同学们开始陆续返回校园,上班党也在欢天喜地的 "逗利是" 中开启了新一年的打工生活. 为了回馈广大开发者的大力支持,和广大开发者一起成长的极术社区为大家带来了壬寅虎年的第 ...

  8. 网易云信实时音频框架背后:算法优化带来产品体验全面提升

    2018年10月19日,LiveVideoStackCon音视频技术大会在北京召开.本届会议以"技术开启新'视'界"为主题,汇集资深的音视频技术工程师,探讨在音频.视频.图像等技术 ...

  9. 【百度飞浆】RCNN系列算法优化策略与案例

    RCNN系列算法优化策略与案例 目录 1 两阶段检测进阶模型介绍 2 两阶段检测进阶模型优化策略 3 工业应用:铝压铸件质检 目录 1 两阶段检测进阶模型介绍 2 两阶段检测进阶模型优化策略 3 工业 ...

最新文章

  1. 梯度下降(Gradient Descent),一句代码,一个式子
  2. 用 Ubuntu 重置 Windows 密码
  3. 主存储器与CPU的连接
  4. 12-1-顺序文件归并-文件-第12章-《数据结构》课本源码-严蔚敏吴伟民版
  5. .Net 中DataSet和DataTable的 区别与联系
  6. [IOS地图开发系类]5、改变大头针MKPinAnnotationView的颜色
  7. c++ 应用socket实现C/S端文件的传输
  8. android volley框架详解,android通信框架volley详解(一)
  9. win7安装nvme固态硬盘win10专业版
  10. javaweb表格制作举例
  11. Cloudera Manager 环境搭建
  12. FWT(快速沃尔什变换)
  13. win10连不上网,搜索不到WiFi,本地连接也断开
  14. Predefined Evenly-Distributed Class Centroids(PEDCC)预定义类中心做分类解读
  15. es if语法 script_ESLint规则中的JavaScript知识
  16. 16、git删除暂存区文件
  17. element audio 标签 不显示_不闪屏,HDR,带鱼屏全都有,LG 29WK600宽屏显示器测评...
  18. 类似婚礼纪的Java项目_「婚礼纪」婚礼纪 java面试 - seo实验室
  19. ubuntu18.04双系统安装教程
  20. 使用atomikos 如何实现 JTA/XA全局事务

热门文章

  1. 用STATSVN统计公司SVN代码修改
  2. Jconsole查看Weblogic自定义MBean
  3. 记得重用layout
  4. java 深入了解DTO及如何使用DTO
  5. python中的.idea文件夹是干嘛的
  6. java手动切换成独立显卡_JAVA设计模式之调停者模式
  7. TensorFlow 实例一:线性回归模型
  8. Docker 精通之入门
  9. php汽车找车位,遭遇到车多车位少 教你如何快速找到停车位
  10. elementui table某一列是否显示_Vue项目引进ElementUI组件的方法