Saturday, April 26, 2014

BFS using shortest path between 2 nodes in adjacent matrix




import java.util.ArrayList;




public class BfsData



{



// Graph adjacency matrix (unweighted graph)



static private int[][] graph = { {0,3,0,0,2}, // 0->1 0->3



{0,0,0,33,0}, // 1->2, 1->3



{0,0,0,22,0}, // 2->4



{0,0,0,0,3}, // 3->2, 3->4



{0,0,0,0,0} // 4->1



};




//--------------------------------------------------------------



public static void main (String[] args)



{



ArrayList<Integer> Start = new ArrayList();



Start.add(0); // The start node



ArrayList<ArrayList> Queue = new ArrayList();



Queue.add(Start); // inserted in the initial queue of paths as [[Start]]



// Use one search at a time (comment the others)



// ArrayList Path = depth_first(Queue,4); // Depth first search



ArrayList Path = breadth_first(Queue,4); // Breadth first search



// ArrayList Path = uni_cost(Queue,4); // Uniform cost search



System.out.println(Path);



// System.out.println(path_cost(Path));



}



//--------------------------------------------------------------



// Adds to the queue paths extending the first path in the queue



public static ArrayList<ArrayList> extend (ArrayList<Integer> Path)



{



ArrayList<ArrayList> NewPaths = new ArrayList();



for (int i=0;i<graph.length;i++)



if (graph[Path.get(0)][i]>0 && !Path.contains(i))



{



ArrayList Path1 = (ArrayList)Path.clone();




System.out.println(Path1+"=====jjjj====");



Path1.add(0,i);



NewPaths.add(Path1);



System.out.println(NewPaths+"====NewPaths==");



}



return NewPaths;



}



//--------------------------------------------------------------



// Appends y to x and returns the result in a new ArrayList z



public static ArrayList append (ArrayList x, ArrayList y)



{



ArrayList z = (ArrayList)x.clone();



for (int i=0;i<y.size();i++) z.add(y.get(i));



return z;



}




//--------------------------------------------------------------



// Breadth first search for a path from Start to Goal.



// The Start node must be in the initial queue of paths as [[Start]]



public static ArrayList<ArrayList> breadth_first(ArrayList<ArrayList> Queue, int Goal)



{



if (Queue.size()==0) return Queue; // path not found



if ((Integer)Queue.get(0).get(0) == Goal) // if Goal is the first node in the first path



return Queue.get(0); // return path



else // replace the first path with all its extensions and put them at the end of the queue



{



ArrayList<ArrayList> NewPaths = extend(Queue.get(0));



Queue.remove(0);



return breadth_first(append(Queue,NewPaths),Goal);



}



}



//--------------------------------------------------------------



public static int path_cost (ArrayList<Integer> Path)



{



int cost = 0;



for (int i=0;i<Path.size()-1;i++)



cost = cost + graph[Path.get(i+1)][Path.get(i)];



return cost;



}



public static void sort(ArrayList<ArrayList> Queue)



{



int out, in;



for(out=Queue.size()-1; out>=1; out--)



for(in=0; in<out; in++)



if( path_cost(Queue.get(in)) > path_cost(Queue.get(in+1)) )



swap(Queue, in, in+1);



}



//--------------------------------------------------------------



private static void swap(ArrayList<ArrayList> a, int one, int two)



{



ArrayList<Integer> temp = a.get(one);



a.set(one,a.get(two));



a.set(two,temp);



}




}




As Above program, in that place i will directly send the adjacent matrix file through file reader, that file is




a b c d e f g h i j k l m n o p q r s t u v w x y z aa ab ac ad



a 0 3 0 0 2 1 0 0 0 2 0 0 42 1 0 0 11 0 6 0 0 0 0 43 0 36 0 23 0 24



b 0 0 0 33 0 25 0 36 0 0 0 3 24 0 2 0 0 47 0 0 8 3 0 17 0 0 0 0 4 20



c 0 0 0 22 0 12 16 0 34 0 0 7 0 2 0 0 0 0 0 16 0 13 0 0 0 25 0 0 0 10



d 0 0 0 0 3 4 0 0 0 0 5 12 8 0 0 0 2 12 0 0 3 0 0 24 32 0 0 0 0 0



e 0 0 0 0 0 0 1 4 0 12 0 20 0 0 0 0 13 0 1 16 0 0 0 0 2 4 5 6 0 0



f 0 0 0 0 0 0 1 0 2 0 13 8 0 0 1 0 4 0 0 8 0 0 0 12 1 0 0 0 1 0



g 0 0 0 0 0 0 0 1 12 0 3 5 0 2 0 3 0 0 1 2 0 0 0 5 10 0 1 2 1 0



h 0 0 0 0 0 0 0 0 3 34 5 0 0 0 0 0 1 12 1 0 0 0 0 0 2 0 3 0 1 0



i 0 0 0 0 0 0 0 0 0 1 2 0 0 42 0 1 5 34 1 0 0 1 0 0 0 0 0 1 0 0



j 0 0 0 0 0 0 0 0 0 0 0 1 22 0 11 0 25 41 0 0 0 0 0 0 0 1 0 1 0 4



k 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 23 0 12 0 2 0 3 0 1 0 0 1 1



l 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 19 12 0 0 1 0 0 0 0 2 0 4 0 2 0



m 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 5 1 0 0 0 0 3 0 2 0 0 0 0 0 0



n 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 23 0 5 32 0 50 0 1 0 3 4



o 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 4 0 0 2 53 0 2 21 3 0 0 0 1



p 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 2 24 0 0 12 38 0 2 0 0



q 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 24 0 0 24 0 0 12 0 5 0 0 0



r 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 12 0 57 0 0 2 0



s 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 24 0 1 0 5 12 0



t 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 4 0 24 1 6 0 0 1



u 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 23 0 1 0 0



v 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 22 1 1 4 0



w 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 22 38 0 0 5 7 0



x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 0 1



y 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 21 0 1



z 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 1



aa 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 42 0 0



ab 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5 0



ac 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5



ad 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0




"" static private int[][] graph = { {0,3,0,0,2}, // 0->1 0->3



{0,0,0,33,0}, // 1->2, 1->3



{0,0,0,22,0}, // 2->4



{0,0,0,0,3}, // 3->2, 3->4



{0,0,0,0,0} // 4->1



};"" ....in that ""---"" i will set that above matrix file ?how to set that file??







No comments:

Post a Comment