1+ import java .util .Comparator ;
2+ import java .util .InputMismatchException ;
3+ import java .util .PriorityQueue ;
4+ import java .util .Scanner ;
5+
6+ public class BestFirstSearch
7+ {
8+ private PriorityQueue <Vertex > priorityQueue ;
9+ private int heuristicvalues [];
10+ private int numberOfNodes ;
11+
12+ public static final int MAX_VALUE = 999 ;
13+
14+ public BestFirstSearch (int numberOfNodes )
15+ {
16+ this .numberOfNodes = numberOfNodes ;
17+ this .priorityQueue = new PriorityQueue <Vertex >(this .numberOfNodes ,
18+ new Vertex ());
19+ }
20+
21+ public void bestFirstSearch (int adjacencyMatrix [][], int [] heuristicvalues ,int source )
22+ {
23+ int evaluationNode ;
24+ int destinationNode ;
25+ int visited [] = new int [numberOfNodes + 1 ];
26+ this .heuristicvalues = heuristicvalues ;
27+
28+ priorityQueue .add (new Vertex (source , this .heuristicvalues [source ]));
29+ visited [source ] = 1 ;
30+
31+ while (!priorityQueue .isEmpty ())
32+ {
33+ evaluationNode = getNodeWithMinimumHeuristicValue ();
34+ destinationNode = 1 ;
35+
36+ System .out .print (evaluationNode + "\t " );
37+ while (destinationNode <= numberOfNodes )
38+ {
39+ Vertex vertex = new Vertex (destinationNode ,this .heuristicvalues [destinationNode ]);
40+ if ((adjacencyMatrix [evaluationNode ][destinationNode ] != MAX_VALUE
41+ && evaluationNode != destinationNode )&& visited [destinationNode ] == 0 )
42+ {
43+ priorityQueue .add (vertex );
44+ visited [destinationNode ] = 1 ;
45+ }
46+ destinationNode ++;
47+ }
48+ }
49+ }
50+
51+ private int getNodeWithMinimumHeuristicValue ()
52+ {
53+ Vertex vertex = priorityQueue .remove ();
54+ return vertex .node ;
55+ }
56+
57+ public static void main (String ... arg )
58+ {
59+ int adjacency_matrix [][];
60+ int number_of_vertices ;
61+ int source = 0 ;
62+ int heuristicvalues [];
63+
64+ Scanner scan = new Scanner (System .in );
65+ try
66+ {
67+ System .out .println ("Enter the number of vertices" );
68+ number_of_vertices = scan .nextInt ();
69+ adjacency_matrix = new int [number_of_vertices + 1 ][number_of_vertices + 1 ];
70+ heuristicvalues = new int [number_of_vertices + 1 ];
71+
72+ System .out .println ("Enter the Weighted Matrix for the graph" );
73+ for (int i = 1 ; i <= number_of_vertices ; i ++)
74+ {
75+ for (int j = 1 ; j <= number_of_vertices ; j ++)
76+ {
77+ adjacency_matrix [i ][j ] = scan .nextInt ();
78+ if (i == j )
79+ {
80+ adjacency_matrix [i ][j ] = 0 ;
81+ continue ;
82+ }
83+ if (adjacency_matrix [i ][j ] == 0 )
84+ {
85+ adjacency_matrix [i ][j ] = MAX_VALUE ;
86+ }
87+ }
88+ }
89+ for (int i = 1 ; i <= number_of_vertices ; i ++)
90+ {
91+ for (int j = 1 ; j <= number_of_vertices ; j ++)
92+ {
93+ if (adjacency_matrix [i ][j ] == 1 && adjacency_matrix [j ][i ] == 0 )
94+ {
95+ adjacency_matrix [j ][i ] = 1 ;
96+ }
97+ }
98+ }
99+
100+ System .out .println ("Enter the heuristic values of the nodes" );
101+ for (int vertex = 1 ; vertex <= number_of_vertices ; vertex ++)
102+ {
103+ System .out .print (vertex + "." );
104+ heuristicvalues [vertex ] = scan .nextInt ();
105+ System .out .println ();
106+ }
107+
108+ System .out .println ("Enter the source " );
109+ source = scan .nextInt ();
110+
111+ System .out .println ("The graph is explored as follows" );
112+ BestFirstSearch bestFirstSearch = new BestFirstSearch (number_of_vertices );
113+ bestFirstSearch .bestFirstSearch (adjacency_matrix , heuristicvalues ,source );
114+
115+ } catch (InputMismatchException inputMismatch )
116+ {
117+ System .out .println ("Wrong Input Format" );
118+ }
119+ scan .close ();
120+ }
121+ }
122+
123+ class Vertex implements Comparator <Vertex >
124+ {
125+ public int heuristicvalue ;
126+ public int node ;
127+
128+ public Vertex (int node , int heuristicvalue )
129+ {
130+ this .heuristicvalue = heuristicvalue ;
131+ this .node = node ;
132+ }
133+
134+ public Vertex ()
135+ {
136+
137+ }
138+
139+ @ Override
140+ public int compare (Vertex vertex1 , Vertex vertex2 )
141+ {
142+ if (vertex1 .heuristicvalue < vertex2 .heuristicvalue )
143+ return -1 ;
144+ if (vertex1 .heuristicvalue > vertex2 .heuristicvalue )
145+ return 1 ;
146+ return 0 ;
147+ }
148+
149+ @ Override
150+ public boolean equals (Object obj )
151+ {
152+ if (obj instanceof Vertex )
153+ {
154+ Vertex node = (Vertex ) obj ;
155+ if (this .node == node .node )
156+ {
157+ return true ;
158+ }
159+ }
160+ return false ;
161+ }
162+ }
0 commit comments