日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java astar_JAVA-Astar算法实现

發(fā)布時(shí)間:2023/12/14 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java astar_JAVA-Astar算法实现 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JAVA實(shí)現(xiàn)Astar尋徑算法:

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

* G = 從起點(diǎn),沿著產(chǎn)生的路徑,移動(dòng)到網(wǎng)格上指定方格的移動(dòng)耗費(fèi)。

* H = 從此點(diǎn)陣到結(jié)束點(diǎn)陣的預(yù)估移動(dòng)耗費(fèi),這被稱為開啟式的。

* F = 等G+H的值,表示的一個(gè)權(quán)重值。

首先將開始點(diǎn)存入到開啟列表當(dāng)中(待檢查的點(diǎn)),檢查開始點(diǎn),將周圍的點(diǎn)陣的F,G,H值算出,將周圍點(diǎn)陣加入到開啟列表當(dāng)中,將周圍點(diǎn)陣的父節(jié)點(diǎn)指向當(dāng)前查找的節(jié)點(diǎn),然后將開啟列表排序,查找到下一個(gè)最小的F值進(jìn)行路徑查找,以此類推,只到找結(jié)束點(diǎn)陣為止。

當(dāng)路徑查找到結(jié)束點(diǎn)時(shí),就通過結(jié)束點(diǎn)在閉合列表當(dāng)中查找它指向的父節(jié)點(diǎn)為路徑加到路徑列表當(dāng)中,再通過查找的節(jié)點(diǎn)指向的父節(jié)點(diǎn)為路徑加到路徑列表當(dāng)中,以此類推以找到父節(jié)點(diǎn)指各的是開始節(jié)點(diǎn)為止,此算法就結(jié)束。以上只是大概的講解了一下Astar算法的原則。有興趣可以到網(wǎng)上去查找資料,或者與我共同討論和學(xué)習(xí)。我的QQ:565345652。

下面是我用JAVA實(shí)現(xiàn)的Astar的截圖

JAVA 實(shí)現(xiàn)Astar的核心代碼:

/*

* Astar算法實(shí)現(xiàn)的類

* */

package com.smq.astar;

public class AStarRule implements Runnable

{

private Testastar ta=null; //拿界面對(duì)象的一個(gè)引用

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

private AstarObject minao; //開啟列表查找的對(duì)象引用

/*

* 構(gòu)造一個(gè)Astar算法

* */

public AStarRule(Testastar ta)

{

ta.setStart(System.currentTimeMillis());

this.ta=ta;

minao=ta.getStart_ao();

setAstar(ta.getStart_ao());

}

/*

* 運(yùn)行Astar算法進(jìn)行查找路徑

* */

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("所用時(shí)間:"+(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;

}

}

}

/*

* 加入開啟列表對(duì)象

* */

public void LoadingOpenList(int dir)

