Aスターアルゴリズムの実装手順のJavaバージョン

Aスターアルゴリズムの実装手順のJavaバージョン

スターアルゴリズムの手順:

1. 最初に、オープン リストに開始点を追加します。

2. オープンリストにノードがある場合は、F 値が最小のノードである最初のノードを取り出します。

このノードが目標点であるかどうかを判断し、見つかった場合は飛び出し、

このノードに従って、8 方向のノードを取得し、G、H、F の値を見つけることができます。

マップ内の各ノードを通過できるかどうかを判断します。通過できない場合は、閉じたリストに追加してジャンプします。各ノードが閉じたリスト内にあるかどうかを判断します。ある場合は、ジャンプします。

各ノードがオープン リスト内にあるかどうかを判断します。ある場合は、G 値、F 値、およびその親ノードを更新します。ない場合は、オープン リストに追加し、G 値、H 値、および F 値を計算して、そのノードを追加します。

3. このノードをオープンリストから削除し、クローズドリストに追加します。

4. 開いたリスト内のノードを最小の F 値に従って並べ替え、最小の F 値を最初のノードにします。

5. 手順 2、3、4 を繰り返します。

ターゲット ポイントがオープン リスト内にある場合は、そのポイントが見つかります。ターゲット ポイントがオープン リスト内になく、オープン リストが空の場合は、そのポイントは見つかりません。

  1. //A* アルゴリズム public class AStar {  
  2.     プライベート  int [][] map; //map(1は通過可能、0は通過不可)  
  3.      private List<Node> openList; //リストを開く 
  4.      private List<Node> closeList; // リストを閉じる 
  5.     プライベート ファイナル  int COST_STRAIGHT = 10 ; //垂直または水平移動のパススコア 
  6.     プライベート ファイナル  int COST_DIAGONAL = 14 ; //斜め移動のパススコア 
  7.     プライベート  int行; //行 
  8.     プライベート  int column; //列 
  9.         パブリックAStar( int [][] マップ、 int行、 int列){
  10.         この.map = map;
  11.          this .row=行;
  12.          this .column = 列;
  13. openList =新しいArrayList<Node>();
  14. closeList =新しいArrayList<Node>();
  15. }
  16.          //座標を検索 (-1: エラー、0: 見つからない、1: 見つかった)  
  17.     公共  int検索( int x1, int y1, int x2, int y2){
  18.          (x1< 0 ||x1>=行||x2< 0 ||x2>=行||y1< 0 ||y1>=列||y2< 0 ||y2>=列)の場合{
  19.               
  20. 戻り値- 1 ;
  21. }
  22.          map[x1][y1]== 0 ||map[x2][y2]== 0の場合 -1返します
  23. }
  24. ノード sNode = new Node(x1,y1, null );
  25. ノード eNode = new Node(x2,y2, null ); openList.add(sNode);
  26. リスト<Node> resultList=search(sNode, eNode);
  27.         結果リストのサイズが0場合
  28.             戻る  0 ;
  29. }
  30.          (ノード node:resultList)の場合{
  31. マップ[node.getX()][node.getY()]=- 1 ;
  32. }
  33.         戻る  1 ;
  34. }
  35.          //コアアルゴリズムを見つける 
  36.     プライベートリスト<Node> search(Node sNode,Node eNode){
  37. List<Node> resultList =新しいArrayList<Node>();
  38.         ブール値isFind = false ;
  39. ノード node = null ;
  40.          openList.size() > 0場合
  41.              // オープンリスト内の ***F 値、つまり *** に格納されている値の ***F 値を取り出します 
  42. ノード = openList.get( 0 );
  43.              // ターゲットポイントが見つかったかどうかを判断します 
  44.              (node.getX()==eNode.getX()&&node.getY()==eNode.getY()) の場合{
  45. isFind = true ;
  46.                 壊す;
  47. }
  48.              //優れた 
  49.              if ((node.getY()- 1 )>= 0 ){ checkPath(node.getX(),node.getY()- 1 ,node, eNode, COST_STRAIGHT);
  50. }
  51.              //下 
  52.              if ((node.getY()+ 1 )<列){
  53. checkPath(node.getX(),node.getY()+ 1 ,node, eNode, COST_STRAIGHT);
  54. }
  55.              //左 
  56.              ((node.getX()- 1 )>= 0 )の場合{
  57. checkPath(node.getX()- 1 、node.getY()、node、eNode、COST_STRAIGHT);
  58. }
  59.              //右 
  60.              ((node.getX()+ 1 )<行)の場合{
  61. checkPath(node.getX()+ 1 、node.getY()、node、eNode、COST_STRAIGHT);
  62. }
  63.              //左上 
  64.              ((node.getX()- 1 )>= 0 &&(node.getY()- 1 )>= 0 ){の場合
  65. checkPath(node.getX()- 1 、node.getY()- 1 、node、eNode、COST_DIAGONAL);
  66. }
  67.              //左下 
  68.              ((node.getX()- 1 )>= 0 &&(node.getY()+ 1 )<列)の場合{
  69. checkPath(node.getX()- 1 、node.getY()+ 1 、node、eNode、COST_DIAGONAL);
  70. }
  71.              //右上 
  72.              if ((node.getX()+ 1 )<row&&(node.getY()- 1 )>= 0 ){ checkPath(node.getX()+ 1 ,node.getY()- 1 ,node, eNode, COST_DIAGONAL);
  73. }
  74.              //右下 
  75.              ((node.getX()+ 1 )<行&&(node.getY()+ 1 )<列)の場合{
  76. checkPath(node.getX()+ 1 、node.getY()+ 1 、node、eNode、COST_DIAGONAL);
  77. }
  78.              // オープンリストから削除 
  79.              //閉じたリストに追加 
  80. closeList.add(openList.remove( 0 ));
  81.              // リストのソートを開始し、最も高い F 値を持つものを最下端に配置します。Collections.sort(openList, new NodeFComparator());  
  82. }
  83.          if (isFind){
  84. getPath(結果リスト、ノード);
  85. }
  86.         結果リストを返します
  87. }
  88.          // この道路が通行可能かどうか確認する 
  89.     プライベート ブール値checkPath( int x, int y,Node parentNode,Node eNode, int cost){
  90. ノード node = new Node(x, y, parentNode);
  91.          // マップが渡せるかどうか確認する 
  92.          (map[x][y]== 0 )の場合{
  93. リストを閉じます。ノードを追加します。
  94.             戻る 間違い;
  95. }
  96.          // 閉じたリストに存在するかどうかを確認します 
  97.          (isListContains(closeList, x, y)!=- 1 )の場合{
  98.             戻る 間違い;
  99. }
  100.          // オープンリストに存在するかどうかを確認します 
  101.          intインデックス = - 1 ;
  102.          if ((index=isListContains(openList, x, y))!=- 1 ){
  103.              //G値が小さいかどうか、つまりG値とF値を更新するかどうか 
  104.              ((parentNode.getG()+コスト)<openList.get(index).getG())の場合{
  105. ノードを親ノードに設定します。
  106. countG(ノード、eNode、コスト);
  107. countF(ノード);
  108. openList.set(インデックス、ノード);
  109. }
  110. }それ以外{
  111.              //オープンリストに追加 
  112. node.setParentNode(parentNode); count(node, eNode, cost);
  113. ノードをリストに追加します。
  114. }
  115.         戻る 真実;
  116. }
  117.          //コレクションに要素が含まれているかどうか (-1: 見つからない、それ以外の場合はインデックスを返す)  
  118.     プライベート  int isListContains(List<Node> リスト、 int x、 int y){
  119.          ( int i = 0 ;i<list.size();i++) {
  120. ノード node=list.get(i);
  121.              (node.getX()==x&&node.getY()==y)の場合{
  122.                  iを返します
  123. }
  124. }
  125.         戻り値- 1 ;
  126. }
  127.          // 終点から始点までを往復する 
  128.     プライベート  void getPath(List<Node> resultList,Node ノード){
  129.          node.getParentNode() がnull場合、 getPath(resultList, node.getParentNode());
  130. }
  131. 結果リストにノードを追加します。
  132. }
  133.          //G、H、Fの値を計算する 
  134.     プライベート  void count(ノード node,ノード eNode, int cost){
  135. countG(ノード、eNode、コスト);
  136. countH(ノード、eNode);
  137. countF(eNode);
  138. }
  139.      //G値を計算 
  140.     プライベート  void countG(ノードノード、ノードeNode、 intコスト){
  141.          (node.getParentNode() == nullの場合){
  142. ノード.setG(コスト);
  143. }それ以外{
  144. node.setG(node.getParentNode().getG()+コスト);
  145. }
  146. }
  147.      //H値を計算 
  148.     プライベート  void countH(ノードノード、ノードeNode){
  149. node.setF(Math.abs(node.getX()-eNode.getX())+Math.abs(node.getY()-eNode.getY()));
  150. }
  151.      //F値を計算する 
  152.     プライベート  void countF(ノードノード){
  153. node.setF(node.getG()+node.getF());
  154. }
  155. } //ノードクラス クラス Node {  
  156.     プライベート  int x; //X座標 
  157.     プライベート  int y; //Y座標 
  158.      private Node parentNode; //親クラスノード 
  159.     プライベート  int g; //現在の地点から出発地点までの移動コスト 
  160.     プライベート  int h; //現在のポイントから終点までの移動コスト、つまりマンハッタン距離 |x1-x2|+|y1-y2| (障害物を無視)  
  161.     プライベート  int f; //f=g+h  
  162.         パブリックNode( int x, int y,Node parentNode){ this .x=x;
  163.         これ.y=y;
  164.         これは.parentNode=parentNode;
  165. }
  166.         公共 整数getX() {
  167.          xを返します
  168. }
  169.     公共  void setX( int x) {
  170.         これは.x = x;
  171. }
  172.     公共 整数getY() {
  173.          yを返します
  174. }
  175.     公共  void setY( int y) {
  176.         これは.y = y;
  177. }
  178.     パブリックノード getParentNode() {
  179.         親ノードを返します
  180. }
  181.     公共  void setParentNode(ノードの親ノード) {
  182.          .parentNode = parentNode;です
  183. }
  184.     公共 整数getG() {
  185.          gを返します
  186. }
  187.     公共  void setG( int g) {
  188.         これは.g = g;
  189. }
  190.     公共 整数getH() {
  191.          hを返します
  192. }
  193.     公共  void setH( int h) {
  194.         これは.h = h;
  195. }
  196.     公共 整数getF() {
  197.          fを返します
  198. }
  199.     公共  void setF( int f) {
  200.         これは.f = f;
  201. }} //ノード比較クラスクラスNodeFComparatorはComparator<Node>{を実装します 
  202.      @オーバーライド 
  203.     公共  int比較(ノードo1、ノードo2) {
  204.          o1.getF()-o2.getF()を返します
  205. }
  206. }

