算法的java实现
package AStarAlgo;
import java.util.ArrayList;
import java.util.List;
/**
* <p> TODU </P>
*
* @author yeager
* @Version V1.1.1.0
* @date 2023/11/24 13:48
*/
public class AStarFindpathAlgo {
int Width = 20;
int Height = 20;
APoint startPoint = null;
APoint endPoint = null;
APoint minPoint = null;
APoint nowPoint = null;
List<APoint> OpenPts = new ArrayList<APoint>();
List<APoint> SurrondPts = new ArrayList<APoint>();
List<APoint> ClosePts = new ArrayList<APoint>();
List<APoint> WallPts = new ArrayList<APoint>();
public static void main (String[] args)
{
System.out.println("now we start!");
AStarFindpathAlgo algo = new AStarFindpathAlgo();
//初始化地图
//假设一个初始化
//开始点
algo.startPoint = new APoint();
algo.startPoint.x = 2;
algo.startPoint.y = 2;
//结束点
algo.endPoint = new APoint();
algo.endPoint.x = 6;
algo.endPoint.y = 2;
//设置墙
algo.WallPts.add(new APoint(4,1));
algo.WallPts.add(new APoint(4,2));
algo.WallPts.add(new APoint(4,3));
for(int i = 0; i < algo.WallPts.size(); i ++)
{
algo.ClosePts.add(algo.WallPts.get(i));
}
//开始执行算法
algo.excuteAlgo();
}
public AStarFindpathAlgo()
{
}
public void excuteAlgo()
{
System.out.println("now we start!");
//找到开始点的周边点,作为出发,设置基本信息,作为第一轮
findStartSurround(startPoint);
//将起始点加入关列表
ClosePts.add(startPoint);
//找到开列表中 F最小的值
while(true)
{
minPoint = findMinPt();
System.out.println("minPt:" +minPoint.x +", "+ minPoint.y );
removeFromOpenPts(minPoint);
nowPoint = minPoint;
ClosePts.add(minPoint);
finMinSurrond(minPoint);
refreshGValue(nowPoint);
if(OpenPts.size() <= 0 || findInOpenPts(endPoint))
break;
}
}
public void refreshGValue(APoint pt)
{
for(int i = 0 ; i < SurrondPts.size(); i++)
{
APoint surPt = SurrondPts.get(i);
if(findInOpenPts(surPt))
{
surPt.new_G = surPt.Sconst + pt.old_G ;
if(surPt.new_G < surPt.old_G)
{
surPt.father = pt;
surPt.old_G = surPt.new_G ;
surPt.G = surPt.new_G;
surPt.F = surPt.G +surPt.H;
}
}
else
{
surPt.new_G = pt.G + surPt.Sconst;
surPt.father = pt;
surPt.old_G = surPt.new_G ;
surPt.G = surPt.new_G;
surPt.H = 10*(Math.abs(surPt.x - endPoint.x)+ Math.abs(surPt.y - endPoint.y));
surPt.F = surPt.G +surPt.H;
OpenPts.add(surPt);
System.out.println("计算值:("+ surPt.x +","+surPt.y +")[father:("+surPt.father.x+ ","+ surPt.father.y +")]");
System.out.println("F:G:h---"+surPt.F+":"+surPt.G+":"+surPt.H);
}
}
}
public boolean findInOpenPts(APoint pt)
{
for(int i = 0; i < OpenPts.size();i++ )
{
if(pt.x == OpenPts.get(i).x &&pt.y == OpenPts.get(i).y)
{
return true;
}
}
return false;
}
public void removeFromOpenPts(APoint pt)
{
for(int i = 0; i < OpenPts.size();i++ )
{
if(pt.x == OpenPts.get(i).x &&pt.y == OpenPts.get(i).y)
{
OpenPts.remove(i);
}
}
}
public APoint findMinPt()
{
APoint minPoint = OpenPts.get(0);
for(int i = 1; i < OpenPts.size();i++)
{
if(minPoint.F > OpenPts.get(i).F)
{
minPoint = OpenPts.get(i);
}
}
return minPoint;
}
public void findStartSurround(APoint sPt)
{
SurrondPts.clear();
for(int i = -1; i < 2; i++)
{
for(int j = -1; j < 2; j++)
{
if(i ==0 && j ==0)
continue;
int sconst = 10;
if(Math.abs(i) == 1 &&Math.abs(j) == 1)
sconst = 14;
APoint pt = new APoint(sPt.x +i,sPt.y + j);
//判断一下是否超越了地图边界
if(pt.x < 0 || pt.y < 0 || pt.x >= Width || pt.y >= Height)
{
continue;
}
//判断一下是不是关闭列表的点
if(isInClosePt(pt))
{
continue;
}
pt.new_G = sconst;
pt.old_G =sconst;
pt.G = sconst;
pt.H = 10*(Math.abs(pt.x - endPoint.x)+ Math.abs(pt.y - endPoint.y));
pt.F = pt.G +pt.H;
pt.father = sPt;
System.out.println("计算值:("+ pt.x +","+pt.y +")[father:("+pt.father.x+ ","+ pt.father.y +")]");
System.out.println("F:G:h---"+pt.F+":"+pt.G+":"+pt.H);
SurrondPts.add(pt);
OpenPts.add(pt);
}
}
}
public void finMinSurrond(APoint sPt)
{
SurrondPts.clear();
for(int i = -1; i < 2; i++)
{
for(int j = -1; j < 2; j++)
{
if(i ==0 && j ==0)
continue;
APoint pt = new APoint(sPt.x +i,sPt.y + j);
//判断一下是否超越了地图边界
if(pt.x < 0 || pt.y < 0 || pt.x >= Width || pt.y >= Height)
{
continue;
}
//判断一下是不是关闭列表的点
if(isInClosePt(pt))
{
continue;
}
if(Math.abs(i) == 1 &&Math.abs(j) == 1)
pt.Sconst = 14;
SurrondPts.add(pt);
}
}
}
public boolean isInClosePt(APoint pt)
{
boolean find = false;
for(int i = 0; i <ClosePts.size(); i++)
{
if(pt.x == ClosePts.get(i).x && pt.y == ClosePts.get(i).y)
{
find = true;
}
}
return find;
}
}