{

for(int i=0;i

{

AstarObject ao=ta.getAos().get(i);

switch(dir)

{

case 1:

if(ao.getX()==minao.getX()+minao.getW()&&ao.getY()==minao.getY())

{

ao.setAstarG(minao.getAstarG()+10);

setAstar(ao);

ao.setCratelist_ao(false);

ao.setOpenlist_ao(true);

ao.setFathernode(minao);

ao.setFathernoad_x1(ao.getX()+ao.getW()/2);

ao.setFaternoad_y1(ao.getY()+ao.getH()/2);

ao.setFaternoad_x2(ao.getX()+2);

ao.setFaternoady2(ao.getY()+ao.getH()/2);

ta.getOpenlistaos().add(ao);

ta.getAos().remove(ao);

AstarObject upao=null,downao=null;

for(int n=0;n<ta.getAos().size();n++)

{

AstarObject ao1=ta.getAos().get(n);

if(ao1.getX()==minao.getX()+ao1.getW()&&ao1.getY()==minao.getY()-ao1.getH())

{

upao=ao1;

}else if(ao1.getX()==minao.getX()+ao1.getW()&&ao1.getY()==minao.getY()+ao1.getH())

{

downao=ao1;

}

if(upao!=null&&downao!=null||n==ta.getAos().size()-1)

{

break;

}

}

if(upao!=null)

{

upao.setAstarG(minao.getAstarG()+14);

setAstar(upao);

upao.setCratelist_ao(false);

upao.setOpenlist_ao(true);

upao.setFathernode(minao);

upao.setFathernoad_x1(upao.getX()+upao.getW()/2);

upao.setFaternoad_y1(upao.getY()+upao.getH()/2);

upao.setFaternoad_x2(upao.getX()+2);

upao.setFaternoady2(upao.getY()+upao.getH()-2);

ta.getOpenlistaos().add(upao);

ta.getAos().remove(upao);

}else if(ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()+minao.getW(), minao.getY()-minao.getH(), 14, 2);

}

if(downao!=null)

{

downao.setAstarG(minao.getAstarG()+14);

setAstar(downao);

downao.setCratelist_ao(false);

downao.setOpenlist_ao(true);

downao.setFathernode(minao);

downao.setFathernoad_x1(downao.getX()+downao.getW()/2);

downao.setFaternoad_y1(downao.getY()+downao.getH()/2);

downao.setFaternoad_x2(downao.getX()+2);

downao.setFaternoady2(downao.getY()+2);

ta.getOpenlistaos().add(downao);

ta.getAos().remove(downao);

}else if(ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()+minao.getW(), minao.getY()+minao.getH(), 14, 3);

}

return;

}else if(ta.getEnd_ao().getX()==minao.getX()+minao.getW()&&ta.getEnd_ao().getY()==minao.getY())

{

this.astar_ok=true;

minao.setPathlist_ao(true);

ta.getPathlistaos().add(minao);

this.loadpathing(minao);

return;

}else if(i==ta.getAos().size()-1&&ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()+minao.getW(), minao.getY(), 10, 1);

this.lookupOpenlist(minao, minao.getX()+minao.getW(), minao.getY()-minao.getH(), 14, 2);

this.lookupOpenlist(minao, minao.getX()+minao.getW(), minao.getY()+minao.getH(), 14, 3);

return;

}

break;

case 2:

if(ao.getX()==minao.getX()&&ao.getY()==minao.getY()-minao.getH())

{

ao.setAstarG(minao.getAstarG()+10);

setAstar(ao);

ao.setCratelist_ao(false);

ao.setOpenlist_ao(true);

ao.setFathernode(minao);

ao.setFathernoad_x1(ao.getX()+ao.getW()/2);

ao.setFaternoad_y1(ao.getY()+ao.getH()/2);

ao.setFaternoad_x2(ao.getX()+ao.getW()/2);

ao.setFaternoady2(ao.getY()+ao.getH()-2);

ta.getOpenlistaos().add(ao);

ta.getAos().remove(ao);

AstarObject upao=null;

for(int n=0;n<ta.getAos().size();n++)

{

AstarObject ao1=ta.getAos().get(n);

if(ao1.getX()==minao.getX()-ao1.getW()&&ao1.getY()==minao.getY()-ao1.getH())

{

upao=ao1;

}

if(upao!=null||n==ta.getAos().size()-1)

{

break;

}

}

if(upao!=null)

{

upao.setAstarG(minao.getAstarG()+14);

setAstar(upao);

upao.setCratelist_ao(false);

upao.setOpenlist_ao(true);

upao.setFathernode(minao);

upao.setFathernoad_x1(upao.getX()+upao.getW()/2);

upao.setFaternoad_y1(upao.getY()+upao.getH()/2);

upao.setFaternoad_x2(upao.getX()+upao.getW()-2);

upao.setFaternoady2(upao.getY()+upao.getH()-2);

ta.getOpenlistaos().add(upao);

ta.getAos().remove(upao);

}else if(ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()-minao.getW(), minao.getY()-minao.getH(), 14, 5);

}

return;

}else if(ta.getEnd_ao().getX()==minao.getX()&&ta.getEnd_ao().getY()==minao.getY()-minao.getH())

{

this.astar_ok=true;

minao.setPathlist_ao(true);

ta.getPathlistaos().add(minao);

this.loadpathing(minao);

return;

}else if(i==ta.getAos().size()-1&&ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX(), minao.getY()-minao.getH(), 10, 4);

this.lookupOpenlist(minao, minao.getX()-minao.getW(), minao.getY()-minao.getH(), 14, 5);

return;

}

break;

case 3:

if(ao.getX()==minao.getX()-minao.getW()&&ao.getY()==minao.getY())

{

ao.setAstarG(minao.getAstarG()+10);

setAstar(ao);

ao.setCratelist_ao(false);

ao.setOpenlist_ao(true);

ao.setFathernode(minao);

ao.setFathernoad_x1(ao.getX()+ao.getW()/2);

ao.setFaternoad_y1(ao.getY()+ao.getH()/2);

ao.setFaternoad_x2(ao.getX()+ao.getW()-2);

ao.setFaternoady2(ao.getY()+ao.getH()/2);

ta.getOpenlistaos().add(ao);

ta.getAos().remove(ao);

AstarObject upao=null;

for(int n=0;n<ta.getAos().size();n++)

{

AstarObject ao1=ta.getAos().get(n);

if(ao1.getX()==minao.getX()-ao1.getW()&&ao1.getY()==minao.getY()+ao1.getH())

{

upao=ao1;

}

if(upao!=null||n==ta.getAos().size()-1)

{

break;

}

}

if(upao!=null)

{

upao.setAstarG(minao.getAstarG()+14);

setAstar(upao);

upao.setCratelist_ao(false);

upao.setOpenlist_ao(true);

upao.setFathernode(minao);

upao.setFathernoad_x1(upao.getX()+upao.getW()/2);

upao.setFaternoad_y1(upao.getY()+upao.getH()/2);

upao.setFaternoad_x2(upao.getX()+upao.getW()-2);

upao.setFaternoady2(upao.getY()+2);

ta.getOpenlistaos().add(upao);

ta.getAos().remove(upao);

}else if(ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()-minao.getW(), minao.getY()+minao.getH(), 14, 7);

}

return;

}else if(ta.getEnd_ao().getX()==minao.getX()-minao.getW()&&ta.getEnd_ao().getY()==minao.getY())

