QHYun_practice-17-A*算法
算法的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; } }

浙公网安备 33010602011771号