A*Star 最短路径算法的Java实现

Node* p = new Node();与new Node; int main() { Node* p = new Node(); cout << p->data << endl;//0 p->data = 9; cout << p->data << endl;//9 Node* p2 = new Node; cout << p2->data << endl;//不确定 p2->data = 91; cout << p2->data 阅读详情

运行效果如下

 

 
package test.star;
import java.awt.Point;
import java.util.LinkedList;
/** */
/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:描述路径节点用类
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: 
http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class Node implements Comparable {
  
// 坐标
  public Point _pos;
  
// 开始地点数值
  public int _costFromStart;
  
// 目标地点数值
  public int _costToObject;
  
// 父节点
  public Node _parentNode;
  
private Node() {
  }

  
/** */
  
/**
   * 以注入坐标点方式初始化Node
   * 
   * 
@param _pos
   
*/

  
public Node(Point _pos) {
    
this._pos = _pos;
  }

  
/** */
  
/**
   * 返回路径成本
   * 
   * 
@param node
   * 
@return
   
*/

  
public int getCost(Node node) {
    
// 获得坐标点间差值 公式:(x1, y1)-(x2, y2)
    int m = node._pos.x - _pos.x;
    
int n = node._pos.y - _pos.y;
    
// 取两节点间欧几理德距离(直线距离)做为估价值,用以获得成本
    return (int) Math.sqrt(m * m + n * n);
  }

  
/** */
  
/**
   * 检查node对象是否和验证对象一致
   
*/

  
public boolean equals(Object node) {
    
// 验证坐标为判断依据
    if (_pos.x == ((Node) node)._pos.x && _pos.y == ((Node) node)._pos.y) {
      
return true;
    }

    
return false;
  }

  
/** */
  
/**
   * 比较两点以获得最小成本对象
   
*/

  
public int compareTo(Object node) {
    
int a1 = _costFromStart + _costToObject;
    
int a2 = ((Node) node)._costFromStart + ((Node) node)._costToObject;
    
if (a1 < a2) {
      
return -1;
    }
 else if (a1 == a2) {
      
return 0;
    }
 else {
      
return 1;
    }

  }

  
/** */
  
/**
   * 获得上下左右各点间移动限制区域
   * 
   * 
@return
   
*/

  
public LinkedList getLimit() {
    LinkedList limit 
= new LinkedList();
    
int x = _pos.x;
    
int y = _pos.y;
    
// 上下左右各点间移动区域(对于斜视地图,可以开启注释的偏移部分,此时将评估8个方位)
    
// 上
    limit.add(new Node(new Point(x, y - 1)));
    
// 右上
    
// limit.add(new Node(new Point(x+1, y-1)));
    
// 右
    limit.add(new Node(new Point(x + 1, y)));
    
// 右下
    
// limit.add(new Node(new Point(x+1, y+1)));
    
// 下
    limit.add(new Node(new Point(x, y + 1)));
    
// 左下
    
// limit.add(new Node(new Point(x-1, y+1)));
    
// 左
    limit.add(new Node(new Point(x - 1, y)));
    
// 左上
    
// limit.add(new Node(new Point(x-1, y-1)));
    return limit;
  }

}

 

 
package test.star;
import java.awt.Point;
import java.util.LinkedList;
import java.util.List;
/** */
/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:A*寻径处理用类(此类为演示用,并不意味着算法是最佳实现)
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: 
http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class PathFinder {
  
// 路径优先等级list(此示例中为内部方法)
  private LevelList _levelList;
  
// 已完成路径的list
  private LinkedList _closedList;
  
// 地图描述
  private int[][] _map;
  
// 行走区域限制
  private int[] _limit;
  
/** */
  
/**
   * 以注入地图的2维数组及限制点描述初始化此类
   * 
   * 
@param _map
   
*/

  
public PathFinder(int[][] map, int[] limit) {
    _map 
= map;
    _limit 
= limit;
    _levelList 
= new LevelList();
    _closedList 
= new LinkedList();
  }

  
/** */
  
/**
   * A*方式寻径,注入开始坐标及目标坐标后运算,返回可行路径的List
   * 
   * 
@param startPos
   * 
@param objectPos
   * 
@return
   
*/

  
public List searchPath(Point startPos, Point objectPos) {
    
// 初始化起始节点与目标节点
    Node startNode = new Node(startPos);
    Node objectNode 
= new Node(objectPos);
    
// 设定起始节点参数
    startNode._costFromStart = 0;
    startNode._costToObject 
= startNode.getCost(objectNode);
    startNode._parentNode 
= null;
    
// 加入运算等级序列
    _levelList.add(startNode);
    
// 当运算等级序列中存在数据时,循环处理寻径,直到levelList为空
    while (!_levelList.isEmpty()) {
      
// 取出并删除最初的元素
      Node firstNode = (Node) _levelList.removeFirst();
      
// 判定是否和目标node坐标相等
      if (firstNode.equals(objectNode)) {
        
// 是的话即可构建出整个行走路线图,运算完毕
        return makePath(firstNode);
      }
 else {
        
// 否则
        
// 加入已验证List
        _closedList.add(firstNode);
        
// 获得firstNode的移动区域
        LinkedList _limit = firstNode.getLimit();
        
// 遍历
        for (int i = 0; i < _limit.size(); i++) {
          
// 获得相邻节点
          Node neighborNode = (Node) _limit.get(i);
          
// 获得是否满足等级条件
          boolean isOpen = _levelList.contains(neighborNode);
          
// 获得是否已行走
          boolean isClosed = _closedList.contains(neighborNode);
          
// 判断是否无法通行
          boolean isHit = isHit(neighborNode._pos.x, neighborNode._pos.y);
          
// 当三则判定皆非时
          if (!isOpen && !isClosed && !isHit) {
            
// 设定costFromStart
            neighborNode._costFromStart = firstNode._costFromStart + 1;
            
// 设定costToObject
            neighborNode._costToObject = neighborNode.getCost(objectNode);
            
// 改变neighborNode父节点
            neighborNode._parentNode = firstNode;
            
// 加入level
            _levelList.add(neighborNode);
          }

        }

      }

    }

    
// 清空数据
    _levelList.clear();
    _closedList.clear();
    
// 当while无法运行时,将返回null
    return null;
  }

  
/** */
  
/**
   * 判定是否为可通行区域
   * 
   * 
@param x
   * 
@param y
   * 
@return
   
*/

  
private boolean isHit(int x, int y) {
    
for (int i = 0; i < _limit.length; i++) {
      
if (_map[y][x] == _limit[i]) {
        
return true;
      }

    }

    
return false;
  }

  
/** */
  
/**
   * 通过Node制造行走路径
   * 
   * 
@param node
   * 
@return
   
*/

  
private LinkedList makePath(Node node) {
    LinkedList path 
= new LinkedList();
    
// 当上级节点存在时
    while (node._parentNode != null) {
      
// 在第一个元素处添加
      path.addFirst(node);
      
// 将node赋值为parent node
      node = node._parentNode;
    }

    
// 在第一个元素处添加
    path.addFirst(node);
    
return path;
  }

  
private class LevelList extends LinkedList {
    
/** */
    
/**
     * 
     
*/

    
private static final long serialVersionUID = 1L;
    
/** */
    
/**
     * 增加一个node
     * 
     * 
@param node
     
*/

    
public void add(Node node) {
      
for (int i = 0; i < size(); i++) {
        
if (node.compareTo(get(i)) <= 0) {
          add(i, node);
          
return;
        }

      }

      addLast(node);
    }

  }

}

 

 
package test.star;
import java.awt.Graphics;
import java.awt.Image;
import java.io.File;
import java.io.IOException;
/** */
/**
 * <p>
 * Title: LoonFramework
 * </p>
 * <p>
 * Description:一个简单的地图实现
 * </p>
 * <p>
 * Copyright: Copyright (c) 2008
 * </p>
 * <p>
 * Company: LoonFramework
 * </p>
 * <p>
 * License: 
http://www.apache.org/licenses/LICENSE-2.0
 * </p>
 * 
 * 
@author chenpeng
 * @email:ceponline@yahoo.com.cn
 * 
@version 0.1
 
*/

public class TestMap {
  
final static private int CS = 32;
  
// 地图描述
  final static public int[][] MAP = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
      
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
      
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }
;
  
// 无法移动区域
  final static public int[] HIT = { 1 };
  
// 设定背景方格默认行数
  final static private int ROW = 15;
  
// 设定背景方格默认列数
  final static private int COL = 15;
  
private Image floorImage;
  
private Image wallImage;
  
public TestMap() {
    
try {
      floorImage 
= javax.imageio.ImageIO.read(new File("floor.gif"));
      wallImage 
= javax.imageio.ImageIO.read(new File("wall.gif"));
    }
 catch (IOException e) {
      
// TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

  
public void draw(Graphics g) {
    
for (int i = 0; i < ROW; i++) {
      
for (int j = 0; j < COL; j++) {
        
switch (MAP[i][j]) {
        
case 0:
          g.drawImage(floorImage, j 
* CS, i * CS, null);
          
break;
        
case 1:
          g.drawImage(wallImage, j 
* CS, i * CS, null);
          
break;
        }

      }

    }

  }

}







<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>

JAVA:实现A-Star求解最短路最有效的算法(附完整源码) 阅读详情

相关推荐

JAVA实现的A*算法

利用JAVA语言编程实现的经典A*算法,复制到eclipse即可运行

【运筹优化】最短路算法之A星算法 + Java代码实现

A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。

知不足而奋进,望远山而前行 2364

A_Star.zip

菜鸡写的Astar算法的java实现版本,参考了哈佛的CS50公开课,自带VScode配置文件,应该可以直接运行。

A* (A Star) 算法 java实现

A*算法的性能和效果取决于所选择的估计函数。一个好的估计函数应该能够提供较为准确的估计值,以便更好地引导搜索,但也需要具备一定的效率,以免过多地增加计算复杂度。算法综合了Dijkstra算法的广度优先搜索和贪婪最优搜索策略,通过使用估计函数(heuristic function)来指导搜索方向,从而提高搜索效率。算法的优点是在适当的估计函数下,能够找到最短路径,并且相对于其他完全搜索算法,它的搜索效率更高。A*算法使用了一个估计函数来指导搜索,在每次选择下一个节点时,它考虑了两个值:g值和h值。

m0_59745374的博客 1120

Java实现的等距网格A-Star最短路径规划

基于SpringBoot框架,对外接口需要POST二位矩阵的横纵坐标数量、起始点坐标、障碍点坐标。

STM32 HAL库 实现基于SPI模式的SD卡、TF卡FATS文件系统+模拟U盘的应用笔记

很多单片机不带SDIO接口,所以在使用SD卡时必须使用SPI模式进行读写。 想做一个基于SPI的SD卡文件系统读写SD卡上的文件,再配合USB接口做一个模拟U盘。只能利用业余时间慢慢更新,也不知道能不能坚持下去。 我会把从零开始开发一个程序需要经历的过程一一的记录下来。做成一个奶妈级的单片机开发笔记。 一、硬件简介 1.SD卡和MicroSD卡(TF卡)的区别 由下图可以很容易的看出TF卡只是比SD卡少了一个3脚Vss脚,其它的管脚顺序

KyleKuang的博客 8334

SunnyUI 控件库实战:WinForm 桌面应用界面统一与美化指南

桌面应用开发中,界面体验与功能实现同等重要。WinForm 作为成熟的 C# 桌面技术栈,稳定易维护,但原生控件在外观风格、高 DPI 适配、深色主题支持等方面存在明显短板。引入合适的 UI 控件库,是快速提升界面质感并统一交互风格的有效方式。SunnyUI 是一套纯 C# 实现的 WinForm 控件库,覆盖 .NET Framework 4.0 到 .NET 8,内置七十多个自绘控件,支持全局主题切换、高 DPI 适配、窗体美化与常用数据展示组件。对于后台管理系统、企业内部工具、工业上位机等典型桌面应用

weixin_34258838的博客 450

AI赋能工业自动化:传感器大数据实战

工业自动化中AI与传感器大数据的结合,显著提升了生产效率与可靠性。关键技术包括实时数据处理、边缘计算和数字孪生,未来将进一步向自主决策系统演进。

AFAGA_x的博客 414

java做a_Java编程实现A*算法完整代码

前言A*搜寻算法俗称A星算法。这是一种在图形平面上,有多个节点的路径,求出最低通过成本的算法。常用于游戏中通过二维数组构建的一个迷宫,“%”表示墙壁,A为起点,B为终点,“#”代表障碍物,“*”代表算法计算后的路径本文实例代码结构:% % % % % % %% o o o o o %% o o # o o %% A o # o B %% o o # o o %% o o o o o %% % % ...

weixin_39520393的博客 477

Python xlwings报错解决:从‘NoneType‘到完美运行WPS表格的完整指南

本文深入解析了使用Python xlwings库自动化WPS表格时遇到的经典'NoneType'报错(AttributeError: 'NoneType' object has no attribute 'apps')的根源与解决方案。核心在于pywin32版本与WPS的兼容性问题,文章提供了从版本降级、依赖管理到构建健壮自动化环境的完整实战指南,帮助开发者彻底解决兼容性难题,实现稳定运行。

n4o5p6q7r的博客 303

天融信防火墙NGFW4000(TG-4628)安装配置笔记

配置一台全新的天融信防火墙NGFW4000,配置完后,内网用户10.10.1.0/24和10.10.2.0/24可以通过防火墙上网,外网用户可以通过访问防火墙的外网接口地址来访问内网的WEB服务器10.10.1.200,并且内网用户也可以通过WEB服务器的外网地址进行访问。 网络说明: 防火墙外网接口地址:218.90.123.121/30 防火墙内网接口地址:19...

weixin_33671935的博客 4455

Java中的A*(A star)寻径实现

据我个人所知,目前流行的寻径方法大体有两种,即A* 和Dijkstra(SP算法)Dijkstra算法:            由Edsger Wybe Dijkstra先生发明(已故)    Dijkstra算法是典型的最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点

【Java究竟怎么玩?】 1万+

RK3588开发笔记-spi扩展canfd芯片MCP2518FD调试笔记

在嵌入式系统开发中,CANFD(控制器局域网灵活数据速率)是一种广泛应用于汽车和工业自动化领域的通信协议。为了满足项目需求,我们在RK3588平台上通过SPI接口扩展了CANFD芯片MCP2518FD,之所以用spi进行canfd扩展,是为了解决原生RK3588原生can不够稳定的问题(发送扩展帧有几率编程标准帧,RK3568/3588均存在该问题)。通过本次调试工作,我们成功地在RK3588平台上扩展了CANFD芯片MCP2518FD,并实现了与CAN总线的稳定通信。

flypig has a dream! 4225

A*算法的一种Java实现

A*算法,A*(A-Star)算法是一种静态路网中求解最短路最有效的方法。估价值与实际值越接近,估价函数取得就越好。

一个测试工程师的代码世界 1104

史上最牛逼的导航网站(很全很详细)

今天,给大家推荐47个聚合型的导航网站 每一个都收录上百个网站,1个能顶100个,丝毫没有夸张的成分。 (推荐收藏) 设计师导航网站 01 优设导航 https://hao.uisdc.com/ 设计师必备的导航网站,包含设计工具、素材资源、字体设计、配色方案、酷站模板等。 界面清晰无广告,收录网站超过520个。 02 设计导航 http://h...

孙叫兽的博客 7万+

[QMT量化交易小白入门]-二十四、年化收益47%的全球核心资产轮动策略(含代码解析)

m_days = 25 #动量参考天数period=200m_days被设置为25,表示动量参考的天数为25天;period被设置为200,用于指定获取市场数据的周期长度。

木头大左的博客 2968

A Star 最短路径算法的Java实现

A Star 最短路径算法的Java实现

jgfyyfd的博客 289

智能车图像处理14-进阶篇6--坡道的判定

这篇文章主要讲述智能车图像处理中 : 如何判断坡道

taiyuezyh的博客 9228

使用A Star 算法实现自动寻路详解

寻路,嗯~

是江迪呀 的博客 4243

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java 根号_用Java实现A*算法,带你解析搜索核心算法!

A*算法,A*(A-Star)算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快,它常用于游戏中。通过二维数组构建的一个迷宫,“%”表示墙壁,A为起点,B为终点,“#”代表障碍物,“*”代表算法计算后的路径。代码结构图如下:小编整理了一份java学习资料,私信回复【01】,获取源码。算法的核心公式为:F=G+H把地...

weixin_39765339的博客 182

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

JAVA:实现A-Star求解最短路最有效的算法(附带源码)

JAVA:实现A-Star求解最短路最有效的算法(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1473

Java中的A A star 寻径实现

Java中的A A star 寻径实现

qq_44906416的博客 288

java a star 算法,手撸golang 基本数据结构与算法 图的最短路径 A*(A-Star)算法

缘起最近阅读<>(【日】石田保辉;宫崎修一)本系列笔记拟采用golang练习之A*(A-Star)算法A*(A-Star)算法也是一种在图中求解最短路径问题的算法,由狄克斯特拉算法发展而来。A*算法不仅会考虑从起点到候补顶点的距离,还会考虑从当前所在顶点到终点的估算距离。距离估算值越接近当前顶点到终点的实际值,A*算法的搜索效率也就越高.当距离估算值小于实际距离时,是一定可以得到正确答...

weixin_39774490的博客 275

a star java_A*(也叫A star, A星)寻路算法Java版

寻路算法有很多种,A*寻路算法被公认为最好的寻路算法。首先要理解什么是A*寻路算法,可以参考这三篇文章:http://www.gamedev.net/page/resources/_/technical/artificial-intelligence/a-pathfinding-for-beginners-r2003(英文)http://www.cppblog.com/christanxw/arc...

weixin_42177768的博客 361

A Star Search算法(含Java源代码)

本来还想写一起的,但还是分开的,这个思路网上的都是一样的,就是实现不相同,t=N7T8A*搜索算法-优快云博客https://blog.youkuaiyun.com/weixin_64066303/article/details/133325621?

充满焦虑的大学生 774
上一篇: 庆祝自己在优快云的回帖量达到5000个
下一篇: 用户注册后,使用激活码的Java实现
老紫竹
博客等级 码龄19年 1万+粉丝 1252原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值