Implementierung einer einheitlichen KostensucheJava

Java-Forum
Guest
 Implementierung einer einheitlichen Kostensuche

Post by Guest »

Ich versuche, die Uniform Cost Search zu implementieren, nachdem ich mir den Kurs „Einführung in KI“ in Udacity angesehen habe. Allerdings erhält mein Algorithmus nicht den richtigen Pfad. Ich habe den ganzen Tag versucht, bevor ich hier etwas gepostet habe. Ich habe eine Karte hinzugefügt, um die Szene zu visualisieren. Der Algorithmus sollte den kürzesten gewichteten Weg von Arad nach Bukarest finden
Image


import java.util.PriorityQueue;
import java.util.HashSet;
import java.util.Set;
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;

//diff between uniform cost search and dijkstra algo is that UCS has a goal

public class UniformCostSearchAlgo{
public static void main(String[] args){

//initialize the graph base on the Romania map
Node n1 = new Node("Arad");
Node n2 = new Node("Zerind");
Node n3 = new Node("Oradea");
Node n4 = new Node("Sibiu");
Node n5 = new Node("Fagaras");
Node n6 = new Node("Rimnicu Vilcea");
Node n7 = new Node("Pitesti");
Node n8 = new Node("Timisoara");
Node n9 = new Node("Lugoj");
Node n10 = new Node("Mehadia");
Node n11 = new Node("Drobeta");
Node n12 = new Node("Craiova");
Node n13 = new Node("Bucharest");
Node n14 = new Node("Giurgiu");

//initialize the edges
n1.adjacencies = new Edge[]{
new Edge(n2,75),
new Edge(n4,140),
new Edge(n8,118)
};

n2.adjacencies = new Edge[]{
new Edge(n1,75),
new Edge(n3,71)
};

n3.adjacencies = new Edge[]{
new Edge(n2,71),
new Edge(n4,151)
};

n4.adjacencies = new Edge[]{
new Edge(n1,140),
new Edge(n5,99),
new Edge(n3,151),
new Edge(n6,80),
};

n5.adjacencies = new Edge[]{
new Edge(n4,99),
new Edge(n13,211)
};

n6.adjacencies = new Edge[]{
new Edge(n4,80),
new Edge(n7,97),
new Edge(n12,146)
};

n7.adjacencies = new Edge[]{
new Edge(n6,97),
new Edge(n13,101),
new Edge(n12,138)
};

n8.adjacencies = new Edge[]{
new Edge(n1,118),
new Edge(n9,111)
};

n9.adjacencies = new Edge[]{
new Edge(n8,111),
new Edge(n10,70)
};

n10.adjacencies = new Edge[]{
new Edge(n9,70),
new Edge(n11,75)
};

n11.adjacencies = new Edge[]{
new Edge(n10,75),
new Edge(n12,120)
};

n12.adjacencies = new Edge[]{
new Edge(n11,120),
new Edge(n6,146),
new Edge(n7,138)
};

n13.adjacencies = new Edge[]{
new Edge(n7,101),
new Edge(n14,90),
new Edge(n5,211)
};

n14.adjacencies = new Edge[]{
new Edge(n13,90)
};

UniformCostSearch(n1,n13);

List path = printPath(n13);

System.out.println("Path: " + path);

}

public static void UniformCostSearch(Node source, Node goal){

source.pathCost = 0;
PriorityQueue queue = new PriorityQueue(20,
new Comparator(){

//override compare method
public int compare(Node i, Node j){
if(i.pathCost > j.pathCost){
return 1;
}

else if (i.pathCost < j.pathCost){
return -1;
}

else{
return 0;
}
}
}

);

queue.add(source);
Set explored = new HashSet();
boolean found = false;

//while frontier is not empty
do{

Node current = queue.poll();
explored.add(current);

if(current.value.equals(goal.value)){
found = true;

}

for(Edge e: current.adjacencies){
Node child = e.target;
double cost = e.cost;
child.pathCost = current.pathCost + cost;

if(!explored.contains(child) && !queue.contains(child)){

child.parent = current;
queue.add(child);

System.out.println(child);
System.out.println(queue);
System.out.println();

}

else if((queue.contains(child))&&(child.pathCost>current.pathCost)){

child.parent=current;
current = child;

}

}
}while(!queue.isEmpty());

}

public static List printPath(Node target){
List path = new ArrayList();
for(Node node = target; node!=null; node = node.parent){
path.add(node);
}

Collections.reverse(path);

return path;

}

}

class Node{

public final String value;
public double pathCost;
public Edge[] adjacencies;
public Node parent;

public Node(String val){

value = val;

}

public String toString(){
return value;
}

}

class Edge{
public final double cost;
public final Node target;

public Edge(Node targetNode, double costVal){
cost = costVal;
target = targetNode;

}
}

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post