java - 寻找最短路径的递归方法

标签 java algorithm

<分区>

    ########
    #C....G#
    ##.##C##
    #..C..S#
    #C.....#
    ########

S- starting Point
G-Goal
"#"- Blocked Path
"."- Free Paths
"C"- Checkpoints must be visited

Any Points can be visited(S,G,C,".") 可以多次访问。 最后应该以G结尾

我想找到 S 和 G 之间的最短路径。我正在使用 BFS 方法来找到它,但问题是它会生成数千个线程。我的代码适用于 4x4 阵列,但对于 50x50 的大阵列,它会崩溃:

java.lang.OutOfMemoryError: unable to create new native thread

请帮助我改进解决此问题的方法。

public void distancecalculator(char[][] problem ,Point start ,int distancefound, ArrayList<Point> refernce) {

    Point p = new Point();
    LinkedList<Point> q = new LinkedList<>();
    q.add(start);
    int []x = {1,-1,0,0};
    int []y = {0,0,1,-1};
    int[][]dist = new int[m][n];
    for(int []a : dist){
        Arrays.fill(a,-1);
    }
    if(distanceend==true)
        enddistance = dist;
    dist[start.x][start.y] = distancefound;

    while(!q.isEmpty()){
    //  if(distanceend == true)
        p = q.removeFirst();
    //  else
    //      p = q.getFirst();
    //      ExecutorService execute = Executors.newFixedThreadPool(200);
        for (int i = 0; i < 4; i++) {
            int a = p.x + x[i];
            int b = p.y + y[i];

            if (a >= 0 && b >= 0 && a < m && b < n && dist[a][b] == -1 && problem[a][b] != '#' ) {

                dist[a][b] = 1 + dist[p.x][p.y];
                if (distanceend==true)
                {
                    enddistance[a][b] = dist[a][b];
                    q.add(new Point(a,b));
                }
                if (distanceend==false)
                {
                    //  virtual++;
                    Point  neworigin =  new Point();
                    neworigin.x = a;
                    neworigin.y = b;
                    refernce.add(neworigin);
                    char[][] newproblem =  new char[m][n];
                    //newproblem = problem;
                    int k=0;
                    for(int s=0 ;s<m;s++)
                    {
                        for(int j=0;j<n;j++)
                        {
                            newproblem[s][j] = problem[s][j];
                            if(problem[a][b]=='@')
                                newproblem[a][b]= '.';
                            if(newproblem[s][j]=='@')
                                k=k+1;
                        }

                    }
                    //  System.out.println(k)
                    // System.out.println("1");

                    System.out.println(neworigin);
                    if(k>0)
                    {
                        ArrayList<Point> sompathak =  (ArrayList<Point>)refernce.clone();

                        solver s = new solver(newproblem , neworigin,dist[a][b] , refernce );

                        som =  new Thread(s);
                        som.start();

                        // execute.submit(s);
                    }

                    if(k==0)
                    {    // System.out.println("why god");

                        if(enddistance[a][b]!=-1)
                        {  

                            dist[a][b] = dist[a][b] + enddistance[a][b];

                            temp2 = dist[a][b];
                            System.out.println("Answer is "+ temp2);

                            System.exit(1);

                        }
                    }
                }
            }
        }
    }

distanceend boolean 表达式用于计算从末端到每个点的距离(如果不可能则为 -1)或者我正在解决问题(寻找最短距离)

最佳答案

正如 Kyllopardium 已经说过的那样,BFS 占用了大量内存,但您的问题是您尝试启动一个新线程,而这在您的情况下是行不通的。这可能是由 RAM、操作系统的线程限制等引起的。

一个更简单的解决方案是使用线程池。阅读this甲骨文关于它的文章。您需要的线程池有一些称为“工作线程”的线程来处理您的操作。如果当前没有可用的工作线程,并且没有人可以启动(无论出于何种原因),您的作业将被放入队列中,直到它可以被当前没有作业的工作线程执行。这将确保不会抛出此类异常。

关于java - 寻找最短路径的递归方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25571821/

相关文章:

java - RootPane.get ("something")与 GWT 设计器

javascript - 相同的 for 循环似乎不起作用

javascript - 使用输入搜索时如何保存上次搜索?

c++ - 为什么 std::sort 比手工编码的 "introsort"更快?

使用 Java 进行高清和标清图像的图像比较

java - 将 Spring Boot Actuator/health 和/info 合二为一

java - Maven内嵌tomcat部署war文件

java - if (arraylist contains "1"&& string contains "1") 打印错误

c++ - 查找未知连续循环的最小值和最大值

java - 从适配器访问 SQLite Helper