Kann mir vielleicht bitte jemand schnell sagen, was hier falsch ist? Ich möchte eine ganz einfache BreadthSearch auf einem Graphen, der Zyklen enthalten kann oder schnellere Rückwege, durchführen, die ALLE Wege liefert, um dann den kürzesten Weg zu suchen:
Es scheint so, als ob alles OK wäre, aber wenn ein Umweg hinzukommt, dann scheint das nicht mehr zu funktionieren:
Oder habe ich etwas übersehen? Eine Optimierung ala Dijkstra möchte ich nicht durchführen.
Ausgabe 1
50.0
a -> d ->
51.0
a -> d -> b ->
52.0
a -> d -> b -> a ->
61.0
a -> d -> b -> c ->
66.0
a -> d -> b -> d ->
75.0
a -> d -> c ->
85.0
a -> d -> c -> b ->
90.0
a -> c ->
100.0
a -> b ->
100.0
a -> c -> b ->
100.0
a -> d -> c -> d ->
101.0
a -> b -> a ->
101.0
a -> c -> b -> a ->
110.0
a -> b -> c ->
110.0
a -> c -> b -> c ->
115.0
a -> b -> d ->
115.0
a -> c -> d ->
115.0
a -> c -> b -> d ->
116.0
a -> b -> d -> b ->
116.0
a -> c -> d -> b ->
120.0
a -> b -> c -> b ->
135.0
a -> b -> c -> d ->
140.0
a -> b -> d -> c ->
140.0
a -> c -> d -> c ->
151.0
a -> b -> a -> d ->
165.0
a -> d -> c -> a ->
180.0
a -> c -> a ->
191.0
a -> b -> a -> c ->
200.0
a -> b -> c -> a ->
201.0
a -> b -> a -> b ->
230.0
a -> c -> a -> d ->
270.0
a -> c -> a -> c ->
280.0
a -> c -> a -> b ->
Ausgabe 2
50.0
a -> d ->
51.0
a -> d -> b ->
52.0
a -> d -> b -> a ->
61.0
a -> d -> b -> c ->
66.0
a -> d -> b -> d ->
75.0
a -> d -> c ->
85.0
a -> d -> c -> b ->
90.0
a -> c ->
100.0
a -> b ->
100.0
a -> c -> b ->
100.0
a -> d -> c -> d ->
101.0
a -> b -> a ->
101.0
a -> c -> b -> a ->
110.0
a -> umweg ->
110.0
a -> b -> c ->
110.0
a -> c -> b -> c ->
115.0
a -> b -> d ->
115.0
a -> c -> d ->
115.0
a -> c -> b -> d ->
116.0
a -> b -> d -> b ->
116.0
a -> c -> d -> b ->
120.0
a -> b -> c -> b ->
135.0
a -> b -> c -> d ->
140.0
a -> b -> d -> c ->
140.0
a -> c -> d -> c ->
151.0
a -> b -> a -> d ->
160.0
a -> d -> umweg ->
161.0
a -> d -> b -> umweg ->
165.0
a -> d -> c -> a ->
180.0
a -> c -> a ->
185.0
a -> d -> c -> umweg ->
191.0
a -> b -> a -> c ->
200.0
a -> c -> umweg ->
200.0
a -> b -> c -> a ->
201.0
a -> b -> a -> b ->
210.0
a -> b -> umweg ->
210.0
a -> c -> b -> umweg ->
211.0
a -> b -> a -> umweg ->
220.0
a -> umweg -> a ->
220.0
a -> umweg -> b ->
220.0
a -> umweg -> c ->
220.0
a -> umweg -> d ->
220.0
a -> b -> c -> umweg ->
221.0
a -> umweg -> b -> a ->
221.0
a -> umweg -> d -> b ->
225.0
a -> b -> d -> umweg ->
225.0
a -> c -> d -> umweg ->
230.0
a -> umweg -> b -> c ->
230.0
a -> umweg -> c -> b ->
230.0
a -> c -> a -> d ->
235.0
a -> umweg -> b -> d ->
245.0
a -> umweg -> c -> d ->
245.0
a -> umweg -> d -> c ->
270.0
a -> umweg -> a -> d ->
270.0
a -> c -> a -> c ->
280.0
a -> c -> a -> b ->
290.0
a -> c -> a -> umweg ->
310.0
a -> umweg -> a -> c ->
310.0
a -> umweg -> c -> a ->
320.0
a -> umweg -> a -> b ->
330.0
a -> umweg -> a -> umweg ->
330.0
a -> umweg -> b -> umweg ->
330.0
a -> umweg -> c -> umweg ->
330.0
a -> umweg -> d -> umweg ->
Java:
package gra;
public record WeightEdge(double costs, DirWeightNode node) {
}
package gra;
public class DirWeightNode {
public Object content;
public WeightEdge[] edges;
}
package gra;
public record Way(double sumCosts, DirWeightNode... way) {
}
package gra;
import java.util.*;
public class BreadthSearch {
public static ArrayList<Way> allWays(DirWeightNode start) {
ArrayList<Way> ways = new ArrayList<>();
HashSet<WeightEdge> visited = new HashSet<>();
Queue<Way> queue = new ArrayDeque<>();
queue.add(new Way(0, start));
while (!queue.isEmpty()) {
Way first = queue.remove();
DirWeightNode[] way1 = first.way();
DirWeightNode last = way1[way1.length - 1];
for (WeightEdge current : last.edges) {
double newCosts = first.sumCosts() + current.costs();
DirWeightNode[] newWay = extendArray(current.node(), way1);
Way way2 = new Way(newCosts, newWay);
ways.add(way2);
if (!visited.contains(current)) {
visited.add(current);
queue.add(way2);
}
}
}
return ways;
}
public static DirWeightNode[] extendArray(DirWeightNode a, DirWeightNode... b) {
DirWeightNode[] newArray = new DirWeightNode[b.length + 1];
System.arraycopy(b, 0, newArray, 0, b.length);
newArray[b.length] = a;
return newArray;
}
public static void main(String[] args) {
DirWeightNode a = new DirWeightNode();
DirWeightNode b = new DirWeightNode();
DirWeightNode c = new DirWeightNode();
DirWeightNode d = new DirWeightNode();
a.content = "a";
b.content = "b";
c.content = "c";
d.content = "d";
a.edges = new WeightEdge[]{new WeightEdge(100, b), new WeightEdge(90, c), new WeightEdge(50, d)};
b.edges = new WeightEdge[]{new WeightEdge(1, a), new WeightEdge(10, c), new WeightEdge(15, d)};
c.edges = new WeightEdge[]{new WeightEdge(10, b), new WeightEdge(90, a), new WeightEdge(25, d)};
d.edges = new WeightEdge[]{new WeightEdge(25, c), new WeightEdge(1, b)};
ArrayList<Way> ways = allWays(a);
ways.sort(Comparator.comparing(Way::sumCosts));
for (Way way : ways) {
System.out.println(way.sumCosts());
for (DirWeightNode node : way.way()) {
System.out.print(node.content + " -> ");
}
System.out.println();
}
}
}
Es scheint so, als ob alles OK wäre, aber wenn ein Umweg hinzukommt, dann scheint das nicht mehr zu funktionieren:
Java:
public static void main(String[] args) {
DirWeightNode a = new DirWeightNode();
DirWeightNode b = new DirWeightNode();
DirWeightNode c = new DirWeightNode();
DirWeightNode d = new DirWeightNode();
DirWeightNode umweg = new DirWeightNode();
a.content = "a";
b.content = "b";
c.content = "c";
d.content = "d";
umweg.content = "umweg";
a.edges = new WeightEdge[]{new WeightEdge(110, umweg), new WeightEdge(100, b), new WeightEdge(90, c), new WeightEdge(50, d)};
b.edges = new WeightEdge[]{new WeightEdge(110, umweg), new WeightEdge(1, a), new WeightEdge(10, c), new WeightEdge(15, d)};
c.edges = new WeightEdge[]{new WeightEdge(110, umweg), new WeightEdge(10, b), new WeightEdge(90, a), new WeightEdge(25, d)};
d.edges = new WeightEdge[]{new WeightEdge(110, umweg), new WeightEdge(25, c), new WeightEdge(1, b)};
umweg.edges = new WeightEdge[]{new WeightEdge(110, a), new WeightEdge(110, b), new WeightEdge(110, c), new WeightEdge(110, d)};
ArrayList<Way> ways = allWays(a);
ways.sort(Comparator.comparing(Way::sumCosts));
for (Way way : ways) {
System.out.println(way.sumCosts());
for (DirWeightNode node : way.way()) {
System.out.print(node.content + " -> ");
}
System.out.println();
}
}
Oder habe ich etwas übersehen? Eine Optimierung ala Dijkstra möchte ich nicht durchführen.
Ausgabe 1
50.0
a -> d ->
51.0
a -> d -> b ->
52.0
a -> d -> b -> a ->
61.0
a -> d -> b -> c ->
66.0
a -> d -> b -> d ->
75.0
a -> d -> c ->
85.0
a -> d -> c -> b ->
90.0
a -> c ->
100.0
a -> b ->
100.0
a -> c -> b ->
100.0
a -> d -> c -> d ->
101.0
a -> b -> a ->
101.0
a -> c -> b -> a ->
110.0
a -> b -> c ->
110.0
a -> c -> b -> c ->
115.0
a -> b -> d ->
115.0
a -> c -> d ->
115.0
a -> c -> b -> d ->
116.0
a -> b -> d -> b ->
116.0
a -> c -> d -> b ->
120.0
a -> b -> c -> b ->
135.0
a -> b -> c -> d ->
140.0
a -> b -> d -> c ->
140.0
a -> c -> d -> c ->
151.0
a -> b -> a -> d ->
165.0
a -> d -> c -> a ->
180.0
a -> c -> a ->
191.0
a -> b -> a -> c ->
200.0
a -> b -> c -> a ->
201.0
a -> b -> a -> b ->
230.0
a -> c -> a -> d ->
270.0
a -> c -> a -> c ->
280.0
a -> c -> a -> b ->
Ausgabe 2
50.0
a -> d ->
51.0
a -> d -> b ->
52.0
a -> d -> b -> a ->
61.0
a -> d -> b -> c ->
66.0
a -> d -> b -> d ->
75.0
a -> d -> c ->
85.0
a -> d -> c -> b ->
90.0
a -> c ->
100.0
a -> b ->
100.0
a -> c -> b ->
100.0
a -> d -> c -> d ->
101.0
a -> b -> a ->
101.0
a -> c -> b -> a ->
110.0
a -> umweg ->
110.0
a -> b -> c ->
110.0
a -> c -> b -> c ->
115.0
a -> b -> d ->
115.0
a -> c -> d ->
115.0
a -> c -> b -> d ->
116.0
a -> b -> d -> b ->
116.0
a -> c -> d -> b ->
120.0
a -> b -> c -> b ->
135.0
a -> b -> c -> d ->
140.0
a -> b -> d -> c ->
140.0
a -> c -> d -> c ->
151.0
a -> b -> a -> d ->
160.0
a -> d -> umweg ->
161.0
a -> d -> b -> umweg ->
165.0
a -> d -> c -> a ->
180.0
a -> c -> a ->
185.0
a -> d -> c -> umweg ->
191.0
a -> b -> a -> c ->
200.0
a -> c -> umweg ->
200.0
a -> b -> c -> a ->
201.0
a -> b -> a -> b ->
210.0
a -> b -> umweg ->
210.0
a -> c -> b -> umweg ->
211.0
a -> b -> a -> umweg ->
220.0
a -> umweg -> a ->
220.0
a -> umweg -> b ->
220.0
a -> umweg -> c ->
220.0
a -> umweg -> d ->
220.0
a -> b -> c -> umweg ->
221.0
a -> umweg -> b -> a ->
221.0
a -> umweg -> d -> b ->
225.0
a -> b -> d -> umweg ->
225.0
a -> c -> d -> umweg ->
230.0
a -> umweg -> b -> c ->
230.0
a -> umweg -> c -> b ->
230.0
a -> c -> a -> d ->
235.0
a -> umweg -> b -> d ->
245.0
a -> umweg -> c -> d ->
245.0
a -> umweg -> d -> c ->
270.0
a -> umweg -> a -> d ->
270.0
a -> c -> a -> c ->
280.0
a -> c -> a -> b ->
290.0
a -> c -> a -> umweg ->
310.0
a -> umweg -> a -> c ->
310.0
a -> umweg -> c -> a ->
320.0
a -> umweg -> a -> b ->
330.0
a -> umweg -> a -> umweg ->
330.0
a -> umweg -> b -> umweg ->
330.0
a -> umweg -> c -> umweg ->
330.0
a -> umweg -> d -> umweg ->