【问题标题】:Maze with path finding algorithm具有寻路算法的迷宫
【发布时间】:2012-09-10 15:57:22
【问题描述】:

我正在努力学习如何使用 A* 算法来寻找路径,我想看看最好的方法。这就是我在想的我想要一个起点和终点然后通过构建函数构建迷宫然后用产科填充它然后运行 ​​A* 算法在表格中打印路线基本上将 0 更改为a 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()
    {
    }

}

感谢您对此的任何帮助

【问题讨论】:

标签: java a-star maze


【解决方案1】:

对不起,我不明白你为什么要声明这么多二维数组作为障碍物...... 如你所说。 . .

//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 个二维数组,而是将 maze[][] 数组中障碍物覆盖的区域标记为 infinity 即最高整数编号。 (让我们将其视为 10000)

对于其他 (x,y) 位置,在 maze[x][y] 中放置每个位置的启发式值(这意味着从该 (x,y) 位置到达目的地 (endx,endy) 的成本)

然后应用A*算法从头到尾到达。

【讨论】:

  • 我使用一堆数组的原因是这是我能弄清楚如何“构建”障碍的最好方法,就像我要替换区域中的所有数组值一样带有 1s 的障碍物代表不可通过的方式。我有点迷失你的意思无限?那么我将如何为每个位置设置一个启发式值呢?我现在只是将其标记为 0,我知道 A* 需要知道到达目的地的成本,但我在弄清楚这一步时遇到了一些麻烦。
  • @MNM kk.. 如果 m 没有错,您基本上希望以某种方式代表迷宫中的障碍。为此,所有被障碍物覆盖的 (x,y) 位置使得 maze[x][y] = N(其中 N 在概念上是无穷大,并且在编程中我们不能写成无穷大,所以我们将 N 设为最大可能的整数 no。 ) 现在在您的程序中让启发式值的范围为(0 到 1000)然后使 N = 任何否。大于 1000 让 N=10000 现在在程序中,因为 10000 大于所有可能的启发式值 A* 算法永远不会将该位置视为以最短成本到达目的地的可能路径。
  • 我在构建阵列中的障碍物时有点迷失了。这是我的想法,但我并没有真正为 (int i = 220; i
  • @MNM yaa u r 走在正确的道路上.. 但是为什么您将障碍物的值设为 3。您的启发式范围仅从 0 到 2 吗?正如我所说,将其作为障碍物的一个很大的价值。以及您对程序中启发式值的标准是什么。我的意思是你将如何确定 (x,y) 位置的启发式值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多