java astar_JAVA-Astar算法实现

本文介绍了如何使用JAVA实现A*寻径算法,包括主要公式F=G+H的解释,以及算法的具体步骤。通过创建AStarRule类并实现Runnable接口,详细展示了算法的核心代码,包括开启列表的排序、加入和查找,以及路径查找的过程。代码中还包含对周围点阵的F、G、H值的计算,以及对最小子F值的持续查找,直到找到目标点阵为止。
摘要由CSDN通过智能技术生成

JAVA实现Astar寻径算法:

此算法的主要公式:F=G+H

* G = 从起点,沿着产生的路径,移动到网格上指定方格的移动耗费。

* H = 从此点阵到结束点阵的预估移动耗费,这被称为开启式的。

* F = 等G+H的值,表示的一个权重值。

首先将开始点存入到开启列表当中(待检查的点),检查开始点,将周围的点阵的F,G,H值算出,将周围点阵加入到开启列表当中,将周围点阵的父节点指向当前查找的节点,然后将开启列表排序,查找到下一个最小的F值进行路径查找,以此类推,只到找结束点阵为止。

当路径查找到结束点时,就通过结束点在闭合列表当中查找它指向的父节点为路径加到路径列表当中,再通过查找的节点指向的父节点为路径加到路径列表当中,以此类推以找到父节点指各的是开始节点为止,此算法就结束。以上只是大概的讲解了一下Astar算法的原则。有兴趣可以到网上去查找资料,或者与我共同讨论和学习。我的QQ:565345652。

下面是我用JAVA实现的Astar的截图

91053b09f76b56a805b840acf1e85eda.png

062d4998ac2d66d716efe27e0e99e7e3.png

JAVA 实现Astar的核心代码:

/*

* Astar算法实现的类

* */

package com.smq.astar;

public class AStarRule implements Runnable

{

private Testastar ta=null; //拿界面对象的一个引用

private boolean astar_ok=false; //Astar算法是否成功找到

private AstarObject minao; //开启列表查找的对象引用

/*

* 构造一个Astar算法

* */

public AStarRule(Testastar ta)

{

ta.setStart(System.currentTimeMillis());

this.ta=ta;

minao=ta.getStart_ao();

setAstar(ta.getStart_ao());

}

/*

* 运行Astar算法进行查找路径

* */

public void run()

{

System.out.println("astar");

while(!astar_ok)

{

System.out.println("astar");

if(ta.getOpenlistaos().size()==0)

{

astar_ok=true;

ta.setAstar_ok(true);

ta.getGb().setString("-还原-");

ta.setEnd(System.currentTimeMillis());

System.out.println("所用时间:"+(ta.getEnd()-ta.getStart())/1000.0);

}

System.out.println("open"+ta.getOpenlistaos().size());

System.out.println("close"+ta.getCloselistaos().size());

if(ta.getOpenlistaos().size()>=2)

{

Array();

for(int i=1;i<=4;i++)

{

this.LoadingOpenList(i);

minao.setOpenlist_ao(false);

minao.setCloselist_ao(true);

ta.getCloselistaos().add(minao);

ta.getOpenlistaos().remove(minao);

}

}else if(ta.getOpenlistaos().size()!=0)

{

minao=ta.getOpenlistaos().get(0);

for(int i=1;i<=4;i++)

{

this.LoadingOpenList(i);

minao.setOpenlist_ao(false);

minao.setCloselist_ao(true);

ta.getCloselistaos().add(minao);

ta.getOpenlistaos().remove(minao);

}

}

try {

Thread.sleep(ta.getSpeed());

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

/*

* 排列开启列表

* */

public void Array()

{

AstarObject maxao;

minao=ta.getOpenlistaos().get(0);

for(int i=0;i<ta.getOpenlistaos().size()-1;i++)

{

maxao=ta.getOpenlistaos().get(i);

if(minao.getAstarF()>=maxao.getAstarF())

{

minao=maxao;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值