Quellcode durchsuchen

algorithm almost done

Leon Palluch vor 4 Jahren
Ursprung
Commit
5b64d07d7b
2 geänderte Dateien mit 115 neuen und 5 gelöschten Zeilen
  1. 106 5
      src/pathgame/algorithm/TravellingSalesAlg.java
  2. 9 0
      src/pathgame/algorithm/TreeEdge.java

+ 106 - 5
src/pathgame/algorithm/TravellingSalesAlg.java

@@ -18,10 +18,116 @@ public class TravellingSalesAlg {
         ArrayList<TreeEdge> oddDegEdges = makeOddDegEdges(MSTree, salesPitch);
         MSTree.addAll(oddDegEdges);
 
+        ArrayList<Integer> eulerTour = getEulerTour(MSTree);
 
         return 10;
     }
 
+    private static ArrayList<Integer> getEulerTour(ArrayList<TreeEdge> graph) {
+        ArrayList<Integer> tour = new ArrayList<>();
+
+        while (graph.size() > 0) {
+            System.out.println();
+            for(int i = 0; i < graph.size(); i++) {
+                System.out.println("'" + graph.get(i).getSrc() + " : " + graph.get(i).getDest());
+            }
+            System.out.println();
+
+            if(tour.size() == 0) {
+                tour = getSubtour(graph, graph.get(0).getSrc());
+            }
+            else {
+                int start = -1;
+
+                for(int e = 0; e < graph.size(); e++) {
+                    TreeEdge edge = graph.get(e);
+                    for(int tp = 0; tp < tour.size(); tp++) {
+                        if(edge.getSrc() == tour.get(tp)) {
+                            start = edge.getSrc();
+                            break;
+                        }
+                        else if(edge.getDest() == tour.get(tp)) {
+                            start = edge.getDest();
+                            break;
+                        }
+                    }
+                    if(start!= -1) {
+                        break;
+                    }
+                }
+
+                ArrayList<Integer> subTour = getSubtour(graph, start);
+
+                mergeTours(tour, subTour);
+
+                System.out.println("merged tour");
+
+                for(int i = 0; i < tour.size(); i++) {
+                    if(i != 0) {
+                        System.out.print(" - ");
+                    }
+                    System.out.print(tour.get(i));
+                }
+                System.out.println();
+            }
+        }
+
+        return tour;
+    }
+
+    private static ArrayList<Integer> getSubtour(ArrayList<TreeEdge> graph, int start) {
+        ArrayList<Integer> tour = new ArrayList<>();
+        tour.add(start);
+
+        int pos = nextTourEdgePos(graph, start);
+        int next = graph.get(pos).getOtherVertex(start);
+        graph.remove(pos);
+        tour.add(next);
+
+        while (next != start) {
+            pos = nextTourEdgePos(graph, next);
+            next = graph.get(pos).getOtherVertex(next);
+            graph.remove(pos);
+            tour.add(next);
+        }
+
+        for(int i = 0; i < tour.size(); i++) {
+            if(i != 0) {
+                System.out.print(" - ");
+            }
+            System.out.print(tour.get(i));
+        }
+        System.out.println();
+
+        return tour;
+    }
+
+    private static int nextTourEdgePos(ArrayList<TreeEdge> graph, int vertex) {
+        for(int i = 0; i < graph.size(); i++) {
+            if(graph.get(i).getSrc() == vertex || graph.get(i).getDest() == vertex) {
+                return i;
+            }
+        }
+
+        return -1;
+    }
+
+    private static void mergeTours(ArrayList<Integer> tour, ArrayList<Integer> subTour) {
+        int mergeTo = subTour.get(0);
+
+        int mergePos = -1;
+
+        for(int i = 0; i < tour.size(); i++) {
+            if (tour.get(i) == mergeTo) {
+                mergePos = i;
+            }
+        }
+
+        for(int i = subTour.size()-1; i > 0; i--) {
+            tour.add(mergePos+1, subTour.get(i));
+        }
+    }
+
     private static ArrayList<TreeEdge> makeOddDegEdges(ArrayList<TreeEdge> msTree, ArrayList<ArrayList<SaleRoute>> salesPitch) {
         int numOfEdges[] = new int[salesPitch.size()];
 
@@ -109,7 +215,6 @@ public class TravellingSalesAlg {
                     calcPairShortest(oddDegs, salesPitch, permut, permutPos+1, costSoFar+edgeWeight);
                     oddDegs.makeUnused(used1);
                     oddDegs.makeUnused(used2);
-                    //TODO: do the right stuff
                 }
             }
 
@@ -123,16 +228,12 @@ public class TravellingSalesAlg {
 
             permut.increaseAtPos(permutPos);
 
-
-
             /*permut.increaseAtPos(3);
             permut.printPermut();
             permut.increaseAtPos(2);
             permut.printPermut();
             permut.increaseAtPos(2);
             permut.printPermut();*/
-
-            //break;
         }
     }
 

+ 9 - 0
src/pathgame/algorithm/TreeEdge.java

@@ -18,6 +18,15 @@ public class TreeEdge implements Comparable< TreeEdge > {
         return dest;
     }
 
+    public int getOtherVertex(int other) {
+        if(other == src) {
+            return dest;
+        }
+        else  {
+            return src;
+        }
+    }
+
     public Integer getWeight() {
         return weight;
     }