1

パスを見つけるために A* アルゴリズムを使用する方法の学習に取り組んでおり、これを行う最善の方法を見たいと思っています。これは私が考えていたものです。開始点と終了点を設定し、ビルド関数を介して迷路を作成し、産科を入力してから、A * アルゴリズムを実行し、基本的に 0 を 0 に変更するような形式でルートを印刷します。 3 は、たどられたパスを示します (産科は 1 に等しくなります)。これは良い計画のように聞こえますか?

私が問題を抱えているのは、産科を配列に入れる最良の方法がわからないということです。これは私がこれまでに持っているものです:

public class Maze {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {


    //start and end points in the array
    int startx = 115;
    int starty = 655;
    int endx = 380;
    int endy = 560;
    //number of collums and rows
    int row = 700;
    int col = 500;
    //size of maze
    int maze [][] = new int [row][col];

    makeMaze(row, col, maze);
    printMaze(row, col, maze);



}

 //fill mazz with 0
    private static void makeMaze(int row, int col,  int maze[][])
    {   
         //fill maze with 0 for initilization
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                maze[i][j] = 0;
            }

        }
    }
    //print out array/maze
    private static void printMaze(int row, int col,  int maze[][])
    {
         //... Print array in rectangular form
        for(int i = 0; i < row; i++)
        {
            for(int j = 0; j < col; j++)
            {
                System.out.print(" " + maze[i][j] );
            }
            System.out.println("");
        }

    }
    //fill the array with obsticals
    private void makeObsticals()
    {
        //obstical 1
        //this represent the corners of the object
        int ob1Point1 [][] = new int [220][616];
        int ob1Point2 [][] = new int [220][666];
        int ob1Point3 [][] = new int [251][670];
        int ob1Point4 [][] = new int [272][647];

        //object 2
        int ob2Point1 [][] = new int [341][655];
        int ob2Point2 [][] = new int [359][667];
        int ob2Point3 [][] = new int [374][651];
        int ob2Point4 [][] = new int [366][577];

        //obejct 3
        int ob3Point1 [][] = new int [311][530];
        int ob3Point2 [][] = new int [311][559];
        int ob3Point3 [][] = new int [339][578];
        int ob3Point4 [][] = new int [361][560];
        int ob3Point5 [][] = new int [361][528];
        int ob3Point6 [][] = new int [113][516];

         //object 4
        int ob4Point1 [][] = new int [105][628];
        int ob4Point2 [][] = new int [151][670];
        int ob4Point3 [][] = new int [180][629];
        int ob4Point4 [][] = new int [156][577];
        int ob4Point5 [][] = new int [113][587];

        //object 5
        int ob5Point1 [][] = new int [118][517];
        int ob5Point2 [][] = new int [245][517];
        int ob5Point3 [][] = new int [245][577];
        int ob5Point4 [][] = new int [118][577];

        //object 6
        int ob6Point1 [][] = new int [280][583];
        int ob6Point2 [][] = new int [333][583];
        int ob6Point3 [][] = new int [333][665];
        int ob6Point4 [][] = new int [280][665];

          //object 7
        int ob7Point1 [][] = new int [252][594];
        int ob7Point2 [][] = new int [290][562];
        int ob7Point3 [][] = new int [264][538];

          //object 8
        int ob8Point1 [][] = new int [198][635];
        int ob8Point2 [][] = new int [217][574];
        int ob8Point3 [][] = new int [182][574];


    }
    //astar algorithum
    private void findPath()
    {
    }

}

これを手伝ってくれてありがとう

4

1 に答える 1

1

申し訳ありませんが、あなたが言ったように、障害物に対して非常に多くの 2 次元配列を宣言した理由がわかりません。. .

//obstacle1
//this represent the corners of the object
   int ob1Point1 [][] = new int [220][616];
   int ob1Point2 [][] = new int [220][666];
   int ob1Point3 [][] = new int [251][670];
   int ob1Point4 [][] = new int [272][647];

上記のコードから、(220,616)、(220,666)、(251,670)、(272,647) が 1 つの障害物のコーナー ポイントであることを意味すると思います。

もしそうなら、私は 4 つの 2 次元配列を取るのではなく、maze[][] 配列の障害物で覆われた領域を無限大、つまり最大の整数番号でマークすることをお勧めします。(10000として考えてみましょう)

その他の (x,y) 位置については、maze[x][y] に各位置のヒューリスティック値を入力します (これは、その (x,y) 位置から目的地 (endx,endy) に到達するためのコストを意味します)

次に、A* アルゴリズムを適用して、最初から最後まで到達します。

于 2012-09-10T17:28:14.630 に答える