0


人工智能大作业——A算法迷宫寻路问题

项目设计的目的

利用A*算法实现迷宫寻路功能,利用启发式函数的编写以及各类启发式函数效果的比较。

相关原理知识介绍

A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。公式表示为:f(n)=g(n)+h(n),其中f(n)是节点n从初始点到目标点的估价函数,g(n)是在状态空间中从初始节点到n节点的实际代价,h(n)是从n到目标节点最佳路径的估计代价。保证找到最短路径(最优解的)条件,关键在于估价函数h(n)的选取:估价值h(n)小于等于n到目标节点的距离实际值,这种情况下,搜索的点数多,搜索范围大,效率低,但能得到最优解。如果估价值大于实际值,搜索的点数少,搜索范围小,效率高,但不能保证得到最优解。
启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无畏的搜索路径,提到了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。

设计的求解问题的流程图的说明

在这里插入图片描述

A*算法寻路的求解步骤说明:
1.将起点方格(节点)加入openlist链表中,作为寻路开始的起点;
2.循环执行以下步骤,直到openlist链表为空结束或者终点(节点)加入到 openlist 中:
(1)在openlist中找到F值最小的那个节点(如果有相等的情况,就选择最先找到的那个节点)作为[ 当前节点 ];
(2)在openlist中将第1步找到的那个F值最小的节点,从openlist中删除掉;
(3)在closelist中将第1步找到的那个F值最小的节点,加入closelist中;
(4)围绕第1步找到的那个F值最小的 [ 当前节点 ] ,找到与它相邻的 四个方向(上下左右) 上的节点,这里要判断邻居节点的有效性,看 邻居节点 是否满足以下条件:
<1>邻居节点是否越界——节点的x或者y是否在可视范围内;
<2>邻居节点是否为障碍方格(节点)——比如本程序中的 MAZE[i][j]=1 即为障碍,MAZE[i][j]=0 即为可用;
<3>邻居节点是否已经在openlist链表中或者closelist链表中;

  1. package graph;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. //A*寻路算法简单实现————>四方向(上下左右)
  5. public class Maze_A_ManHaDun {
  6. //简单的迷宫模拟——利用二维数组,其中 1 表示障碍,不可通过。
  7. public static final int[][] MAZE= {
  8. {0, 1, 0, 0, 0, 0, 0},//7
  9. {0, 0, 1, 0, 0, 0, 0},
  10. {1, 0, 0, 1, 0, 0, 0},
  11. {0, 1, 0, 1, 1, 1, 1},
  12. {0, 0, 0, 0, 0, 0, 0},
  13. {0, 0, 0, 0, 0, 0, 0},
  14. {0, 0, 0, 1, 1, 1, 0},
  15. //7
  16. };
  17. //定义 方格节点——grid
  18. static class Grid{
  19. public int x;//结点
  20. public int y;
  21. public int f;//fn
  22. public int g;//gn
  23. public int h;//hn
  24. public Grid parent;
  25. public Grid(int x,int y) {
  26. this.x=x;
  27. this.y=y;
  28. }
  29. //实例化一个方格节点
  30. public void initGrid(Grid parent, Grid end) {
  31. //parent赋值
  32. this.parent=parent;
  33. //计算g的大小
  34. if(parent!=null) {
  35. this.g=parent.g+1;
  36. //this.g=0;
  37. }
  38. else
  39. {
  40. this.g=1;
  41. }
  42. //计算h的大小
  43. this.h=Math.abs(this.x-end.x)+Math.abs(this.y-end.y);
  44. //this.h=Math.abs(this.x-end.x)*Math.abs(this.y-end.y);
  45. //计算f的大小
  46. this.f=this.g+this.h;
  47. }
  48. }
  49. //寻路算法核心实现过程
  50. public static Grid aStarSearch(Grid start, Grid end) {
  51. //准备两个链表,分别存储 将要选择的节点 和 已经走过的节点
  52. ArrayList<Grid> openlist=new ArrayList<Grid>();
  53. ArrayList<Grid> closelist=new ArrayList<Grid>();
  54. //将起点加入链表,准备开始寻路。
  55. openlist.add(start);
  56. //只要链表不为空,就重复这个寻路的过程
  57. while(openlist.size()>0) {
  58. //找到 openlist中 F值最小的那个 方格(节点)
  59. Grid currentgrid=findMinGrid(openlist);
  60. //从 openlist中删除找到的那个 F值 最小的那个节点
  61. openlist.remove(currentgrid);
  62. //将这个 F值 最小的节点,加入到 closelist 中
  63. closelist.add(currentgrid);
  64. //寻找 当前找到的这个 F值最小的节点的 邻居节点 ——上下左右,四个方向上的节点,要判断它们是否为合法可用的节点。
  65. List<Grid> neighbors=findNeighbors(currentgrid, openlist, closelist);
  66. //对合法可用的邻居节点进行初始化,并加入到 openlist中
  67. for(Grid grid : neighbors) {
  68. if(!openlist.contains(grid)) {
  69. grid.initGrid(currentgrid,end);
  70. openlist.add(grid);
  71. }
  72. }
  73. //邻居节点加入 openlist 后,判断openlist中,是否包含 终点节点,如果包含终点,直接返回并退出。
  74. for(Grid grid : openlist) {
  75. if((grid.x==end.x) && (grid.y==end.y)) {
  76. return grid;
  77. }
  78. }
  79. }
  80. return null;
  81. }
  82. //寻找邻居节点的方法,返回值为 链表 ——创建一个合理的邻居链表
  83. private static ArrayList<Grid> findNeighbors(Grid grid, List<Grid> openlist, List<Grid> closelist) {
  84. // TODO Auto-generated method stub
  85. ArrayList<Grid> gridlist=new ArrayList<Grid>();
  86. //判断上下左右邻居节点的合理性,没问题就加入到邻居链表中。
  87. if(isValidGrid(grid.x, grid.y-1, openlist, closelist)) {//下
  88. gridlist.add(new Grid(grid.x, grid.y-1));
  89. }
  90. if(isValidGrid(grid.x, grid.y+1, openlist, closelist)) {//上
  91. gridlist.add(new Grid(grid.x, grid.y+1));
  92. }
  93. if(isValidGrid(grid.x-1, grid.y, openlist, closelist)) {//左
  94. gridlist.add(new Grid(grid.x-1, grid.y));
  95. }
  96. if(isValidGrid(grid.x+1, grid.y, openlist, closelist)) {//右
  97. gridlist.add(new Grid(grid.x+1, grid.y));
  98. }
  99. return gridlist;
  100. }
  101. //判断当前位置的节点是否合理
  102. private static boolean isValidGrid(int x, int y, List<Grid> openlist, List<Grid> closelist) {
  103. // TODO Auto-generated method stub
  104. //当前节点是否越界,不再MAZE数组范围内了,注意二位数组的长度计算方法及含意
  105. //MAZE。length表示行的长度
  106. //MAZE[0]。length表示列的长度
  107. if(x<0 || x>=MAZE.length || y<0 || y>=MAZE[0].length) {
  108. return false;
  109. }
  110. //当前节点是否为障碍节点
  111. if(MAZE[x][y]==1) {
  112. return false;
  113. }
  114. //判断当前节点是否在 openlist中
  115. if(containgrid(openlist, x, y)) {
  116. return false;
  117. }
  118. //判断当前节点是否在 closelist中
  119. if(containgrid(closelist, x, y)) {
  120. return false;
  121. }
  122. return true;
  123. }
  124. //判断当前链表中是否包含当前的节点
  125. private static boolean containgrid(List<Grid> grids, int x, int y) {
  126. // TODO Auto-generated method stub
  127. for(Grid grid : grids) {
  128. if((grid.x==x) && (grid.y==y)) {
  129. return true;
  130. }
  131. }
  132. return false;
  133. }
  134. //寻找当前链表中的节点F值 最小的那个节点,并返回这个节点。
  135. private static Grid findMinGrid(ArrayList<Grid> openlist) {
  136. // TODO Auto-generated method stub
  137. Grid tempgrid=openlist.get(0);
  138. for(Grid grid : openlist) {
  139. if(grid.f<tempgrid.f) {
  140. tempgrid=grid;
  141. }
  142. }
  143. return tempgrid;
  144. }

尝试改变启发式算法提高迷宫搜索速度

A_算法的估价函数可表示为:f’(n) = g’(n) + h’(n)这里,f’(n)是估价函数,g’(n)是起点到节点n的最短路径值,h’(n)是n到目标的最短路经的启发值。由于这个f’(n)其实是无法预先知道的,所以我们用前面的估价函数f(n)做近似。g(n)代替g’(n),但 g(n)>=g’(n)才可(大多数情况下都是满足的,可以不用考虑),h(n)代替h’(n),但h(n)<=h’(n)才可(这一点特别的重要)。可以证明应用这样的估价函数是可以找到最短路径的,也就是可采纳的。我们说应用这种估价函数的最好优先算法就是A_算法。

分析不同启发式函数对迷宫寻路速度的提升效果

需要完整实验报告和视频讲解,可以联系博主。


👉AI大模型学习路线汇总👈

大模型学习路线图,整体分为7个大的阶段:(全套教程文末领取哈)

第一阶段: 从大模型系统设计入手,讲解大模型的主要方法;

第二阶段: 在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段: 大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段: 大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段: 大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段: 以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段: 以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

👉大模型实战案例👈

光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉大模型视频和PDF合集👈

观看零基础学习书籍和视频,看书籍和视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
在这里插入图片描述
在这里插入图片描述

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

👉获取方式:

😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【

  1. 保证100%免费

】🆓

在这里插入图片描述

标签: 算法 java 数据库

本文转载自: https://blog.csdn.net/HUANGXIN9898/article/details/139827139
版权归原作者 慕烟疏雨 所有, 如有侵权,请联系我们删除。

“人工智能大作业——A算法迷宫寻路问题”的评论:

还没有评论