テストクラス:

  1. 公共 クラステスト{
  2.         公共 静的  void main(String[] args){
  3.          int [][] マップ =新規 整数[][]{
  4. // マップ配列
  5. {1,1,1,1,1,1,1,1,1,1,1},
  6. {1,1,1,1,0,1,1,1,1,1},
  7. {1,1,1,1,0,1,1,1,1,1},
  8. {1,1,1,1,0,1,1,1,1,1},
  9. {1,1,1,1,0,1,1,1,1,1},
  10. {1,1,1,1,0,1,1,1,1,1}  
  11. };
  12. AStar aStar = new AStar(map, 6 , 10 );
  13.          intフラグ = aStar.search( 4 , 0 , 3 , 8 );
  14.          if (フラグ == - 1 ) {
  15. System.out.println( "データ転送中にエラーが発生しました!" );
  16. }それ以外 フラグが0場合
  17. System.out.println( "見つかりません!" );
  18. }それ以外{
  19.              ( int x = 0 ; x < 6 ; x++) {
  20.                  ( int y = 0 ; y < 10 ; y++ ) {
  21.                      (map[x][y]== 1 )の場合{
  22. システム出力を印刷します( " " );
  23. }それ以外  (map[x][y]== 0 )の場合{
  24. System.out.print( "〓" );
  25. }それ以外  (map[x][y]==- 1 )の場合{
  26. System.out.print( "※" );
  27. }
  28. }
  29. システム出力のprintln();
  30. }
  31. }
  32. }}

