a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版 | 学步园
寻路
首先要理解什么是A*寻路算法,可以参考这三篇文章:
下面为测试地图,0表示可以通行,1表示障碍物:
要从点(5, 1)到点(5, 5),通过A*寻路算法找到以路径为@所示:
在代码中可以修改障碍物,起点和终点来测试算法。
最后代码:
import java.util.ArrayList;
import java.util.List;
public class AStar {
public static final int[][] NODES = {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};
public static final int STEP = 10;
private ArrayList openList = new ArrayList();
private ArrayList closeList = new ArrayList();
public Node findMinFNodeInOpneList() {
Node tempNode = openList.get(0);
for (Node node : openList) {
if (node.F < tempNode.F) {
tempNode = node;
}
}
return tempNode;
}
public ArrayList findNeighborNodes(Node currentNode) {
ArrayList arrayList = new ArrayList();
// 只考虑上下左右,不考虑斜对角
int topX = currentNode.x;
int topY = currentNode.y - 1;
if (canReach(topX, topY) && !exists(closeList, topX, topY)) {
arrayList.add(new Node(topX, topY));
}
int bottomX = currentNode.x;
int bottomY = currentNode.y + 1;
if (canReach(bottomX, bottomY) && !exists(closeList, bottomX, bottomY)) {
arrayList.add(new Node(bottomX, bottomY));
}
int leftX = currentNode.x - 1;
int leftY = currentNode.y;
if (canReach(leftX, leftY) && !exists(closeList, leftX, leftY)) {
arrayList.add(new Node(leftX, leftY));
}
int rightX = currentNode.x + 1;
int rightY = currentNode.y;
if (canReach(rightX, rightY) && !exists(closeList, rightX, rightY)) {
arrayList.add(new Node(rightX, rightY));
}
return arrayList;
}
public boolean canReach(int x, int y) {
if (x >= 0 && x < NODES.length && y >= 0 && y < NODES[0].length) {
return NODES[x][y] == 0;
}
return false;
}
public Node findPath(Node startNode, Node endNode) {
// 把起点加入 open list
openList.add(startNode);
while (openList.size() > 0) {
// 遍历 open list ,查找 F值最小的节点,把它作为当前要处理的节点
Node currentNode = findMinFNodeInOpneList();
// 从open list中移除
openList.remove(currentNode);
// 把这个节点移到 close list
closeList.add(currentNode);
ArrayList neighborNodes = findNeighborNodes(currentNode);
for (Node node : neighborNodes) {
if (exists(openList, node)) {
foundPoint(currentNode, node);
} else {
notFoundPoint(currentNode, endNode, node);
}
}
if (find(openList, endNode) != null) {
return find(openList, endNode);
}
}
return find(openList, endNode);
}
private void foundPoint(Node tempStart, Node node) {
int G = calcG(tempStart, node);
if (G < node.G) {
node.parent = tempStart;
node.G = G;
node.calcF();
}
}
private void notFoundPoint(Node tempStart, Node end, Node node) {
node.parent = tempStart;
node.G = calcG(tempStart, node);
node.H = calcH(end, node);
node.calcF();
openList.add(node);
}
private int calcG(Node start, Node node) {
int G = STEP;
int parentG = node.parent != null ? node.parent.G : 0;
return G + parentG;
}
private int calcH(Node end, Node node) {
int step = Math.abs(node.x - end.x) + Math.abs(node.y - end.y);
return step * STEP;
}
public static void main(String[] args) {
Node startNode = new Node(5, 1);
Node endNode = new Node(5, 5);
Node parent = new AStar().findPath(startNode, endNode);
for (int i = 0; i < NODES.length; i++) {
for (int j = 0; j < NODES[0].length; j++) {
System.out.print(NODES[i][j] + ", ");
}
System.out.println();
}
ArrayList arrayList = new ArrayList();
while (parent != null) {
// System.out.println(parent.x + ", " + parent.y);
arrayList.add(new Node(parent.x, parent.y));
parent = parent.parent;
}
System.out.println("\n");
for (int i = 0; i < NODES.length; i++) {
for (int j = 0; j < NODES[0].length; j++) {
if (exists(arrayList, i, j)) {
System.out.print("@, ");
} else {
System.out.print(NODES[i][j] + ", ");
}
}
System.out.println();
}
}
public static Node find(List nodes, Node point) {
for (Node n : nodes)
if ((n.x == point.x) && (n.y == point.y)) {
return n;
}
return null;
}
public static boolean exists(List nodes, Node node) {
for (Node n : nodes) {
if ((n.x == node.x) && (n.y == node.y)) {
return true;
}
}
return false;
}
public static boolean exists(List nodes, int x, int y) {
for (Node n : nodes) {
if ((n.x == x) && (n.y == y)) {
return true;
}
}
return false;
}
public static class Node {
public Node(int x, int y) {
this.x = x;
this.y = y;
}
public int x;
public int y;
public int F;
public int G;
public int H;
public void calcF() {
this.F = this.G + this.H;
}
public Node parent;
}
}
a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版 | 学步园相关推荐
- a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版
寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法. 首先要理解什么是A*寻路算法,能够參考这三篇文章: 以下为測试地图.0表示能够通行,1表示障碍物: 要从点(5, 1)到点(5, 5).通过A ...
- java 求最大公因数_三种算法求最大公约数——Java实现 | 学步园
求两个自然数m和n的最大公约数. 连续整除检测: 1. t=min{m,n}: 2. m除以t,如果余数为0,则执行步骤3,否则,执行步骤4: 3. n除以t,如果余数为0,返回t的值作为结果,否则, ...
- 算法-------无重复字符的最长子串(Java版)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc& ...
- cubic算法优化_TCP拥塞控制算法 — CUBIC的补丁(七) | 学步园
描述 以下是提交者Stephen Hemminger对这个patch的描述: limit delayed_ack ratio to prevent divide error TCP Cubic kee ...
- 左神算法:将搜索二叉树转换成双向链表(Java版)
本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...
- 左神算法:环形单链表的约瑟夫问题(Java版)
本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...
- dij算法堆优化_BZOJ 3040 最短路(road) 堆优化Dijkstra | 学步园
题目大意:最短路. 思路:最短路. 贴一份比较高效的堆优化Dij模板吧. CODE: #include #include #include #include #define _MAX 1000010 ...
- 左神算法:如何较为直观地打印二叉树(Java版)
本题来自左神<程序员代码面试指南>"如何较为直观地打印二叉树"题目. 题目 二叉树可以用常规的三种遍历结果来描述其结构,但是不够直观,尤其是二叉树中有重复值的时候,仅通 ...
- 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
最新文章
- mysql isreg_`Innodb` MySQL中如何优雅的删除大表跑路
- dede5.7 GBK 在php5.4环境下 后台编辑器无法显示文章内容
- iOS知识小集·NSNumber to NSString出错啦
- Android学习——自定义控件(二)
- 中国邮政编码.html,全国邮政编码一览表.doc
- python基础语法-三大内建数据结构之字典(dict)
- 发布服务器 bugzilla, streber 数据库备份方案
- 《游戏行业DDoS攻击解决方案》重磅发布
- static详解java_java中static作用详解
- 斐波那契数的皮萨诺周期
- Golang的聊天服务器实践(群聊,广播)(一)
- 【Codeforces Round #544 (Div. 3)】K Balanced Teams【线性DP】
- 如何制作学术Poster?
- 快速做出3D人物动画
- 触发器在计算机中的作用,d触发器的原理是什么_d触发器的功能及作用
- 《平凡的世界》(书评)
- 编程之类的文案_最萌编程高手是这样炼成的
- js 获取图片经纬度及写经纬度
- 计算机无法识别3.0u盘启动,USB3.0接口不能识别U盘的解决方法
- 为K8S集群申请Let‘s Encrypt证书
热门文章
- .NET Core 批量重置 Azure Blob Storage 的 mime type
- .Net资讯 | 一大波开发者福利来了, 一份微软官方Github上发布的开源项目清单等你签收...
- PCB 机器学习(ML.NET)初体验实现PCB加投率预测
- 一份来自28岁.NET老程序员的自白
- ASP.NET CORE MVC 实现减号分隔(Kebab case)样式的 URL
- 【直播 】ASP.NET Core解密底层设计逻辑
- Visual Studio 2017 已知问题 Qamp;amp;A
- Android之在一个类里面注册Handler发送消息在另外一个类里面接收消息
- Android之手机出现已安装了存在签名冲突的同名数据包的原因及解决办法
- 中科大镜像源_JETPACK4.4安装软件和备份镜像的方法介绍