a 寻路算法 java_A*(也叫A star, A星)寻路算法Java版
寻路算法有非常多种,A*寻路算法被公觉得最好的寻路算法。
首先要理解什么是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*寻路算法,可以参考这三篇文章: 下面为测试地图,0表示可以通行,1表示障碍物: 要从点(5, 1)到点(5, 5),通过A*寻路算法找到以路径为@所示: 在代码中可以修改障碍 ...
- 算法-------无重复字符的最长子串(Java版)
题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc& ...
- 左神算法:将搜索二叉树转换成双向链表(Java版)
本题来自左神<程序员代码面试指南>"将搜索二叉树转换成双向链表"题目. 题目 对二叉树的节点来说,有本身的值域,有指向左孩子节点和右孩子节点的两个指针:对双向链表的节点 ...
- 左神算法:环形单链表的约瑟夫问题(Java版)
本题来自左神<程序员面试代码指南>"环形单链表的约瑟夫问题"题目. 题目 据说,著名犹太历史学家 Josephus 有过以下故事: 在罗马人占领乔塔帕特后,39 个犹太 ...
- 左神算法:如何较为直观地打印二叉树(Java版)
本题来自左神<程序员代码面试指南>"如何较为直观地打印二叉树"题目. 题目 二叉树可以用常规的三种遍历结果来描述其结构,但是不够直观,尤其是二叉树中有重复值的时候,仅通 ...
- 棋盘覆盖算法java_棋盘覆盖问题(算法分析)(Java版)
1.问题描述: 在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为一特殊方格,且称该棋盘为一个特殊棋盘.显然特殊方格在棋盘上出现的位置有种情形.因而对任何 k≥0,有4k种不 ...
- SAR成像系列:【9】合成孔径雷达(SAR)成像算法-波数域(omega-K)成像算法[也叫距离徙动(RM)算法](附Matlab代码)
波数域()成像算法作为本系列的最后一种成像算法介绍.关于SAR成像的其他的各种改进算法就不一一列举了.在实际成像中,万变不离其踪,最主要的是关注成像的几何模型,再根据指标选择不同的基础成像算法,然后进 ...
- 程序员的算法趣题:Q13 有多少种满足字母算式的解法(Java版)
题目说明 所谓字母算式,就是用字母表示的算式, 规则是相同字母对应相同数字,不同字母对应不同数字, 并且第一位字母的对应数字不能是 0. 譬如给定算式 We * love = CodeIQ,则可以对应 ...
- 贪吃蛇AI算法中的A star寻路算法
A*寻路算法 在之前的贪吃蛇游戏比赛里,计算蛇吃食物路径时要用到寻路算法,于是就去了解了一下,以下是我的算法演化过程. 1.简单寻路–按图索骥 我一开始想到的方法就是最简单的:目标在哪个方位就往哪个方 ...
最新文章
- 基于机器学习梯度下降优化算法来寻找最佳的线性回归模型
- 非洲儿童(南阳oj1036)(馋)
- python编写自定义模块_编写和导入自定义模块/类
- Day 06 元组,字典,集合
- 控件多线程访问的问题
- Atitit 网络技术体系图 目录 1. 的三网融合是	1 1.1. 电话网、有线电视网	1 1.2. 计算机网	1 2. 计算机网	1 2.1. 互联网	1 2.2. 局域网	1 3. 第1章 计
- 在线留痕阅卷系统功能说明及其演示
- Java mail 接受网易126和163邮件时数目不全
- 如何彻底删除电脑上的软件
- ME3616-OPENCPU完整调试笔记
- 2021中国AI产业10大趋势,一分钟看明白 | WAIC2021
- 求整型和浮点型绝对值的方法
- 高质量程序设计指南:C++/C语言
- Java架构师成长之路
- 解决el-table固定列在ios系统出现的问题
- authorize(权限验证)
- 脾胃不好,有哪些在家可以做的暖胃汤方?
- 几款特别好看的springboot快速开发模板
- IDEA中JAVA代码调试技巧
- Rx第三部分--深入序列