static void ComputePath( Binaryheap1 open, state s_goal, ArrayList<state> closed, state[][] x, int goal_x, int goal_y) { // System.out.println("the call "); Integer infinity = Integer.MAX_VALUE; int neighbourx[] = new int[] {+1, -1, 0, 0}; int neighboury[] = new int[] {0, 0, +1, -1}; int i; // System.out.println("m here" + s_goal.g + "value of" + open.minelement().g); while (s_goal.g > open.minelement().g && open.isnull() != true) { // System.out.println("m here inside while"); // System.out.println("m here inside while"); state min; min = open.minelement(); /*while(x[min.x][min.y].visited !=false) { open.delete(0); min = open.minelement(); }*/ open.delete(0); if (x[min.x][min.y].value == 1) // anwar inserted x[min.x][min.y].visited = true; open.printheap(); // closed.add(indexof,min); // System.out.println("m herebefore for"); for (i = 0; i < 4; i++) { // maze-size in if if ((neighbourx[i] + min.x < 101) && (neighboury[i] + min.y < 101) && (neighbourx[i] + min.x >= 0) && (neighboury[i] + min.y >= 0)) { state succ = x[neighbourx[i] + min.x][neighboury[i] + min.y]; // System.out.println("first if of ComputePath" + succ.search +"value of counter" + // counter); if (succ.x == goal_x && succ.y == goal_y) s_goal = succ; if (succ.search < counter) { succ.g = infinity; succ.search = counter; // System.out.println("first if of ComputePath-------"); } // System.out.println("first if of ComputePath"+ succ.g+ "another value" + min.g+ "third // value"+ min.durl[i]); if (succ.g > (min.g) + min.durl[i]) { succ.g = min.g + min.durl[i]; // System.out.println("right now succ is" + succ.x + "y value" + succ.y); // System.out.println("right now min is" + min.x + "gjas" + min.y); succ.parent = min; // System.out.println("teh parent of index succ is min"); if (open.find(succ) != 0) open.delete(open.find(succ)); else { // System.out.println("problem is here"); succ.f = succ.g + succ.h; if (x[succ.x][succ.y].visited != true) open.insert(succ); // System.out.println(" succ.x = " + succ.x + " succ.y = " + succ.y); } } open.printheap(); // System.out.println("problem is here"); /* if(open.find(succ)!=0) open.delete(open.find(succ)); else { //System.out.println("problem is here"); succ.f = succ.g + succ.h; if(x[succ.x][succ.y].visited != true) open.insert(succ); // System.out.println(" succ.x = " + succ.x + " succ.y = " + succ.y); } */ } // System.out.println("value of i" + i); } } }
public static void main(String args[]) throws FileNotFoundException { Random rand = new Random(); Integer infinity = Integer.MAX_VALUE; method_fn[] mazearr = new method_fn[50]; int mazeui[][] = new int[101][101]; for (int i = 0; i < 50; i++) // generating mazes random { mazearr[i] = new method_fn(); mazearr[i].generateMaze(); } // Reading a maze from textfile /*for(int i=0; i<50; i++) //StoreMazeInFile { //initialising goal int goal_x = rand.nextInt(101); //maze-size while (goal_x % 2 == 0) { goal_x = rand.nextInt(101); //maze-size } int goal_y = rand.nextInt(101); //maze-size while (goal_y % 2 == 0) { goal_y = rand.nextInt(101); //maze-size } //initialising goal end // System.out.println("CaLLING generateMaze"); mazearr[i].StoreMazeInFile(i,mazearr[i].maze,mazearr[i].r,mazearr[i].c,goal_x,goal_y); System.out.println("After StoreMazeInFile: "+ i +" goal_x = " + goal_x + " goal_y = " + goal_y + " s_startx = " + mazearr[i].r + "s_start.y = " + mazearr[i].c); }*/ int goal_x = 0, goal_y = 0; for (int i = 0; i < 1; i++) // ScanMazeFromFile { mazearr[i] = new method_fn(); // mazearr[i].maze = mazearr[i].ScanMazeFromFile("Maze0.txt"); String fileName = "Maze0.txt"; String line = null; int maze[][] = new int[101][101]; try { FileReader fileReader = new FileReader(fileName); BufferedReader bufferedReader = new BufferedReader(fileReader); line = bufferedReader.readLine(); mazearr[i].r = Integer.parseInt(line); line = bufferedReader.readLine(); mazearr[i].c = Integer.parseInt(line); line = bufferedReader.readLine(); goal_x = Integer.parseInt(line); line = bufferedReader.readLine(); goal_y = Integer.parseInt(line); for (int k = 0; k < 101; k++) // scan maze from file { for (int j = 0; j < 101; j++) { line = bufferedReader.readLine(); maze[k][j] = Integer.parseInt(line); } } bufferedReader.close(); } catch (FileNotFoundException ex) { System.out.println("Unable to open file '" + fileName + "'"); } catch (IOException ex) { System.out.println("Error reading file '" + fileName + "'"); } mazearr[i].maze = maze; } // Reading a maze from textfile int z = 0; // rand.nextInt(50); //random-maze mazeui = mazearr[z].maze; // maze printing for (int i = 0; i < 101; i++) // random maze { for (int j = 0; j < 101; j++) // maze-size { System.out.print(mazearr[z].maze[i][j]); } System.out.println(" "); } // System.out.println("Radomly generated MAZE number: "+z+" from array of mazes"); int i, j, k; state[][] x = new state[101][101]; // maze-size state s_start = new state(); s_start.x = mazearr[z].r; // random maze s_start.y = mazearr[z].c; state s_goal = new state(); s_goal.x = goal_x; s_goal.y = goal_y; s_goal.value = 0; // anwar added System.out.println( "goal_x = " + s_goal.x + " goal_y = " + s_goal.y + " s_startx = " + s_start.x + "s_start.y = " + s_start.y); // System.out.println("initialising States now"); int uiStartX = s_start.x, uiStartY = s_start.y; int uiGoalX = s_goal.x, uiGoalY = s_goal.y; for (i = 0; i < 101; i++) // maze-size { for (j = 0; j < 101; j++) // maze-size { x[i][j] = new state(); x[i][j].x = i; x[i][j].y = j; x[i][j].value = mazearr[z].maze[i][j]; // random maze x[i][j].g = manhattan(s_start.x, s_start.y, i, j); x[i][j].h = manhattan(i, j, goal_x, goal_y); x[i][j].f = x[i][j].g + x[i][j].h; x[i][j].visited = false; } } x[goal_x][goal_y] = s_goal; x[mazearr[z].r][mazearr[z].c] = s_start; // random maze //anwar swapped for (i = 0; i < 101; i++) // maze-size { for (j = 0; j < 101; j++) // maze-size x[i][j].search = 0; } // Binaryheap1 open = new Binaryheap1(25); ArrayList<state> closed = new ArrayList<state>(); // System.out.println("goal_x = " + goal_x + "goal_y" + goal_y + " S_tartx" + s_start.x + // "s_start.y" + s_start.y); ArrayList<state> finalstates = new ArrayList<state>(); // stack int size = 0; long startTime = System.currentTimeMillis(); // System.out.println("Before outer WHILE in main"); while ((s_start.x != goal_x) || (s_start.y != goal_y)) { System.out.println( "INSIDE outer WHILE: value of sstart_x " + s_start.x + " and value of sstart_y " + s_start.y + " value of goal_x " + goal_x + " and goal_y " + goal_y + " counter: " + counter); counter++; s_start.g = infinity; // backward 0 s_start.search = counter; s_goal.g = 0; // backward infinity s_goal.search = counter; /*for(i=0;i<open.heapsize;i++) open.delete(0);*/ closed = null; // System.out.println("Before outer WHILE in main"); Binaryheap1 open = new Binaryheap1(10201); // maze-size * maze-size open.insert(s_goal); // backward s_start ComputePath( open, s_start, closed, x, s_start.x, s_start.y); // backward (open,s_goal,closed,x,goal_x,goal_y); // System.out.println("We are out"); if (open.isnull()) { long endTime = System.currentTimeMillis(); long time = endTime - startTime; System.out.println("Time taken by backward is: " + time); Mazeui drawui = new Mazeui(mazeui, uiStartX, uiStartY, uiGoalX, uiGoalY, finalstates); drawui.setVisible(true); drawui.ShowNoPathPopup(); System.out.println("I cannot reach the target"); return; // System.exit(0); } ArrayList<state> current = new ArrayList<state>(); int curpoint = 0; state cur = s_start; // backward state cur = s_goal; while (cur.x != goal_x || cur.y != goal_y) // backward (cur.x!=s_start.x || cur.y!=s_start.y) { current.add(cur); // System.out.println(" Inside 1 the value of x and y is " + cur.x + "and" + cur.y); curpoint++; // System.out.println(" Inside 2 the cur.x is " + cur.x + " the cur.y is "+ cur.y); cur = cur.parent; } // System.out.println("out of loop cur while"); state temp; current.add(cur); // adding s_goal for backward // System.out.println(" the cur.x is " + cur.x + " the cur.y is "+ cur.y); for (i = 0; i <= curpoint; i++) // backward { if (current.get(i) == s_goal) // backward changes { i++; // System.out.println("here its breaking"); break; } if (current.get(i).value == 1) // backward changes { // System.out.println("here its breaking because value is 1"); if (current.get(i).x - current.get(i - 1).x > 0) { // System.out.println("here its breaking because value is d"); temp = current.get(i - 1); x[temp.x][temp.y].durl[0] = infinity; break; } else if (current.get(i).y - current.get(i - 1).y > 0) { // System.out.println("here its breaking because value is r"); temp = current.get(i - 1); x[temp.x][temp.y].durl[2] = infinity; break; } else if (current.get(i - 1).y - current.get(i).y > 0) { // System.out.println("here its breaking because value is l"); temp = current.get(i - 1); x[temp.x][temp.y].durl[3] = infinity; break; } else if (current.get(i - 1).x - current.get(i).x > 0) { // System.out.println("here its breaking because value is u"); temp = current.get(i - 1); x[temp.x][temp.y].durl[1] = infinity; break; } } } // System.out.println("here its breaking because value is breaking from for"); temp = current.get(i - 1); // backward // s_start = x[temp.x][temp.y]; //stack if ((goal_x != temp.x) || (goal_y != temp.y)) // backward (s_start.x!=temp.x)||(s_start.y!=temp.y) { for (int s = 0; s < i; s++) { state path = current.get(s); finalstates.add(path); } // backward add(s_start) s_start = x[temp.x][temp.y]; } System.out.println( "the start new should start at x value " + s_start.x + " with y value " + s_start.y); if ((temp.x == goal_x) && (temp.y == goal_y)) // stack backward { s_start = x[temp.x][temp.y]; size = curpoint; for (int m = 0; m <= curpoint; m++) { finalstates.add(current.get(m)); // System.out.println("Pushing finalstate"); } current.clear(); } } long endTime = System.currentTimeMillis(); if (counter != 0) { System.out.println("ROUTE: "); // stack size = finalstates.size(); for (int n = 0; n <= size - 1; n++) { System.out.println("X: " + finalstates.get(n).x + " Y: " + finalstates.get(n).y); } } long time = endTime - startTime; System.out.println("Time taken by backward is: " + time); System.out.println("I reached the target"); Mazeui drawui = new Mazeui(mazeui, uiStartX, uiStartY, uiGoalX, uiGoalY, finalstates); drawui.setVisible(true); finalstates.clear(); }