Professional Documents
Culture Documents
Ai Assignment
Ai Assignment
Node class
This class is responsible to generate nodes. It has data members like
data,index,colour, start_time,end_time etc as shown in the below class.It
holds all the properties of a node.
import java.util.*;
Graph class
This class is responsible for creating nodes in a graph, adding edges in a
graph. Graph class also have functions to define heuristic for a graph and
generateNode function which is used to generate new states based on a
problem. The graph has reinitialize function to reinitialize the parameters of
a node used during execution of a search technique without disturbing the
weights of edges and data of the nodes.
import java.util.*;
Data class
This class defines the data that a node wants to store in it.User defined
datatype is intentionally used to define any type and format of data in a
node so that it gives the flexibility to store information in any type of
problem.
Search Class
This class implements all the search techniques namely:-
a) Breadth-First Search
b) Depth First Search
c) Iterative Broadening Search
d) Iterative Deepening Search
e) Uniform Cost Search
f) Best first greedy search
g) A star Search technique
h) import java.util.*;
}
if(node.path_cost > pathCost) {
//System.out.println(node +" "+node.path_cost+"
"+pathCost);
node.path_cost = pathCost;
node.parentNode = i;
}
}
i.end_time = ++globalTime;
i.colour = 2;
}
}
public static void aStar(Graph graph,int index) {
globalTime = 0;
solutionFlag = false;
ArrayList<Node> list = graph.list;
PriorityQueue<Node> queue = new PriorityQueue<Node>(new
CompareNodeByTotal());
Node m = list.get(index);
m.path_cost = 0;
m.goal_cost = graph.heuristicFunc(m);
m.total_cost = m.path_cost + m.goal_cost;
queue.add(m);
System.out.println( queue);
m.colour = 1;
m.start_time = ++globalTime;
if(m.data.validate(graph.goalNode)) {
solutionFlag = true;
m.end_time = ++globalTime;
m.colour = 2;
graph.solutionNode = m;
return;
}
while (!queue.isEmpty()) {
Node i= queue.poll();
System.out.println( queue);
graph.generateNodes(i);
if(i.data.validate(graph.goalNode)) {
solutionFlag = true;
i.end_time = ++globalTime;
i.colour = 2;
graph.solutionNode = i;
return;
}
int count = -1;
for (int p : i.adjNodes) {
count++;
Node node = list.get(p);
int edgeValue = i.edgeValues.get(count);
int pathCost = i.path_cost+ edgeValue;
int goalCost = graph.heuristicFunc(node);
int totalCost = pathCost + graph.heuristicFunc(node);
if( node.colour == 0) {
node.colour = 1;
node.start_time = ++globalTime;
node.parentNode = i;
node.path_cost = pathCost;
node.goal_cost = goalCost;
node.total_cost = totalCost;
node.parentNode = i;
queue.add(node);
System.out.println(queue);
}
if(node.total_cost > totalCost) {
//System.out.println(node +" "+node.path_cost+"
"+pathCost);
node.path_cost = pathCost;
node.goal_cost = goalCost;
node.total_cost = totalCost;
node.parentNode = i;
}
}
i.end_time = ++globalTime;
i.colour = 2;
}
}
public static void bfgs(Graph graph,int index) {
globalTime = 0;
solutionFlag = false;
ArrayList<Node> list = graph.list;
PriorityQueue<Node> queue = new PriorityQueue<Node>(new
CompareNodeByHeuristic());
Node m = list.get(index);
m.path_cost=0;
queue.add(m);
m.colour = 1;
m.start_time = ++globalTime;
System.out.println( queue);
if(m.data.validate(graph.goalNode)) {
solutionFlag = true;
m.end_time = ++globalTime;
m.colour = 2;
graph.solutionNode = m;
return;
}
while (!queue.isEmpty()) {
Node i= queue.poll();
System.out.println( queue);
graph.generateNodes(i);
if(i.data.validate(graph.goalNode)) {
solutionFlag = true;
i.end_time = ++globalTime;
i.colour = 2;
graph.solutionNode = i;
return;
}
int count = -1;
for (int p : i.adjNodes) {
count++;
Node node = list.get(p);
int edgeValue = i.edgeValues.get(count);
int pathCost = i.path_cost+ edgeValue;
int goalCost = graph.heuristicFunc(node);
if( node.colour == 0) {
node.colour = 1;
node.start_time = ++globalTime;
node.parentNode = i;
node.path_cost = pathCost;
node.goal_cost = goalCost;
node.total_cost = node.path_cost +
node.goal_cost;
queue.add(node);
System.out.println(queue);
}
i.end_time = ++globalTime;
i.colour = 2;
}
}
}
CompareNodesByPath class
This class is a comparator class whose object is use to compare Nodes by
path cost.This class has been used for the implementation of Uniform cost
search algorithm to sort the nodes based on path cost.
import java.util.Comparator;
CompareNodesByHeuristic class
This class is a comparator class whose object is use to compare Nodes by
heuristic value.This class has been used for the implementation of Best first
greedy search algorithm to sort the nodes based on heuristic value.
import java.util.Comparator;
import java.util.Comparator;
WaterJugData class
Describes the data format for water jug problem.Here x denotes the amount
of water in jar 1 and y denotes amount of water in jar 2.
public class WaterJugData extends Data {
int x;
int y;
a)Implementation of i) BFS ii) DFS iii) DLS iii) IDS iv) IBS
Solution:
TestOnTree class
public class TestOnTree {
public static void main(String args[]) {
Graph graph = new Graph(5, true);
graph.createGoalNode(10);
graph.enterData();
graph.addEdge(0, 1);
graph.addEdge(0, 2);
graph.addEdge(1, 3);
graph.addEdge(1, 4);
System.out.println("Starting BFS");
Search.bfs(graph, 0);
graph.displaySolutionPath();
graph.reinitializeGraph();
System.out.println("Starting DFS");
Search.dfs(graph, 0);
graph.displaySolutionPath();
graph.reinitializeGraph();
System.out.println("Starting IBS");
Search.ibs(graph, 0);
graph.displaySolutionPath();
}
}
Output:---
[1, 2]
[2]
[2, 3]
[2, 3, 4]
4<----1<----0<----null
Starting DFS
[0]
[0, 1]
[0, 1, 3]
[0, 1]
[0, 1, 4]
4<----1<----0<----null
Starting DLS with depth limit 5
[0]
[0, 1]
[0, 1, 3]
[0, 1]
[0, 1, 4]
4<----1<----0<----null
Starting IDS
Iteration 1
[0]
[]
Iteration 2
[0]
[0, 1]
[0]
[0, 2]
[0]
[]
Iteration 3
[0]
[0, 1]
[0, 1, 3]
[0, 1]
[0, 1, 4]
4<----1<----0<----null
Starting IBS
Iteration 1
[0]
[0, 1]
[0, 1, 3]
[0, 1]
[0]
[]
Iteration 2
[0]
[0, 1]
[0, 1, 3]
[0, 1]
[0, 1, 4]
4<----1<----0<----null
TestOnGraph Class
public class TestOnGraph {
public static void main(String args[]) {
Graph graph = new Graph(5, true);
graph.createGoalNode(10);
graph.enterData();
graph.addEdge(0, 1);
graph.addEdge(2, 3);
graph.addEdge(1, 3);
graph.addEdge(0, 4);
System.out.println("Starting BFS");
Search.bfs(graph, 0);
graph.displaySolutionPath();
graph.reinitializeGraph();
System.out.println("Starting DFS");
Search.dfs(graph, 0);
graph.displaySolutionPath();
graph.reinitializeGraph();
System.out.println("Starting IBS");
Search.ibs(graph, 0);
graph.displaySolutionPath();
}
}
Output
Enter the data for node 0
1
Enter the data for node 1
2
Enter the data for node 2
3
Enter the data for node 3
10
Enter the data for node 4
4
Starting BFS
[0]
[]
[1]
[1, 4]
[4]
[4, 3]
3<----1<----0<----null
Starting DFS
[0]
[0, 1]
[0, 1, 3]
3<----1<----0<----null
Starting DLS with depth limit 5
[0]
[0, 1]
[0, 1, 3]
3<----1<----0<----null
Starting IDS
Iteration 1
[0]
[]
Iteration 2
[0]
[0, 1]
[0]
[0, 4]
[0]
[]
Iteration 3
[0]
[0, 1]
[0, 1, 3]
3<----1<----0<----null
Starting IBS
Iteration 1
[0]
[0, 1]
[0, 1, 3]
3<----1<----0<----null
BFS
WaterJug2 class
import java.util.HashMap;
// Empty a jar
// Fill a jar from another jar until it gets filled or other one gets
empty
@Override
public void generateNodes(Node node) {
final int JAR1 = 3;
final int JAR2 = 5;
final int MEASURE = 4;
WaterJugData data = (WaterJugData) node.data;
int jar1 = data.x;
int jar2 = data.y;
WaterJugData data1,data2;
if(jar1 == 0 && jar2 == 0) {
if(!baseFlag) {
baseFlag = false;
return;
}
data1 = new WaterJugData(JAR1,0);
addToList(data1,node);
data1 = new WaterJugData(0, JAR2);
addToList(data1,node);
return;
}
if(jar1 == JAR1 && jar2 == JAR2)
return;
int rem_jar1 = JAR1 - jar1;
int rem_jar2 = JAR2 - jar2;
if(rem_jar1 != 0) {
data1 = new WaterJugData(JAR1,jar2);
addToList(data1,node);
int fill = Math.min(jar1+jar2,JAR1);
int updateJar2 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(fill,updateJar2);
addToList(data1,node);
}
if(rem_jar2 != 0){
data1 = new WaterJugData(jar1,JAR2);
addToList(data1,node);
int fill = Math.min(JAR2,jar1+jar2);
int updateJar1 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(updateJar1,fill);
addToList(data1,node);
}
if(jar1 != 0) {
data1 = new WaterJugData(0,jar2);
addToList(data1,node);
}
if(jar2 != 0) {
data1 = new WaterJugData(jar1,0);
addToList(data1,node);
}
}
Output:
[(0, 0)]
[]
[(3, 0)]
[(3, 0), (0, 5)]
[(0, 5)]
[(0, 5), (3, 5)]
[(0, 5), (3, 5), (0, 3)]
[(3, 5), (0, 3)]
[(3, 5), (0, 3), (3, 2)]
[(0, 3), (3, 2)]
[(3, 2)]
[(3, 2), (3, 3)]
[(3, 3)]
[(3, 3), (0, 2)]
[(0, 2)]
[(0, 2), (1, 5)]
[(1, 5)]
[(1, 5), (2, 0)]
[(2, 0)]
[(2, 0), (1, 0)]
[(1, 0)]
[(1, 0), (2, 5)]
[(2, 5)]
[(2, 5), (0, 1)]
[(0, 1)]
[(0, 1), (3, 4)]
[(3, 4)]
[(3, 4), (3, 1)]
[(3, 1)]
[(3, 1), (0, 4)]
(0, 4)<----(3, 4)<----(2, 5)<----(2, 0)<----(0, 2)<----(3, 2)<----(0, 5)<----(0, 0)<----null
DFS
WaterJug2 class
import java.util.HashMap;
// Empty a jar
// Fill a jar from another jar until it gets filled or other one gets
empty
@Override
public void generateNodes(Node node) {
final int JAR1 = 3;
final int JAR2 = 5;
final int MEASURE = 4;
WaterJugData data = (WaterJugData) node.data;
int jar1 = data.x;
int jar2 = data.y;
WaterJugData data1,data2;
if(jar1 == 0 && jar2 == 0) {
if(!baseFlag) {
baseFlag = false;
return;
}
data1 = new WaterJugData(JAR1,0);
addToList(data1,node);
data1 = new WaterJugData(0, JAR2);
addToList(data1,node);
return;
}
if(jar1 == JAR1 && jar2 == JAR2)
return;
int rem_jar1 = JAR1 - jar1;
int rem_jar2 = JAR2 - jar2;
if(rem_jar1 != 0) {
data1 = new WaterJugData(JAR1,jar2);
addToList(data1,node);
int fill = Math.min(jar1+jar2,JAR1);
int updateJar2 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(fill,updateJar2);
addToList(data1,node);
}
if(rem_jar2 != 0){
data1 = new WaterJugData(jar1,JAR2);
addToList(data1,node);
int fill = Math.min(JAR2,jar1+jar2);
int updateJar1 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(updateJar1,fill);
addToList(data1,node);
}
if(jar1 != 0) {
data1 = new WaterJugData(0,jar2);
addToList(data1,node);
}
if(jar2 != 0) {
data1 = new WaterJugData(jar1,0);
addToList(data1,node);
}
}
Output:
[(0, 0)]
[(0, 0), (3, 0)]
[(0, 0), (3, 0), (3, 5)]
[(0, 0), (3, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4), (0, 4)]
(0, 4)<----(3, 4)<----(2, 5)<----(2, 0)<----(0, 2)<----(3, 2)<----(0, 5)<----(1, 5)<----(3, 3)<----(0, 3)<--
--(3, 0)<----(0, 0)<----null
DLS
WaterJug2 class
import java.util.HashMap;
// Empty a jar
// Fill a jar from another jar until it gets filled or other one gets
empty
@Override
public void generateNodes(Node node) {
final int JAR1 = 3;
final int JAR2 = 5;
final int MEASURE = 4;
WaterJugData data = (WaterJugData) node.data;
int jar1 = data.x;
int jar2 = data.y;
WaterJugData data1,data2;
if(jar1 == 0 && jar2 == 0) {
if(!baseFlag) {
baseFlag = false;
return;
}
data1 = new WaterJugData(JAR1,0);
addToList(data1,node);
data1 = new WaterJugData(0, JAR2);
addToList(data1,node);
return;
}
if(jar1 == JAR1 && jar2 == JAR2)
return;
int rem_jar1 = JAR1 – jar1;
int rem_jar2 = JAR2 – jar2;
if(rem_jar1 != 0) {
data1 = new WaterJugData(JAR1,jar2);
addToList(data1,node);
int fill = Math.min(jar1+jar2,JAR1);
int updateJar2 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(fill,updateJar2);
addToList(data1,node);
}
if(rem_jar2 != 0){
data1 = new WaterJugData(jar1,JAR2);
addToList(data1,node);
int fill = Math.min(JAR2,jar1+jar2);
int updateJar1 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(updateJar1,fill);
addToList(data1,node);
}
if(jar1 != 0) {
data1 = new WaterJugData(0,jar2);
addToList(data1,node);
}
if(jar2 != 0) {
data1 = new WaterJugData(jar1,0);
addToList(data1,node);
}
}
}
Output:
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4), (0, 4)]
(0, 4)--(3, 4)--(2, 5)--(2, 0)--(0, 2)--(3, 2)--(0, 5)--(1, 5)--(3, 3)--(0, 3)--(3, 0)--
(0, 0)--null
IDS
WaterJug2 class
import java.util.HashMap;
// Empty a jar
// Fill a jar from another jar until it gets filled or other one gets
empty
@Override
public void generateNodes(Node node) {
final int JAR1 = 3;
final int JAR2 = 5;
final int MEASURE = 4;
WaterJugData data = (WaterJugData) node.data;
int jar1 = data.x;
int jar2 = data.y;
WaterJugData data1,data2;
if(jar1 == 0 && jar2 == 0) {
if(!baseFlag) {
baseFlag = false;
return;
}
data1 = new WaterJugData(JAR1,0);
addToList(data1,node);
data1 = new WaterJugData(0, JAR2);
addToList(data1,node);
return;
}
if(jar1 == JAR1 && jar2 == JAR2)
return;
int rem_jar1 = JAR1 - jar1;
int rem_jar2 = JAR2 - jar2;
if(rem_jar1 != 0) {
data1 = new WaterJugData(JAR1,jar2);
addToList(data1,node);
int fill = Math.min(jar1+jar2,JAR1);
int updateJar2 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(fill,updateJar2);
addToList(data1,node);
}
if(rem_jar2 != 0){
data1 = new WaterJugData(jar1,JAR2);
addToList(data1,node);
int fill = Math.min(JAR2,jar1+jar2);
int updateJar1 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(updateJar1,fill);
addToList(data1,node);
}
if(jar1 != 0) {
data1 = new WaterJugData(0,jar2);
addToList(data1,node);
}
if(jar2 != 0) {
data1 = new WaterJugData(jar1,0);
addToList(data1,node);
}
}
Output:
Iteration 1
[(0, 0)]
[]
Iteration 2
[(0, 0)]
[(0, 0)]
[(0, 0)]
[]
Iteration 3
[(0, 0)]
[(0, 0)]
[]
Iteration 4
[(0, 0)]
[(0, 0)]
[]
Iteration 5
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0)]
[]
Iteration 6
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0)]
[]
Iteration 7
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0)]
[]
Iteration 8
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1), (3, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0)]
[]
Iteration 9
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1), (3, 1)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (1, 0), (0, 1), (3, 1), (0, 4)]
(0, 4)<----(3, 1)<----(0, 1)<----(1, 0)<----(1, 5)<----(3, 3)<----(0, 3)<----(3, 0)<----(0, 0)<----null
IBS
import java.util.HashMap;
// Empty a jar
// Fill a jar from another jar until it gets filled or other one gets
empty
@Override
public void generateNodes(Node node) {
final int JAR1 = 3;
final int JAR2 = 5;
final int MEASURE = 4;
WaterJugData data = (WaterJugData) node.data;
int jar1 = data.x;
int jar2 = data.y;
WaterJugData data1,data2;
if(jar1 == 0 && jar2 == 0) {
if(!baseFlag) {
baseFlag = false;
return;
}
data1 = new WaterJugData(JAR1,0);
addToList(data1,node);
data1 = new WaterJugData(0, JAR2);
addToList(data1,node);
return;
}
if(jar1 == JAR1 && jar2 == JAR2)
return;
int rem_jar1 = JAR1 - jar1;
int rem_jar2 = JAR2 - jar2;
if(rem_jar1 != 0) {
data1 = new WaterJugData(JAR1,jar2);
addToList(data1,node);
int fill = Math.min(jar1+jar2,JAR1);
int updateJar2 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(fill,updateJar2);
addToList(data1,node);
}
if(rem_jar2 != 0){
data1 = new WaterJugData(jar1,JAR2);
addToList(data1,node);
int fill = Math.min(JAR2,jar1+jar2);
int updateJar1 = Math.max(jar2-fill+jar1,0);
data1 = new WaterJugData(updateJar1,fill);
addToList(data1,node);
}
if(jar1 != 0) {
data1 = new WaterJugData(0,jar2);
addToList(data1,node);
}
if(jar2 != 0) {
data1 = new WaterJugData(jar1,0);
addToList(data1,node);
}
}
}
Output
Iteration 1
[(0, 0)]
[(0, 0)]
[]
Iteration 2
[(0, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4)]
[(0, 0), (3, 0), (0, 3), (3, 3), (1, 5), (0, 5), (3, 2), (0, 2), (2, 0), (2, 5), (3, 4), (0, 4)]
(0, 4)<----(3, 4)<----(2, 5)<----(2, 0)<----(0, 2)<----(3, 2)<----(0, 5)<----(1, 5)<----(3, 3)<----(0, 3)<----(3, 0)<----(0, 0)<-
---null
Test2 class here is used to show the uniform cost search on a graph
public class Test2 {
public static void main(String args[]) {
Graph graph = new Graph(4, true);
graph.createGoalNode(10);
graph.enterData();
graph.addEdge(0, 1,4);
graph.addEdge(0, 3,1);
graph.addEdge(3, 2,1);
graph.addEdge(2, 1, 1);
Search.uniformCostSearch(graph, 0);
graph.displaySolutionPath();
System.out.println("Solution cost---
>>"+graph.solutionNode.path_cost);
}
}
Output:
Enter the data for node 0
10
[]
[1]
[3, 1]
[1]
[2, 1]
[1]
[]
1<----2<----3<----0<----null
Solution cost--->>3
QUESTION 3
Solution:
OUTPUT:
Enter the data for node 0
10
10
[0]
[]
[1]
[1, 7]
[7]
[2, 7]
[7]
[3, 7]
[7]
[4, 7]
[7]
[5, 7]
[7]
[6, 7]
[7]
6<----5<----4<----3<----2<----1<----0<----null
Starting A* Search
[0]
[]
[1]
[1, 7]
[7]
[2, 7]
[7]
[3, 7]
[7]
[7, 4]
[4]
[8, 4]
[4]
[9, 4]
[4]
9<----8<----7<----0<----null
Test of BFGS and A* on Graph
OUTPUT
Enter the data for node 0
10
[0]
[]
[1]
[1, 7]
[7]
[2, 7]
[7]
[3, 7]
[7]
[4, 7]
[7]
[5, 7]
[7]
[6, 7]
[7]
6<----5<----4<----3<----2<----1<----0<----null
Starting A* Search
[0]
[]
[1]
[1, 7]
[7]
[2, 7]
[7]
[3, 7]
[7]
[7, 4]
[4]
[8, 4]
[4]
[6, 4]
[4]
6<----8<----7<----0<----null
MazeProblemData class
This class contains the data format for Maze problem. x and y denotes the
coordinates of a cell.
public class MazeProblemData extends Data {
int x,y;
public MazeProblemData(int x, int y) {
super(0);
this.x = x;
this.y = y;
}
public String toString() {
return "("+x+","+y+")";
}
public boolean validate(Data obj) {
MazeProblemData obj1 = (MazeProblemData) obj;
if (obj1.x == x && obj1.y == y) {
return true;
} else
return false;
}
MazeProblem class
import java.util.HashMap;
@Override
public int heuristicFunc(Node node) {
MazeProblemData data = (MazeProblemData) node.data;
return (Math.abs(goalData.x-data.x)+Math.abs(goalData.y-data.y));
}
@Override
public void generateNodes(Node node) {
MazeProblemData data = (MazeProblemData) node.data;
int x = data.x;
int y = data.y;
if(validateCoordinate(x-1,y)) {
addToList(new MazeProblemData(x-1,y),node);
}
if(validateCoordinate(x+1,y)) {
addToList(new MazeProblemData(x+1,y),node);
}
if(validateCoordinate(x,y+1)) {
addToList(new MazeProblemData(x,y+1),node);
}
if(validateCoordinate(x,y-1)) {
addToList(new MazeProblemData(x,y-1),node);
}
}
}
}
Output:
[(0,0)]
[]
[(1,0)]
[]
[(1,1)]
[]
[(2,1)]
[]
[(3,1)]
[]
[(3,2)]
[(3,2), (3,0)]
[(3,0)]
[(3,3), (3,0)]
[(3,0)]
(3,3)<----(3,2)<----(3,1)<----(2,1)<----(1,1)<----(1,0)<----(0,0)<----null
ASTAR SEARCH
MazeProblemData class
MazeProblem class
import java.util.HashMap;
@Override
public int heuristicFunc(Node node) {
MazeProblemData data = (MazeProblemData) node.data;
return (Math.abs(goalData.x-data.x)+Math.abs(goalData.y-data.y));
}
@Override
public void generateNodes(Node node) {
MazeProblemData data = (MazeProblemData) node.data;
int x = data.x;
int y = data.y;
if(validateCoordinate(x-1,y)) {
addToList(new MazeProblemData(x-1,y),node);
}
if(validateCoordinate(x+1,y)) {
addToList(new MazeProblemData(x+1,y),node);
}
if(validateCoordinate(x,y+1)) {
addToList(new MazeProblemData(x,y+1),node);
}
if(validateCoordinate(x,y-1)) {
addToList(new MazeProblemData(x,y-1),node);
}
}
}
}
Output:
[(0,0)]
[]
[(1,0)]
[]
[(1,1)]
[]
[(2,1)]
[]
[(3,1)]
[]
[(3,2)]
[(3,2), (3,0)]
[(3,0)]
[(3,3), (3,0)]
[(3,0)]
(3,3)<----(3,2)<----(3,1)<----(2,1)<----(1,1)<----(1,0)<----(0,0)<----null
Solution:
StateNode class
@Override
public String toString() {
return ""+x;
}
}
HillClimbing class
import java.util.ArrayList;
import java.util.Random;
public class HillClimbing {
CompareStateNode class
import java.util.Comparator;
Output:
Delta--->0.442
[20.558, 21.0, 21.442]
Delta--->0.638
[19.919999999999998, 20.558, 21.196]
Delta--->0.722
[19.197999999999997, 19.919999999999998, 20.642]
Delta--->0.128
[19.069999999999997, 19.197999999999997, 19.325999999999997]
Delta--->0.579
[18.490999999999996, 19.069999999999997, 19.648999999999997]
Delta--->0.644
[17.846999999999998, 18.490999999999996, 19.134999999999994]
Delta--->0.302
[17.544999999999998, 17.846999999999998, 18.148999999999997]
Delta--->0.135
[17.409999999999997, 17.544999999999998, 17.68]
Delta--->0.232
[17.177999999999997, 17.409999999999997, 17.641999999999996]
Delta--->0.946
[16.231999999999996, 17.177999999999997, 18.124]
Delta--->0.815
[15.416999999999996, 16.231999999999996, 17.046999999999997]
Delta--->0.236
[15.180999999999996, 15.416999999999996, 15.652999999999997]
Delta--->0.238
[14.942999999999996, 15.180999999999996, 15.418999999999995]
Delta--->0.853
[14.089999999999996, 14.942999999999996, 15.795999999999996]
Delta--->0.092
[13.997999999999996, 14.089999999999996, 14.181999999999997]
Delta--->0.19
[13.807999999999996, 13.997999999999996, 14.187999999999995]
Delta--->0.881
[12.926999999999996, 13.807999999999996, 14.688999999999997]
Delta--->0.828
[12.098999999999997, 12.926999999999996, 13.754999999999995]
Delta--->0.892
[11.206999999999997, 12.098999999999997, 12.990999999999996]
Delta--->0.248
[10.958999999999998, 11.206999999999997, 11.454999999999997]
Delta--->0.405
[10.553999999999998, 10.958999999999998, 11.363999999999997]
Delta--->0.609
[9.944999999999999, 10.553999999999998, 11.162999999999998]
Delta--->0.804
[9.140999999999998, 9.944999999999999, 10.748999999999999]
Delta--->0.876
[8.264999999999999, 9.140999999999998, 10.016999999999998]
Delta--->0.866
[7.398999999999999, 8.264999999999999, 9.130999999999998]
Delta--->0.57
[6.828999999999999, 7.398999999999999, 7.968999999999999]
Delta--->0.36
[6.4689999999999985, 6.828999999999999, 7.188999999999999]
Delta--->0.694
[5.774999999999999, 6.4689999999999985, 7.1629999999999985]
Delta--->0.004
[5.770999999999999, 5.774999999999999, 5.778999999999998]
Delta--->0.672
[5.098999999999999, 5.770999999999999, 6.442999999999999]
Delta--->0.901
[4.1979999999999995, 5.098999999999999, 5.999999999999999]
Delta--->0.572
[3.6259999999999994, 4.1979999999999995, 4.77]
Delta--->0.185
[3.4409999999999994, 3.6259999999999994, 3.8109999999999995]
Delta--->0.343
[3.0979999999999994, 3.4409999999999994, 3.7839999999999994]
Delta--->0.567
[2.5309999999999997, 3.0979999999999994, 3.664999999999999]
Delta--->0.032
[2.4989999999999997, 2.5309999999999997, 2.5629999999999997]
Delta--->0.431
[2.0679999999999996, 2.4989999999999997, 2.9299999999999997]
Delta--->0.278
[1.7899999999999996, 2.0679999999999996, 2.3459999999999996]
Delta--->0.727
[1.0629999999999997, 1.7899999999999996, 2.5169999999999995]
Delta--->0.144
[0.9189999999999997, 1.0629999999999997, 1.2069999999999996]
Delta--->0.532
[0.3869999999999997, 0.9189999999999997, 1.4509999999999996]
Delta--->0.253
[0.13399999999999967, 0.3869999999999997, 0.6399999999999997]
Delta--->0.341
[0.13399999999999967, -0.20700000000000035, 0.4749999999999997]
Minimum value of the function x2--->0.017955999999999913