JAVA实现Astar寻径算法:
此算法的主要公式:F=G+H
* G = 从起点,沿着产生的路径,移动到网格上指定方格的移动耗费。
* H = 从此点阵到结束点阵的预估移动耗费,这被称为开启式的。
* F = 等G+H的值,表示的一个权重值。
首先将开始点存入到开启列表当中(待检查的点),检查开始点,将周围的点阵的F,G,H值算出,将周围点阵加入到开启列表当中,将周围点阵的父节点指向当前查找的节点,然后将开启列表排序,查找到下一个最小的F值进行路径查找,以此类推,只到找结束点阵为止。
当路径查找到结束点时,就通过结束点在闭合列表当中查找它指向的父节点为路径加到路径列表当中,再通过查找的节点指向的父节点为路径加到路径列表当中,以此类推以找到父节点指各的是开始节点为止,此算法就结束。以上只是大概的讲解了一下Astar算法的原则。有兴趣可以到网上去查找资料,或者与我共同讨论和学习。我的QQ:565345652。
下面是我用JAVA实现的Astar的截图
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;
}