オリジナルリンク: http://www.cnblogs.com/xmmdream/archive/2011/12/12/2284627.html

【編集者のおすすめ】

  1. Tomcat 実行時の Java Web メモリ オーバーフローの概要
  2. Java NIO は低速接続をどのように処理しますか?
  3. Javaデータキャッシュ実装のコアメカニズム
  4. Java vs. Cobol: Cobolソフトウェアは最高の品質
  5. Java NIO クラス ライブラリ関係図

<<:  Java スパニングツリー構造 ポイント間の最短経路アルゴリズム

>>:  マット・カッツのブログ投稿: Google のアルゴリズムの最新の変更点 10 件

ブログ    
ブログ    
ブログ    

推薦する

お伝えする 5 つの理由: セキュリティ監視はなぜ人工知能なしでは実現できないのか?

人工知能は、特にセキュリティ分野において業界に大きな影響を与え始めています。成熟したセキュリティ サ...

OpenAI従業員:エンジニアリングスキルは誇張されているが、人との付き合い方を学ぶことの方が重要

12月29日のニュース、プロンプトエンジニア、つまり、人工知能モデルを誘導して最良の出力を生成するチ...

...

...

...

Java と Python のアルゴリズムとデータ構造に関する面接の質問

Uber や Netflix などの企業でプログラミング、コーディング、ソフトウェア開発の職に応募す...

デジタルツインがグローバルサプライチェーンの悪夢からの脱出にどのように役立つか

編集:王昊、千山企画丨張傑新型コロナウイルス感染症の世界的大流行の発生と拡大により、過去2年間にわた...

総合異常検知の新たな夜明け:華中科技大学などがGPT-4Vの総合異常検知性能を明らかに

異常検出タスクは、通常のデータ分布から大きく逸脱した外れ値を識別することを目的としており、産業検査、...

データセンター冷却のための人工知能: 単なる夢物語ではない

現在、AI はデータセンターのあらゆる場所に存在し、ネットワークの管理と保護、アラートのフィルタリン...

...

...

液体ロボットはマーケティングの策略か、それとも自動化の未来か?

液体ロボットのコンセプトは、ロボット工学と自動化をいくつかの点で変えることが期待されています。その ...

人工知能は商業用不動産にどのような影響を与えるでしょうか?

AI は商業用不動産業界を変革し、あらゆるものをより効率的、アクセスしやすく、透明性の高いものにし...

...