{

this.astar_ok=true;

minao.setPathlist_ao(true);

ta.getPathlistaos().add(minao);

this.loadpathing(minao);

return;

}else if(i==ta.getAos().size()-1&&ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX()-minao.getW(), minao.getY(), 10, 6);

this.lookupOpenlist(minao, minao.getX()-minao.getW(), minao.getY()+minao.getH(), 14, 7);

return;

}

break;

case 4:

if(ao.getX()==minao.getX()&&ao.getY()==minao.getY()+minao.getH())

{

ao.setAstarG(minao.getAstarG()+10);

setAstar(ao);

ao.setCratelist_ao(false);

ao.setOpenlist_ao(true);

ao.setFathernode(minao);

ao.setFathernoad_x1(ao.getX()+ao.getW()/2);

ao.setFaternoad_y1(ao.getY()+ao.getH()/2);

ao.setFaternoad_x2(ao.getX()+ao.getW()/2);

ao.setFaternoady2(ao.getY()+2);

ta.getOpenlistaos().add(ao);

ta.getAos().remove(ao);

return;

}else if(ta.getEnd_ao().getX()==minao.getX()&&ta.getEnd_ao().getY()==minao.getY()+minao.getH())

{

this.astar_ok=true;

minao.setPathlist_ao(true);

ta.getPathlistaos().add(minao);

this.loadpathing(minao);

return;

}else if(i==ta.getAos().size()-1&&ta.isPath_ok())

{

this.lookupOpenlist(minao, minao.getX(), minao.getY()+minao.getH(), 10, 8);

return;

}

break;

}

}

}

/*

* 算出點(diǎn)陣的F,G,H值

* */

public void setAstar(AstarObject ao)

{

if(ao.getX()<ta.getEnd_ao().getX())

{

ao.setAstarH((ta.getEnd_ao().getX()-ao.getX())/ao.getW()*10);

}else if(ao.getX()>ta.getEnd_ao().getX())

{

ao.setAstarH((ao.getX()-ta.getEnd_ao().getX())/ao.getW()*10);

}

if(ao.getY()

{

ao.setAstarH((ta.getEnd_ao().getY()-ao.getY())/ao.getH()*10+ao.getAstarH());

}else if(ao.getY()>ta.getEnd_ao().getY())

{

ao.setAstarH((ao.getY()-ta.getEnd_ao().getY())/ao.getH()*10+ao.getAstarH());

}

ao.setAstarF(ao.getAstarG()+ao.getAstarH());

}

/*

* 加載查找的最佳路徑

* */

public void loadpathing(AstarObject ao)

{

System.out.println("loadpathaos"+ta.getPathlistaos().size());

for(int i=0;i<ta.getCloselistaos().size();i++)

{

if(ao.getFathernode()==ta.getCloselistaos().get(i))

{

ta.getCloselistaos().get(i).setPathlist_ao(true);

ta.getPathlistaos().add(ta.getCloselistaos().get(i));

if(ta.getCloselistaos().get(i)!=ta.getStart_ao())

{

this.loadpathing(ta.getCloselistaos().get(i));

}else {

ta.setEnd(System.currentTimeMillis());

System.out.println("所用時(shí)間:"+(ta.getEnd()-ta.getStart())/1000.0);

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

ta.setAstar_ok(true);

}

return;

}

}

}

/*

* 查找開啟列表當(dāng)中的G值大小

* */

public void lookupOpenlist(AstarObject ao,int x,int y,int G,int dir)

{

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

{

AstarObject openlistao=ta.getOpenlistaos().get(i);

if(x==openlistao.getX()&&y==openlistao.getY())

{

if(ao.getAstarG()+G<openlistao.getAstarG())

{

System.out.println("lookupOpenList_Ok");

openlistao.setAstarG(ao.getAstarG()+G);

openlistao.setAstarF(openlistao.getAstarG()+openlistao.getAstarH());

openlistao.setFathernode(ao);

switch(dir)

{

case 1:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+2);

openlistao.setFaternoady2(openlistao.getY()+openlistao.getH()/2);

break;

case 2:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+2);

openlistao.setFaternoady2(openlistao.getY()+openlistao.getH()-2);

break;

case 3:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+2);

openlistao.setFaternoady2(openlistao.getY()+2);

break;

case 4:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoady2(openlistao.getY()+openlistao.getH()-2);

break;

case 5:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+openlistao.getW()-2);

openlistao.setFaternoady2(openlistao.getY()+openlistao.getH()-2);

break;

case 6:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+openlistao.getW()-2);

openlistao.setFaternoady2(openlistao.getY()+openlistao.getH()/2);

break;

case 7:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+openlistao.getW()-2);

openlistao.setFaternoady2(openlistao.getY()+2);

break;

case 8:

openlistao.setFathernoad_x1(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoad_y1(openlistao.getY()+openlistao.getH()/2);

openlistao.setFaternoad_x2(openlistao.getX()+openlistao.getW()/2);

openlistao.setFaternoady2(openlistao.getY()+2);

break;

}

}

return;

}

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java astar_JAVA-Astar算法实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。