You are not logged in.

  • Login

1

Thursday, July 6th 2006, 9:16pm

Java Routenplanung: Dijkstra

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import java.util.*;
import fhw.ADSTool;
 
/**
 * Aufgabe2:
 * Berechnet den kuerzesten Weg zwischen 2 Knoten
 * @author Torben Brodt & Marco May
 *
 */
public class A2 {
 
/**
 * Mainmethode
 * @param args - Kommandozeilenparameter
 */
	public static void main(String[] args) {
		Graph g = new Graph();
		String[] werte = ADSTool.readStringArray(args.length == 0 ? "u12a2entf.dat" : args[0]);
		String start = args.length == 0 ? "Frankfurt/Main" : args[1];
		String ende = args.length == 0 ? "Augsburg" : args[2];
 
		for (int i = 0; i < werte.length - 2; i += 3) {
			if (!g.containsNode(werte[i])) // Stadt1
				g.addNode(werte[i]);
 
			if (!g.containsNode(werte[i + 1])) // Stadt2
				g.addNode(werte[i + 1]);
 
			if(!g.containsEdge(werte[i + 1], werte[i]))
				g.addDoubleEdge(werte[i + 1], werte[i], Integer.parseInt(werte[i + 2]));
		}
 
//g.show();
		System.out.println(shortestPath(g,start,ende));		
 
	}
 
 
	/**
	 * Berechnet die k�rzeste Strecke zwischen Start und Zielpunkt
	 * Anmerk.: In Zusammenarbeit mit Jarek Janas
	 * @param g	- Erstellter Graph
	 * @param start	-Startstring
	 * @param ziel -Zielstring
	 * @return Liste der gegangenen Knoten
	 */
	private static List<String> shortestPath(Graph g, String start, String ziel) {
		Heap myHeap = new Heap(g, start);
 
List<String> l = new LinkedList<String>();
 
 
		while (!myHeap.getSmallestNode().equals(ziel) && myHeap.getDistance(myHeap.getSmallestNode()) != Integer.MAX_VALUE) { 
 
 
			String stadtname =  myHeap.getSmallestNode();
			int wegZuDieserStadt = myHeap.getDistance(stadtname);
			int naechsterWert, val;
 
			myHeap.deleteNode(stadtname);
 
			for (Iterator<String> eit = g.edgeIterator(stadtname); eit.hasNext() ;) { 
				//Von dieser Stadt werden alle verknuepften Staedte geladen (bzw. Knoten wird expandiert)
				//Die Edges/Values werden verglichen und der kuerzeste Weg gesucht
				String verbundeneStadt = eit.next(); //Stuttgart Mannheim
 
				val = g.getEdgeValue(stadtname, verbundeneStadt);
				naechsterWert= wegZuDieserStadt + val;
 
 
				//in der PQ sind alle staedte drinne, also wird hier nur der wert bearbeitet
				//bearbeiten = loeschen und neu einfuegen (die PQ wird dann automatisch neu sortiert)
				//Update der Distanz nur, wenn ein besserer Weg gefunden wurde
 
				if(naechsterWert < myHeap.getDistance(verbundeneStadt)) {//kuerzerer Weg gefunden?
 
					myHeap.deleteNode(verbundeneStadt);
					myHeap.add(verbundeneStadt, naechsterWert);
					l.add(stadtname);
					l.add(verbundeneStadt);
				}
//				System.out.println("verbundene Stadt=>"+verbundeneStadt+" mit Wert "+naechsterWert);
 
				if(verbundeneStadt.equals(ziel)) {
					String[] arr = new String[l.size()];
					int myI = l.size();
					for(Iterator<String> myit=l.iterator(); myit.hasNext(); ) {
						arr[--myI] = myit.next(); //from
						arr[--myI] = myit.next(); //to
					}
 
					l = rekAusgabe(arr, 0, ziel, start, g, new LinkedList<String>());
					System.out.println("Kuerzester Weg von "+start+" nach "+ziel+" in "+myHeap.getDistance(ziel));
					return l;
				}
			}			
 
		}
		return null; //Keine Route
	}
 
	/**
	 * Rekursive Ausgabe der besuchten Punkte in eine Liste
	 * @param arr	- Ausgangsarray mit den besuchten Punkten
	 * @param i	-Monentaner Standpunkt
	 * @param ziel	-Zielknoten
	 * @param start	-Startknoten
	 * @param g	-Graphen
	 * @param l	-Liste in die gespeichert wird
	 * @return
	 */
	private static List<String> rekAusgabe(String[] arr, int i,String ziel, String start, Graph g, List<String> l) {
		if(i<arr.length && arr[i].equals(start)) {
			return l;
		}
		for(i=0; i<arr.length; i+=2) {
			if(arr[i].equals(ziel)) {
				int val = g.getEdgeValue(arr[i],arr[i+1]);
				l.add(0, arr[i+1]+" -> "+ziel+"("+val+")");
				return rekAusgabe(arr, i+1, arr[i+1], start, g,l);
			}
		}
		return null;
	}
}
Torben Brodt has attached the following files:
  • Graph.java (6.81 kB - 599 times downloaded - latest: May 14th 2012, 8:34pm)
  • GraphException.java (297 Byte - 303 times downloaded - latest: Apr 25th 2012, 4:19pm)

2

Thursday, February 10th 2011, 8:55pm

Anbei noch die fehlende Heap Implementierung

Java Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package ueb911;
import java.util.*;
 
/**
 * Heapklasse zum Verwalten der PQ
 * 
 */
public class Heap {
	Queue<Node> queue = new PriorityQueue<Node>();
	Map<String, Integer> map = new HashMap<String, Integer>();
 
	/**
	 * Konstruktor Start Knoten mit 0 init. /alle anderen sind unendlich
	 * @param g
	 * @return
	 */
	public Heap(Graph g, String start) {
		Iterator <String> it = g.nodeIterator();
 
		while(it.hasNext()) {
			String node = it.next();
			if(node.equals(start)){
				queue.add(new Node(node,0));
				map.put(node, 0);
			}
			else{
				queue.add(new Node(node,Integer.MAX_VALUE));
				map.put(node, Integer.MAX_VALUE);
			}
		}
	}
 
	/**
	 * Knotenklasse, wird intern verwaltet
	 * mit Knotenname und Wert
	 */
	class Node implements Comparable {
		String node, prev;
		int wert;
 
		public Node (String node, int distance) {
			this.node = node;
			this.wert = distance;
		}
 
		public int compareTo(Object o) {
			if (this.wert > ((Node)o).wert) return 1;
			if (this.wert < ((Node)o).wert) return -1;
			else return 0;
		}
	} 
 
	/**
	 * Fügt Knoten hinzu
	 * @param node -akt. Knoten
	 * @param wert-akt. Wert
	 */
	public void add(String node, int wert) {
		queue.add(new Node(node, wert));
		map.put(node, wert);
	}
 
	/**
	 * Gibt die Entfernung eines Knotens
	 * @return Distanz
	 */
	public String getSmallestNode() {
		return queue.peek().node;
	}
 
	/**
	 * Gibt die Entfernung eines Knotens
	 * @return Distanz
	 */
	public int getDistance(String node) {
		return map.get(node);
	}
 
	/**
	 * Löscht den Knoten aus dem Heap
	 * @param node -zu löschender Knoten
	 */
	public void deleteNode(String node) {
		queue.remove(new Node(node, map.get(node)));
	}
}

Social bookmarks