アルゴリズムスタートのA星アルゴリズム

9263 ワード

原文:
アルゴリズムスタートのA星アルゴリズム
用途:
最短経路を探して、bfsとdfsより優れています
説明:
基本的な記述は,深さ優先探索に基づいて,ノードを選択する過程で盲目的に選択するのではなく,目的のある選択を行う啓発アルゴリズムを追加し,F=G+H,f(n)=g(n)+h(n)
g(n)は、現在のノードから開始ノードまでの費用h(n)は、現在のノードから終了ノードまでの費用f(n)であり、測定基準である
最も核心的なのはh(n)の推定であり,ここでは啓発アルゴリズムが用いられ,h(n)=資料:
http://www.java3z.com/cwbwebhome/article/article2/2825.htmlのflashはとてもイメージしています
http://www.cppblog.com/mythit/archive/2009/04/19/80492.aspxは詳しく話しています
http://developer.51cto.com/art/201112/307973.htm java版コード
コード:
package com.langsin.gsc.acm.astar;

import java.util.ArrayList;

import java.util.Collections;

import java.util.Comparator;

import java.util.List;

/**

 * A*    

 *    1      ,0      

 *       open        

 * gh      。

 */

public classAstar {

//    

    private int[][] map;

//   

    private int row;

//   

    private int colum;

//            

    private int COST_ZHI=10;

//          

    private int COSR_XIE=14;

//  open  

    private List<Node> open;

//  close  

    private List<Node> close;

//      

    private Node beginNode;

//      

    private Node endNode;

//      

    private Node resultNode=null;

    /**

     *     

     * @param args

     */

    public static void main(String[] args) {

       int[][] map = new int[][] {

              {1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },

              {1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },

              {1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },

              {1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },

              {1, 1, 1, 1, 0, 1, 1, 1, 1, 1 },

              {1, 1, 1, 1, 0, 1, 1, 1, 1, 1 }

              };

       Astarastar=newAstar(map, 6, 10);

       astar.search(0,0, 5, 9);

       Noderesult=astar.getResultNode();

       while(result.getParentnode()!=null){

           map[result.getX()][result.getY()]=2;

           result=result.getParentnode();

       }

       map[result.getX()][result.getY()]=2;

      

       for (int i = 0; i <6; i++) {

           for (int j = 0; j < 10; j++){

              System.out.print(" "+map[i][j]);

           }

           System.out.println();

       }

    }

    /**

     *           open close  

     * @param map

     * @param row

     * @param colum

     */

    public Astar(int[][] map,int row,int colum){

       this.map=map;

       this.row=row;

       this.colum=colum;

       open=newArrayList<Node>();

       close=newArrayList<Node>();

    }

    /**

     *                

     * @param x1

     * @param y1

     * @param x2

     * @param y2

     */

    public void search(int x1,int y1,int x2,int y2) {

//               

       if (x1<0||x1>=row||y1<0||y1>colum||x2<0||x2>=row||y2<0||y2>colum) {

           return;

       }

//               

       if (map[x1][y1]==0||map[x2][y2]==0) {

           return;

       }

       beginNode=new Node(x1, y1, null);

       endNode=new Node(x2, y2, null);

//            

       searchnode(beginNode, endNode);

    }

    /**

     *            

     * @param bNode

     * @param eNode

     */

    private void searchnode(NodebNode,Node eNode){

//             open 

       open.add(bNode);

//      open          

       while (open.size()>0) {

//                                 

           Nodenownode=open.get(0);

//                   

           if (nownode.getX()==endNode.getX()&&nownode.getY()==endNode.getY()) {

//                        

              resultNode=nownode;

              break;

           }

//            

           if(nownode.getX()-1>=0) {

              checkNode(nownode.getX()-1,nownode.getY(), nownode,COST_ZHI);

           }

//           

           if (nownode.getX()+1<row) {

              checkNode(nownode.getX()+1,nownode.getY(), nownode, COST_ZHI);

           }

//           

           if(nownode.getY()-1>=0) {

              checkNode(nownode.getX(),nownode.getY()-1, nownode, COST_ZHI);

           }

//           

           if (nownode.getY()+1<colum) {

               checkNode(nownode.getX(), nownode.getY()+1,nownode, COST_ZHI);

           }

//           

           if(nownode.getX()-1>=0&&nownode.getY()-1>=0) {

              checkNode(nownode.getX()-1,nownode.getY()-1, nownode, COSR_XIE);

           }

//           

           if(nownode.getX()-1>=0&&nownode.getY()+1<colum) {

              checkNode(nownode.getX()-1,nownode.getY()+1, nownode, COSR_XIE);

           }

//           

           if (nownode.getX()+1<row&&nownode.getY()-1>=0){

              checkNode(nownode.getX()+1,nownode.getY()-1, nownode, COSR_XIE);

           }

//           

           if (nownode.getX()+1<row&&nownode.getY()+1<colum) {

              checkNode(nownode.getX()+1,nownode.getY()+1, nownode, COSR_XIE);

           }

//          open            close   

           close.add(open.remove(0));

//          open      

           Collections.sort(open, new nodecompare());

       }

      

    }

    /**

     *        

     * @param x

     * @param y

     * @param parentNode

     * @param cost

     */

    private void checkNode(int x,int y,Node parentNode,int cost){

//              

       if (map[x][y]==0) {

           return ;

       }

//        close     

       if (checklist(close, x, y)!=-1) {

           return;

       }

//           

       Nodenode=newNode(x, y, parentNode);

//         fgh 

       setFGH(node,cost, endNode);

       int index=-1;

//       open  , f           .           

       if ((index=checklist(open, x, y))!=-1) {

           if (node.getF()<open.get(index).getF()) {

              open.set(index, node);

           }

       }else {

           open.add(node);

       }

    }

   

    /**

     *   FGH 

     * @param node

     */

    private void setFGH(Node node,int cost,Node eNode){

      

       if (node.getParentnode()!=null) {

           node.setG(node.getParentnode().getG()+cost);

       }else {

           node.setG(cost);

       }

//     H        ,                (manhattan)    

       node.setH((Math.abs(node.getX()-eNode.getX())+Math.abs(node.getY()-eNode.getY()))*10);

       node.setF(node.getG()+node.getH());

      

    }

    /**

     *              

     * @param list

     * @param x

     * @param y

     * @return

     */

    private intchecklist(List<Node> list,int x,inty){

       int key=-1;

       for (int i = 0; i <list.size(); i++) {

           if(list.get(i).getX()==x&&list.get(i).getY()==y) {

              key=i;

              break;

           }

       }

       return key;

    }

    /**

     *       (  )

     * @return

     */

    public Node getResultNode(){

       return resultNode;

    }

}

 

/**

 *    。    xy      f=g+h

 *

 */

class Node{

//    xy

    private int x;

    private int y;

//     

    private Node parentnode;

//  F=G+H

    private int g;

    private int h;

    private int f;

//      

    public Node(int x, int y, Node parentnode) {

       super();

       this.x = x;

       this.y = y;

       this.parentnode = parentnode;

    }

    public int getX() {

       return x;

    }

    public void setX(int x) {

       this.x = x;

    }

    public int getY() {

       return y;

    }

    public void setY(int y) {

       this.y = y;

    }

    public Node getParentnode() {

       return parentnode;

    }

    public void setParentnode(Nodeparentnode) {

       this.parentnode = parentnode;

    }

    public int getG() {

       return g;

    }

    public void setG(int g) {

       this.g = g;

    }

    public int getH() {

       return h;

    }

    public void setH(int h) {

       this.h = h;

    }

    public int getF() {

       return f;

    }

    public void setF(int f) {

       this.f = f;

    }

}

/**

 *       open    

 */

class nodecompare implements Comparator<Node>{

    @Override

    public int compare(Node o1, Nodeo2) {

       return o1.getF()-o2.getF();

    }

}