|
@@ -11,6 +11,7 @@ public class TravellingSalesAlg {
|
|
|
|
|
|
ArrayList<ArrayList<SaleRoute>> salesPitch = dijkstra.getSalesPitch();
|
|
|
|
|
|
+
|
|
|
|
|
|
ArrayList<TreeEdge> MSTree = makeMSTree(salesPitch);
|
|
|
|
|
@@ -18,20 +19,161 @@ public class TravellingSalesAlg {
|
|
|
ArrayList<TreeEdge> oddDegEdges = makeOddDegEdges(MSTree, salesPitch);
|
|
|
MSTree.addAll(oddDegEdges);
|
|
|
|
|
|
+
|
|
|
ArrayList<Integer> eulerTour = getEulerTour(MSTree);
|
|
|
|
|
|
- return 10;
|
|
|
+
|
|
|
+ cutShort(eulerTour);
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ int tourWeight = calcTourWeight(eulerTour, salesPitch);
|
|
|
+ System.out.println("min cost: " + tourWeight);
|
|
|
+ return tourWeight;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int bruteForce(ArrayList<ArrayList<SaleRoute>> salesPitch) {
|
|
|
+ Permutation permutation = new Permutation(salesPitch.size(), 1);
|
|
|
+ OddDegreeList nodeList = new OddDegreeList();
|
|
|
+ for(int i = 0; i < salesPitch.size()+1; i++) {
|
|
|
+ nodeList.add(i);
|
|
|
+ }
|
|
|
+
|
|
|
+ while(!permutation.isOverFlowing()) {
|
|
|
+ int newSum = bruteSumPermut(permutation, salesPitch, nodeList);
|
|
|
+ if(newSum < permutation.getMinCost()) {
|
|
|
+ permutation.setMinCost(newSum);
|
|
|
+ }
|
|
|
+
|
|
|
+ System.out.println(newSum);
|
|
|
+ System.out.println();*/
|
|
|
+ permutation.increaseLowest();
|
|
|
+ }
|
|
|
+ permutation.makePermutMinimal();
|
|
|
+ permutation.printPermut();
|
|
|
+ System.out.println("min cost: " + permutation.getMinCost());
|
|
|
+
|
|
|
+
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int bruteSumPermut(Permutation permutation, ArrayList<ArrayList<SaleRoute>> salesPitch, OddDegreeList nodeList) {
|
|
|
+ int sum = 0;
|
|
|
+ nodeList.resetUsed();
|
|
|
+
|
|
|
+ int first = -1;
|
|
|
+ int last = -1;
|
|
|
+
|
|
|
+ for(int i = 0; i < permutation.size(); i++) {
|
|
|
+ int pos = nodeList.getUnused(permutation.getValAtPos(i));
|
|
|
+
|
|
|
+
|
|
|
+ if(first == -1) {
|
|
|
+ first = pos;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+
|
|
|
+ sum += bruteWeight(last, pos, salesPitch);
|
|
|
+
|
|
|
+ }
|
|
|
+ last = pos;
|
|
|
+
|
|
|
+ nodeList.makePosUsed(pos);
|
|
|
+ }
|
|
|
+
|
|
|
+ int pos = nodeList.getUnused(0);
|
|
|
+ sum += bruteWeight(last, pos, salesPitch);
|
|
|
+
|
|
|
+
|
|
|
+ sum += bruteWeight(pos, first, salesPitch);
|
|
|
+
|
|
|
+ return sum;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int bruteWeight(int first, int sec, ArrayList<ArrayList<SaleRoute>> salesPitch) {
|
|
|
+ if(first < sec) {
|
|
|
+ return salesPitch.get(first).get(sec-first-1).getTotalCost();
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return salesPitch.get(sec).get(first-sec-1).getTotalCost();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int calcTourWeight(ArrayList<Integer> tour, ArrayList<ArrayList<SaleRoute>> salesPitch) {
|
|
|
+ int totalWeight = 0;
|
|
|
+
|
|
|
+ for(int i = 0; i < tour.size()-1; i++) {
|
|
|
+ int startNode, endNode;
|
|
|
+
|
|
|
+ if(tour.get(i) < tour.get(i+1)) {
|
|
|
+ startNode = tour.get(i);
|
|
|
+ endNode = tour.get(i+1) - startNode - 1;
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ startNode = tour.get(i+1);
|
|
|
+ endNode = tour.get(i) - startNode - 1;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ totalWeight += salesPitch.get(startNode).get(endNode).getTotalCost();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ return totalWeight;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static void cutShort(ArrayList<Integer> eulerTour) {
|
|
|
+ int counter = 2;
|
|
|
+
|
|
|
+ while(counter < eulerTour.size()-1) {
|
|
|
+ int current = eulerTour.get(counter);
|
|
|
+
|
|
|
+ boolean found = false;
|
|
|
+
|
|
|
+ for(int i = 0; i < counter; i++) {
|
|
|
+ if(eulerTour.get(i) == current) {
|
|
|
+ found = true;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(found) {
|
|
|
+ eulerTour.remove(counter);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ counter++;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ for(int i = 0; i < eulerTour.size(); i++) {
|
|
|
+ if(i != 0) {
|
|
|
+ System.out.print(" - ");
|
|
|
+ }
|
|
|
+ System.out.print(eulerTour.get(i));
|
|
|
+ }
|
|
|
+ System.out.println();*/
|
|
|
+
|
|
|
}
|
|
|
|
|
|
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();
|
|
|
+ System.out.println();*/
|
|
|
|
|
|
if(tour.size() == 0) {
|
|
|
tour = getSubtour(graph, graph.get(0).getSrc());
|
|
@@ -60,7 +202,7 @@ public class TravellingSalesAlg {
|
|
|
|
|
|
mergeTours(tour, subTour);
|
|
|
|
|
|
- System.out.println("merged tour");
|
|
|
+
|
|
|
|
|
|
for(int i = 0; i < tour.size(); i++) {
|
|
|
if(i != 0) {
|
|
@@ -68,7 +210,7 @@ public class TravellingSalesAlg {
|
|
|
}
|
|
|
System.out.print(tour.get(i));
|
|
|
}
|
|
|
- System.out.println();
|
|
|
+ System.out.println();*/
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -91,13 +233,13 @@ public class TravellingSalesAlg {
|
|
|
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();
|
|
|
+ System.out.println();*/
|
|
|
|
|
|
return tour;
|
|
|
}
|
|
@@ -145,7 +287,7 @@ public class TravellingSalesAlg {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- Permutation permut = new Permutation(oddDegs.size());
|
|
|
+ Permutation permut = new Permutation(oddDegs.size(), 2);
|
|
|
|
|
|
calcPairShortest(oddDegs, salesPitch, permut, 0, 0);
|
|
|
permut.makePermutMinimal();
|
|
@@ -170,9 +312,9 @@ public class TravellingSalesAlg {
|
|
|
|
|
|
private static void addOddEdge(ArrayList<TreeEdge> oddEdges, OddDegreeList oddDegs, ArrayList<ArrayList<SaleRoute>> salesPitch, int offSet) {
|
|
|
int orig = oddDegs.getUnused(0);
|
|
|
- oddDegs.makeUsed(0);
|
|
|
+ oddDegs.makeOffsetUsed(0);
|
|
|
int dest = oddDegs.getUnused(offSet);
|
|
|
- oddDegs.makeUsed(offSet);
|
|
|
+ oddDegs.makeOffsetUsed(offSet);
|
|
|
|
|
|
oddEdges.add(new TreeEdge(orig, dest, salesPitch.get(orig).get(dest - orig - 1).getTotalCost()));
|
|
|
}
|
|
@@ -210,8 +352,8 @@ public class TravellingSalesAlg {
|
|
|
System.out.println("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");*/
|
|
|
}
|
|
|
else {
|
|
|
- int used1 = oddDegs.makeUsed(0);
|
|
|
- int used2 = oddDegs.makeUsed(offSet);
|
|
|
+ int used1 = oddDegs.makeOffsetUsed(0);
|
|
|
+ int used2 = oddDegs.makeOffsetUsed(offSet);
|
|
|
calcPairShortest(oddDegs, salesPitch, permut, permutPos+1, costSoFar+edgeWeight);
|
|
|
oddDegs.makeUnused(used1);
|
|
|
oddDegs.makeUnused(used2);
|