1.启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标。这样可以省略大量无谓的搜索路径,提高了效率。在启发式搜索中,对位置的估价是十分重要的。采用了不同的估价可以有不同的效果。

  启发算法有: 蚁群算法遗传算法模拟退火算法等。

2.估价算法:从当前节点移动到目标节点的预估损耗。

  预估算法有:曼哈顿(manhattan)等。

3.算法特点:理论上时间是最优的,但空间增长是指数型的。

4.java实现:上下左右移动

  1. package cn.liushaofeng.algorithm;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. /**
  7. * A Star Algorithm
  8. * @author liushaofeng
  9. * @date 2015-8-24 下午11:05:48
  10. * @version 1.0.0
  11. */
  12. public class AstarAlgorithm
  13. {
  14. private List<Node> openList = null;
  15. private List<Node> closeList = null;
  16. private int[][] map;
  17.  
  18. /**
  19. * default constructor
  20. * @param map data map
  21. */
  22. public AstarAlgorithm(int[][] map)
  23. {
  24. this.map = map;
  25. this.openList = new ArrayList<Node>();
  26. this.closeList = new ArrayList<Node>();
  27. }
  28.  
  29. /**
  30. * find path
  31. * @param srcNode source node
  32. * @param desNode destination node
  33. * @return node path
  34. */
  35. public Node findPath(Node srcNode, Node desNode)
  36. {
  37. init(srcNode);
  38. do
  39. {
  40. if (openList.isEmpty())
  41. {
  42. break;
  43. }
  44.  
  45. Node node = openList.get(0);
  46. List<Node> aroundPoint = getAroundPoint(srcNode, node, desNode);
  47. openList.addAll(aroundPoint);
  48. closeList.add(node);
  49. openList.remove(node);
  50.  
  51. } while (!findDes(desNode));
  52.  
  53. return findNodePath(desNode);
  54. }
  55.  
  56. private Node findNodePath(Node desNode)
  57. {
  58. for (Node node : openList)
  59. {
  60. if (node.getX() == desNode.getX() && node.getY() == desNode.getY())
  61. {
  62. return node;
  63. }
  64. }
  65. return null;
  66. }
  67.  
  68. private boolean findDes(Node desNode)
  69. {
  70. for (Node node : openList)
  71. {
  72. if (node.getX() == desNode.getX() && node.getY() == desNode.getY())
  73. {
  74. return true;
  75. }
  76. }
  77. return false;
  78. }
  79.  
  80. private void init(Node srcNode)
  81. {
  82. openList.add(srcNode);
  83. }
  84.  
  85. // top bottom left and right, four points
  86. private List<Node> getAroundPoint(Node srcNode, Node nextNode, Node desNode)
  87. {
  88. int x = srcNode.getX();
  89. int y = srcNode.getY();
  90.  
  91. int[] xData = new int[2];
  92. int[] yData = new int[2];
  93. if (x - 1 >= 0)
  94. {
  95. xData[0] = x - 1;
  96. }
  97. if (x + 1 < map.length)
  98. {
  99. xData[1] = x + 1;
  100. }
  101.  
  102. if (y - 1 >= 0)
  103. {
  104. yData[0] = y - 1;
  105. }
  106. if (y + 1 < map[0].length)
  107. {
  108. yData[1] = y + 1;
  109. }
  110.  
  111. List<Node> tmpList = new ArrayList<Node>();
  112.  
  113. for (int i : xData)
  114. {
  115. Node node = new Node(i, y, srcNode);
  116. if (!isObstacle(node) && !inClosetList(node))
  117. {
  118. calcWeight(srcNode, node, desNode);
  119. tmpList.add(node);
  120. }
  121. }
  122.  
  123. for (int i : yData)
  124. {
  125. Node node = new Node(x, i, srcNode);
  126. if (!isObstacle(node) && !inClosetList(node))
  127. {
  128. calcWeight(srcNode, node, desNode);
  129. tmpList.add(node);
  130. }
  131. }
  132.  
  133. return tmpList;
  134. }
  135.  
  136. private void calcWeight(Node parentNode, Node node, Node desNode)
  137. {
  138. node.setG(parentNode.getG() + 10);
  139. int h = Math.abs(node.getX() - desNode.getX()) + Math.abs(node.getY() - desNode.getY());
  140. node.setWeight(node.getG() + h * 10);
  141. }
  142.  
  143. private boolean inClosetList(Node nextNode)
  144. {
  145. for (Node node : closeList)
  146. {
  147. if (node.getX() == nextNode.getX() && node.getY() == nextNode.getY())
  148. {
  149. return true;
  150. }
  151. }
  152. return false;
  153. }
  154.  
  155. private boolean isObstacle(Node nextNode)
  156. {
  157. return map[nextNode.getX()][nextNode.getY()] == 1;
  158. }
  159.  
  160. public static void main(String[] args)
  161. {
  162. int[][] map =
  163. {
  164. { 0, 0, 0, 0, 0, 0, 0 },
  165. { 0, 0, 0, 0, 0, 0, 0 },
  166. { 0, 0, 0, 1, 0, 0, 0 },
  167. { 0, 0, 0, 1, 0, 0, 0 },
  168. { 0, 0, 0, 1, 0, 0, 0 },
  169. { 0, 0, 0, 0, 0, 0, 0 },
  170. { 0, 0, 0, 0, 0, 0, 0 } };
  171.  
  172. AstarAlgorithm astar = new AstarAlgorithm(map);
  173. Node pathNode = astar.findPath(new Node(3, 1, null), new Node(3, 5, null));
  174. System.out.println(pathNode == null ? "Can not find path!" : pathNode.toString());
  175. }
  176. }

