A星算法——Java修正版
来源:互联网 发布:java 计算时间差 秒 编辑:程序博客网 时间:2024/05/17 10:43
package com.test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class AStar {private int[][] map;// 地图(1可通过 0不可通过)private List<Node> openList;// 开启列表private List<Node> closeList;// 关闭列表private final int COST_STRAIGHT = 10;// 垂直方向或水平方向移动的路径评分private final int COST_DIAGONAL = 14;// 斜方向移动的路径评分private int row;// 行private int column;// 列public AStar(int[][] map, int row, int column) {this.map = map;this.row = row;this.column = column;openList = new ArrayList<Node>();closeList = new ArrayList<Node>();}// 查找坐标(-1:错误,0:没找到,1:找到了)public int search(int x1, int y1, int x2, int y2) {if (x1 < 0 || x1 >= row || x2 < 0 || x2 >= row || y1 < 0|| y1 >= column || y2 < 0 || y2 >= column) {return -1;}if (map[x1][y1] == 0 || map[x2][y2] == 0) {return -1;}Node sNode = new Node(x1, y1, null);Node eNode = new Node(x2, y2, null);openList.add(sNode);List<Node> resultList = search(sNode, eNode);if (resultList.size() == 0) {return 0;}for (Node node : resultList) {map[node.getX()][node.getY()] = -1;}return 1;}// 查找核心算法private List<Node> search(Node sNode, Node eNode) {List<Node> resultList = new ArrayList<Node>();boolean isFind = false;Node node = null;while (openList.size() > 0) {// 取出开启列表中最低F值,即第一个存储的值的F为最低的node = openList.get(0);// 判断是否找到目标点if (node.getX() == eNode.getX() && node.getY() == eNode.getY()) {isFind = true;break;}// 上if ((node.getY() - 1) >= 0) {checkPath(node.getX(), node.getY() - 1, node, eNode,COST_STRAIGHT);}// 下if ((node.getY() + 1) < column) {checkPath(node.getX(), node.getY() + 1, node, eNode,COST_STRAIGHT);}// 左if ((node.getX() - 1) >= 0) {checkPath(node.getX() - 1, node.getY(), node, eNode,COST_STRAIGHT);}// 右if ((node.getX() + 1) < row) {checkPath(node.getX() + 1, node.getY(), node, eNode,COST_STRAIGHT);}// 左上if ((node.getX() - 1) >= 0 && (node.getY() - 1) >= 0) {checkPath(node.getX() - 1, node.getY() - 1, node, eNode,COST_DIAGONAL);}// 左下if ((node.getX() - 1) >= 0 && (node.getY() + 1) < column) {checkPath(node.getX() - 1, node.getY() + 1, node, eNode,COST_DIAGONAL);}// 右上if ((node.getX() + 1) < row && (node.getY() - 1) >= 0) {checkPath(node.getX() + 1, node.getY() - 1, node, eNode,COST_DIAGONAL);}// 右下if ((node.getX() + 1) < row && (node.getY() + 1) < column) {checkPath(node.getX() + 1, node.getY() + 1, node, eNode,COST_DIAGONAL);}// 从开启列表中删除// 添加到关闭列表中closeList.add(openList.remove(0));// 开启列表中排序,把F值最低的放到最底端Collections.sort(openList, new NodeFComparator());}if (isFind) {getPath(resultList, node);}return resultList;}// 查询此路是否能走通private boolean checkPath(int x, int y, Node parentNode, Node eNode,int cost) {Node node = new Node(x, y, parentNode);// 查找地图中是否能通过if (map[x][y] == 0) {closeList.add(node);return false;}// 查找关闭列表中是否存在if (isListContains(closeList, x, y) != -1) {return false;}// 查找开启列表中是否存在int index = -1;if ((index = isListContains(openList, x, y)) != -1) {// G值是否更小,即是否更新G,F值if ((parentNode.getG() + cost) < openList.get(index).getG()) {node.setParentNode(parentNode);countG(node, eNode, cost);countF(node);openList.set(index, node);}} else {// 添加到开启列表中node.setParentNode(parentNode);count(node, eNode, cost);openList.add(node);}return true;}// 集合中是否包含某个元素(-1:没有找到,否则返回所在的索引)private int isListContains(List<Node> list, int x, int y) {for (int i = 0; i < list.size(); i++) {Node node = list.get(i);if (node.getX() == x && node.getY() == y) {return i;}}return -1;}// 从终点往返回到起点private void getPath(List<Node> resultList, Node node) {if (node.getParentNode() != null) {getPath(resultList, node.getParentNode());}resultList.add(node);}// 计算G,H,F值private void count(Node node, Node eNode, int cost) {countG(node, eNode, cost);countH(node, eNode);countF(eNode);}// 计算G值private void countG(Node node, Node eNode, int cost) {if (node.getParentNode() == null) {node.setG(cost);} else {node.setG(node.getParentNode().getG() + cost);}}// 计算H值private void countH(Node node, Node eNode){int x = Math.abs(node.getX() - eNode.getX());int y = Math.abs(node.getY() - eNode.getY());if(x<y){node.setH(x * COST_DIAGONAL + (y-x) * COST_STRAIGHT);}else{node.setH(y * COST_DIAGONAL + (x-y) * COST_STRAIGHT);}}// 计算F值private void countF(Node node) {node.setF(node.getG() + node.getH());}public static void main(String[] args) {int[][] map=new int[][]{// 地图数组 {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1}, {1,1,1,1,0,1,1,1,1,1} }; AStar aStar=new AStar(map, 6, 10); int flag=aStar.search(4, 0, 3, 8); if(flag==-1){ System.out.println("传输数据有误!"); }else if(flag==0){ System.out.println("没找到!"); }else{ for(int x=0;x<6;x++){ for(int y=0;y<10;y++){ if(map[x][y]==1){ System.out.print(" "); }else if(map[x][y]==0){ System.out.print("〓"); }else if(map[x][y]==-1){ System.out.print("※"); } } System.out.println(); } } }}// 节点类class Node {private int x;// X坐标private int y;// Y坐标private Node parentNode;// 父类节点private int g;// 当前点到起点的移动耗费private int h;// 当前点到终点的移动耗费,即曼哈顿距离|x1-x2|+|y1-y2|(忽略障碍物)private int f;// f=g+hpublic Node(int x, int y, Node parentNode) {this.x = x;this.y = y;this.parentNode = parentNode;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public Node getParentNode() {return parentNode;}public void setParentNode(Node parentNode) {this.parentNode = parentNode;}public int getG() {return g;}public void setG(int g) {this.g = g;}public int getH() {return h;}public void setH(int h) {this.h = h;}public int getF() {return f;}public void setF(int f) {this.f = f;}}// 节点比较类class NodeFComparator implements Comparator<Node> {@Overridepublic int compare(Node o1, Node o2) {return o1.getF() - o2.getF();}}
参考 : http://www.raywenderlich.com/4946/introduction-to-a-pathfinding
0 0
- A星算法——Java修正版
- java调用groovy类——修正版
- Java常用排序算法总结(原文修正版)
- Java版A星算法
- Java版A星算法
- Java版A星算法
- Java版A星算法
- 查找算法——找到序列中第二大的数(修正版)
- 算法基础——1.3假设修正法
- 算法基础——1.3假设修正法
- 蓝桥杯 算法提高 c++_ch04_02_修正版
- 算法提高 c++_ch04_02_修正版
- A*(也叫A star, A星)寻路算法Java版
- A*(也叫A star, A星)寻路算法Java版
- A*(也叫A star, A星)寻路算法-Java版
- 修正单纯形法·优化算法实现·Java
- L-BFGS算法的JAVA实现,,部分代码!(修正)
- [Java学习] A星算法Java实现
- java中的注解
- [LeetCode]Binary Tree Postorder Traversal
- Unity3D A 星寻路(A*) C# 版本
- 杭电oj1002解题
- 一个程序明白buddy算法
- A星算法——Java修正版
- Unity3D 使用 A 星寻路(摄像机移动、缩放优化)
- 一些有用的Latex模板(持续更新)
- 黑马程序员——03-类和对象
- 收评:变盘缩量调整,控制仓位为宜
- Anagrams -- leetcode
- 【递推】【HDU2585】【hotel】
- 借钱的原则和向别人借钱的技巧
- ubuntu 14.04 32位系统装pps影音