diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..217af47 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,23 @@ + + + + + + diff --git a/.idea/description.html b/.idea/description.html new file mode 100644 index 0000000..db5f129 --- /dev/null +++ b/.idea/description.html @@ -0,0 +1 @@ +Simple Java application that includes a class with main() method \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..97626ba --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..2fcefcc --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..0843ceb --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Zavrsni_DFSiBFS.iml b/Zavrsni_DFSiBFS.iml new file mode 100644 index 0000000..d5c0743 --- /dev/null +++ b/Zavrsni_DFSiBFS.iml @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/A_Star.java b/src/A_Star.java new file mode 100644 index 0000000..311d230 --- /dev/null +++ b/src/A_Star.java @@ -0,0 +1,2 @@ +public abstract class A_Star extends GraphSearchAlgorithm{ +} diff --git a/src/BFS.java b/src/BFS.java new file mode 100644 index 0000000..8299f9a --- /dev/null +++ b/src/BFS.java @@ -0,0 +1,18 @@ +import java.util.*; + +public class BFS extends GraphSearchAlgorithm{ + + @Override + AbstractCollection initOpen() { + return new LinkedList<>(); + } + + @Override + Node nextNode(AbstractCollection open) throws Exception { + if(open instanceof Queue) { + return ((Queue)open).remove(); + } else{ + throw new Exception("Krivog tipa je open"); + } + } +} diff --git a/src/DFS.java b/src/DFS.java new file mode 100644 index 0000000..cda5f38 --- /dev/null +++ b/src/DFS.java @@ -0,0 +1,19 @@ +import java.util.AbstractCollection; +import java.util.Stack; + +public class DFS extends GraphSearchAlgorithm{ + + @Override + AbstractCollection initOpen() { + return new Stack<>(); + } + + @Override + Node nextNode(AbstractCollection open) throws Exception { + if(open instanceof Stack) { + return ((Stack)open).pop(); + } else{ + throw new Exception("Krivog tipa je open"); + } + } +} diff --git a/src/GraphSearchAlgorithm.java b/src/GraphSearchAlgorithm.java new file mode 100644 index 0000000..7680c03 --- /dev/null +++ b/src/GraphSearchAlgorithm.java @@ -0,0 +1,32 @@ +import java.util.*; + +abstract class GraphSearchAlgorithm { + + public List run(Node s0, SearchProblem problem) throws Exception { + Node node = s0; + AbstractCollection open = initOpen(); + open.add(node); + Set closed = new HashSet<>(); + while(! open.isEmpty()){ + node = nextNode(open); + if(problem.isGoalState(node)){ + return node.path(); + } + if(!closed.contains(node)){ + closed.add(node); + Map succ = problem.successors(node); + for(Node m : succ.keySet()){ + //if(m.getCost() == null || m.getCost() > node.getCost() + succ.get(m)){ + m.setCost(node.getCost() + succ.get(m)); + open.add(m); + } + } + } + return null; + } + + abstract AbstractCollection initOpen(); + + abstract Node nextNode(AbstractCollection open) throws Exception; + +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..8ba065e --- /dev/null +++ b/src/Main.java @@ -0,0 +1,7 @@ +public class Main { + + public static void main(String[] args) { + Problem[] problems = Reader.getProblems(); + + } +} diff --git a/src/Node.java b/src/Node.java new file mode 100644 index 0000000..ae3eb9e --- /dev/null +++ b/src/Node.java @@ -0,0 +1,52 @@ +import java.util.LinkedList; +import java.util.List; + +class Node { + + private String name; + private Node parent; + private boolean isRootNode; + private Double cost; + + public Node(String name, Node parent, boolean isRootNode){ + this.name = name; + this.parent = parent; + this.isRootNode = isRootNode; + } + + List path() { + List list; + if(isRootNode) { + list = new LinkedList<>(); + } else { + list = parent.path(); + } + list.add(0, this); + return list; + } + + public boolean isRootNode() { + return isRootNode; + } + + public Node getParent() { + return parent; + } + + public String getName(){ + return name; + } + + public void setCost(Double cost){ + this.cost = cost; + } + + public Double getCost(){ + return cost; + } + + @Override + public String toString() { + return name; + } +} diff --git a/src/Problem.java b/src/Problem.java new file mode 100644 index 0000000..cadf99e --- /dev/null +++ b/src/Problem.java @@ -0,0 +1,21 @@ +import java.util.List; +import java.util.Map; + +class Problem { + + Map> successors; + + Problem(Map> successors){ + this.successors = successors; + } + + boolean isGoalState(Node n) { + return n.isRootNode(); + } + + Map successors(Node n) { + return successors.get(n); + } + //!!!!pospremaj svako stanje jednom u memoriju za svaki par stanje-roditelj, da se moze koristiti path() + //da vrati put do stanja +} diff --git a/src/Reader.java b/src/Reader.java new file mode 100644 index 0000000..4d6c791 --- /dev/null +++ b/src/Reader.java @@ -0,0 +1,5 @@ +class Reader { + static Problem[] getProblems(){ + return null; + } +} diff --git a/src/SearchProblem.java b/src/SearchProblem.java new file mode 100644 index 0000000..f6baff2 --- /dev/null +++ b/src/SearchProblem.java @@ -0,0 +1,9 @@ +import java.util.List; +import java.util.Map; + +class SearchProblem extends Problem { + + SearchProblem(Map> successors) { + super(successors); + } +}