查看代码

数据模型

  1. package cn.liushaofeng.algorithm;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. /**
  7. * Node
  8. * @author liushaofeng
  9. * @date 2015-8-24 下午09:48:53
  10. * @version 1.0.0
  11. */
  12. public class Node
  13. {
  14. private Node parentNode;
  15. private int x;
  16. private int y;
  17.  
  18. private int weight;
  19. private int g;
  20.  
  21. /**
  22. * default constructor
  23. * @param x x point
  24. * @param y y point
  25. * @param parentNode parent node
  26. */
  27. public Node(int x, int y, Node parentNode)
  28. {
  29. this.x = x;
  30. this.y = y;
  31. this.parentNode = parentNode;
  32. }
  33.  
  34. public int getG()
  35. {
  36. return g;
  37. }
  38.  
  39. public void setG(int g)
  40. {
  41. this.g = g;
  42. }
  43.  
  44. public Node getParentNode()
  45. {
  46. return parentNode;
  47. }
  48.  
  49. public void setParentNode(Node parentNode)
  50. {
  51. this.parentNode = parentNode;
  52. }
  53.  
  54. public int getX()
  55. {
  56. return x;
  57. }
  58.  
  59. public void setX(int x)
  60. {
  61. this.x = x;
  62. }
  63.  
  64. public int getY()
  65. {
  66. return y;
  67. }
  68.  
  69. public void setY(int y)
  70. {
  71. this.y = y;
  72. }
  73.  
  74. public int getWeight()
  75. {
  76. return weight;
  77. }
  78.  
  79. public void setWeight(int weight)
  80. {
  81. this.weight = weight;
  82. }
  83.  
  84. @Override
  85. public String toString()
  86. {
  87. return getPath();
  88. }
  89.  
  90. private String getPath()
  91. {
  92. List<Node> dataList = new ArrayList<Node>();
  93. Node node = this;
  94. while (node != null)
  95. {
  96. dataList.add(node);
  97. node = node.getParentNode();
  98. }
  99.  
  100. StringBuffer sb = new StringBuffer();
  101. for (int i = dataList.size() - 1; i >= 0; i--)
  102. {
  103. if (i == 0)
  104. {
  105. sb.append("(" + dataList.get(i).getX() + "," + dataList.get(i).getY() + ")");
  106. } else
  107. {
  108. sb.append("(" + dataList.get(i).getX() + "," + dataList.get(i).getY() + ")->");
  109. }
  110. }
  111. return sb.toString();
  112. }
  113. }

查看代码

 代码待调试。

算法之A星算法(寻路)的更多相关文章

  1. A*搜寻算法(A星算法)

    A*搜寻算法[编辑] 维基百科,自由的百科全书 本条目需要补充更多来源.(2015年6月30日) 请协助添加多方面可靠来源以改善这篇条目,无法查证的内容可能会被提出异议而移除. A*搜索算法,俗称A星 ...

  2. 算法 A-Star(A星)寻路

    一.简介 在游戏中,有一个很常见地需求,就是要让一个角色从A点走向B点,我们期望是让角色走最少的路.嗯,大家可能会说,直线就是最短的.没错,但大多数时候,A到B中间都会出现一些角色无法穿越的东西,比如 ...

  3. JS算法之A*(A星)寻路算法

    今天写一个连连看的游戏的时候,接触到了一些寻路算法,我就大概讲讲其中的A*算法. 这个是我学习后的一点个人理解,有错误欢迎各位看官指正. 寻路模式主要有三种:广度游戏搜索.深度优先搜索和启发式搜索. ...

  4. 算法起步之A星算法

    原文:算法起步之A星算法 用途: 寻找最短路径,优于bfs跟dfs 描述: 基本描述是,在深度优先搜索的基础上,增加了一个启发式算法,在选择节点的过程中,不是盲目选择,而是有目的的选的,F=G+H,f ...

  5. Cocos2d-x 3.1.1 学习日志16--A星算法(A*搜索算法)学问

    A *搜索算法称为A星算法.这是一个在图形平面,路径.求出最低通过成本的算法. 经常使用于游戏中的NPC的移动计算,或线上游戏的BOT的移动计算上. 首先:1.在Map地图中任取2个点,開始点和结束点 ...

  6. POJ 2449 Remmarguts' Date (SPFA + A星算法) - from lanshui_Yang

    题目大意:给你一个有向图,并给你三个数s.t 和 k ,让你求从点 s 到 点 t 的第 k 短的路径.如果第 k 短路不存在,则输出“-1” ,否则,输出第 k 短路的长度. 解题思路:这道题是一道 ...

  7. Java开源-astar:A 星算法

    astar A星算法Java实现 一.适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父 ...

  8. A星算法(Java实现)

    一.适用场景 在一张地图中.绘制从起点移动到终点的最优路径,地图中会有障碍物.必须绕开障碍物. 二.算法思路 1. 回溯法得到路径 (假设有路径)採用"结点与结点的父节点"的关系从 ...

  9. JAVA根据A星算法规划起点到终点二维坐标的最短路径

    工具类 AStarUtil.java import java.util.*; import java.util.stream.Collectors; /** * A星算法工具类 */ public c ...

随机推荐

  1. oracle 转移表空间

    一.系统表空间数据文件迁移:SQL> conn /@tmpdb as sysdba 已连接. SQL> desc dba_data_files; 名称 是否为空? 类型 --------- ...

  2. Watir: 在使用test/unit的时候要注意,不需要require的时候别require

    假设我书写了很多测试用例,测试用例中都有:require 'test/unit' 后来我想把很多这样的测试用例组织在一起运行,我使用了两个require: require 'test/unit' re ...

  3. bzoj 3653 谈笑风生 —— 主席树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3653 对于一个 (a,b,c),分成 b 是 a 的祖先和 b 在 a 子树里两部分: 第一 ...

  4. 英特尔、联发科、展讯等开始支持开源的物联网轻量化操作系统AliOS Lite

    操作系统AliOS Lite Chaos 12-21 11:03 在 12 月 20 日的云栖大会北京峰会上,阿里宣布即将开源 AliOS Lite,此前面向 IoT 领域的轻量级物联网嵌入式操作系统 ...

  5. HTTP错误code大全

    100 - Continue 101 - Switching Protocols Top Success Codes 200 - OK 201 - Created 202 - Accepted 203 ...

  6. 【215】◀▶ IDL 文件操作说明

    参考:I/O - General File Access Routines —— 基本文件操作函数 01   CD 修改当前的工作空间路径. 02   FILE_SEARCH 对文件名进行特定的查找. ...

  7. 2、HTML的head内标签

    一.Meta(metadata information) 提供有关页面的元信息,例:页面编码.刷新.跳转.针对搜索引擎和更新频度的描述和关键词 1.页面编码(告诉浏览器是什么编码) <meta ...

  8. django基础知识

    一.django的安装 1. pip3 install django 2. 把安装路径加到环境变量里以便以后启动admin相关命令,在windows系统中---我的电脑---属性----高级系统设置- ...

  9. MySQL暴错注入方法整理

    1.通过floor暴错 /*数据库版本*/ http://www.waitalone.cn/sql.php?id=1+and(select 1 from(select count(*),concat( ...

  10. E20180403-hm

    accompany vt. 陪伴,陪同; 附加,补充; 与…共存; 为…伴奏 synchronous adj. 同时存在[发生]的,同步的 asynchronous adj. 异步的; particu ...