diff --git a/src/main/java/Algorithm/VNSALS.java b/src/main/java/Algorithm/VNSALS.java index 671d4c0..bd790f6 100644 --- a/src/main/java/Algorithm/VNSALS.java +++ b/src/main/java/Algorithm/VNSALS.java @@ -25,7 +25,6 @@ public OptimizeJob(Solution solution) { @Override public void run() { - } } } diff --git a/src/main/java/Common/Solution.java b/src/main/java/Common/Solution.java index 3c6b4f8..dc67e4e 100644 --- a/src/main/java/Common/Solution.java +++ b/src/main/java/Common/Solution.java @@ -11,12 +11,20 @@ public class Solution { public List unassignedCustomer; public Problem problem; private int autoIncrement; + private double distance; public Solution(List routes, Problem problem, List unassignedCustomer) { this.routes = routes; this.unassignedCustomer = unassignedCustomer; this.problem = problem; this.autoIncrement = 0; + this.distance = 0; + for (Route route : routes) { + for (int i = 0; i < route.length(); i++) { + distance += problem.getDistance(route.getNode(i - 1), route.getNode(i)); + } + distance += problem.getDistance(route.getNode(route.length() - 1), route.getNode(route.length())); + } } public Solution(List routes, Problem problem) { @@ -31,6 +39,7 @@ public Solution(Solution other) { this.problem = other.problem; this.unassignedCustomer = new ArrayList<>(other.unassignedCustomer); this.autoIncrement = other.getAutoIncrement(); + this.distance = other.getDistance(); } public void shuffle() { @@ -45,7 +54,15 @@ public int getAutoIncrement() { return autoIncrement; } - public double getDistance() { + public double getDistance(){ + return distance; + } + + public void updateDistance(double delta){ + this.distance += delta; + } + + public double refreshDistance() { double distance = 0; for (Route route : routes) { for (int i = 0; i < route.length(); i++) { @@ -53,6 +70,7 @@ public double getDistance() { } distance += problem.getDistance(route.getNode(route.length() - 1), route.getNode(route.length())); } + this.distance = distance; return distance; } diff --git a/src/main/java/Entry.java b/src/main/java/Entry.java index 297063d..d838f4e 100644 --- a/src/main/java/Entry.java +++ b/src/main/java/Entry.java @@ -38,6 +38,6 @@ public static void main(String[] args) throws IOException { bestSol = new Solution(solution); } } - logger.info(bestSol.getDistance()); + logger.info(bestSol.refreshDistance()); } } diff --git a/src/main/java/Operators/Insertion.java b/src/main/java/Operators/Insertion.java index eff8510..838bfd3 100644 --- a/src/main/java/Operators/Insertion.java +++ b/src/main/java/Operators/Insertion.java @@ -89,6 +89,7 @@ public void singleOperate(Solution solution, OperationContext context) { bestContext.mainRoute.addNode(bestContext.operatePos[0], bestContext.operateNodes[0]); } } + solution.refreshDistance(); solution.unassignedCustomer.clear(); } diff --git a/src/main/java/Operators/OperationContext.java b/src/main/java/Operators/OperationContext.java index f6ff496..2a6232a 100644 --- a/src/main/java/Operators/OperationContext.java +++ b/src/main/java/Operators/OperationContext.java @@ -54,7 +54,7 @@ public OperationContext copy() { } public enum operatorType { - INSERT, SUBSTITUTE, Shift10, Shift20, Swap11, Swap21, Swap22, TwoOpt, TwoOptStar1, TwoOptStar2 + INSERT, Shift10, Shift20, Swap11, Swap21, Swap22, TwoOpt, TwoOptStar1, TwoOptStar2 } /** diff --git a/src/main/java/Operators/Shift10.java b/src/main/java/Operators/Shift10.java index 3026cb7..17f6fd1 100644 --- a/src/main/java/Operators/Shift10.java +++ b/src/main/java/Operators/Shift10.java @@ -36,6 +36,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); if (i >= mainRoute.length()) break; // shift 结点后,路径可能变短 } } diff --git a/src/main/java/Operators/Shift20.java b/src/main/java/Operators/Shift20.java index 0b2a9e7..29cd817 100644 --- a/src/main/java/Operators/Shift20.java +++ b/src/main/java/Operators/Shift20.java @@ -36,6 +36,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); if (i >= mainRoute.length() - 1) break; // shift 结点后,路径可能变短 } } diff --git a/src/main/java/Operators/Swap11.java b/src/main/java/Operators/Swap11.java index 9b9abca..b9d9589 100644 --- a/src/main/java/Operators/Swap11.java +++ b/src/main/java/Operators/Swap11.java @@ -44,6 +44,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } @@ -56,6 +57,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } diff --git a/src/main/java/Operators/Swap21.java b/src/main/java/Operators/Swap21.java index 7e43b5e..f707e20 100644 --- a/src/main/java/Operators/Swap21.java +++ b/src/main/java/Operators/Swap21.java @@ -32,6 +32,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } @@ -44,6 +45,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); if (i >= mainRoute.length() - 1) break; } } diff --git a/src/main/java/Operators/Swap22.java b/src/main/java/Operators/Swap22.java index 38c9cec..ff85ea7 100644 --- a/src/main/java/Operators/Swap22.java +++ b/src/main/java/Operators/Swap22.java @@ -32,6 +32,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } @@ -44,6 +45,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } diff --git a/src/main/java/Operators/TwoOpt.java b/src/main/java/Operators/TwoOpt.java index c619252..0cf10b0 100644 --- a/src/main/java/Operators/TwoOpt.java +++ b/src/main/java/Operators/TwoOpt.java @@ -29,6 +29,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); } } } diff --git a/src/main/java/Operators/TwoOptStar1.java b/src/main/java/Operators/TwoOptStar1.java index dcd2770..ce68767 100644 --- a/src/main/java/Operators/TwoOptStar1.java +++ b/src/main/java/Operators/TwoOptStar1.java @@ -43,6 +43,7 @@ public void doOperateAll(Solution solution) { double costChg = softConstraintManager.fulfilled(context); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); + solution.updateDistance(costChg); if (i >= mainRoute.length() - 1 || j >= sideRoute.length() - 1) break; refreshOperateVal(context); } diff --git a/src/main/java/Operators/TwoOptStar2.java b/src/main/java/Operators/TwoOptStar2.java index b591574..a10d2c7 100644 --- a/src/main/java/Operators/TwoOptStar2.java +++ b/src/main/java/Operators/TwoOptStar2.java @@ -45,6 +45,7 @@ public void doOperateAll(Solution solution) { singleOperate(solution, context); if (i >= mainRoute.length() - 1 || j >= sideRoute.length() - 1) break; refreshOperateVal(context); + solution.updateDistance(costChg); } } weight[1] = 0; diff --git a/src/main/java/Utils/RandomController.java b/src/main/java/Utils/RandomController.java index c73600e..e7be493 100644 --- a/src/main/java/Utils/RandomController.java +++ b/src/main/java/Utils/RandomController.java @@ -1,8 +1,6 @@ package Utils; -import java.util.Collections; -import java.util.List; -import java.util.Random; +import java.util.*; public class RandomController { private static Random random = new Random(System.currentTimeMillis()); @@ -18,4 +16,13 @@ public static void shuffle(List list) { public static int nextInt(int bound) { return random.nextInt(bound); } + + public static ArrayList randIndex(int bound){ + ArrayList res = new ArrayList<>(); + for (int i = 0; i < bound; i++) { + res.set(i, i); + } + Collections.shuffle(res); + return res; + } } diff --git a/src/main/java/Utils/TimeController.java b/src/main/java/Utils/TimeController.java index e9d9f32..ba69386 100644 --- a/src/main/java/Utils/TimeController.java +++ b/src/main/java/Utils/TimeController.java @@ -1,23 +1,19 @@ package Utils; public class TimeController{ - private long startTime; - private final long timeLimit; + private static long startTime; - public TimeController(long timeLimit) { - this.timeLimit = timeLimit; + public static void setTimeLimit(long timeLimit) { + TimeController.timeLimit = timeLimit; } - public TimeController(int minutes) { - this(minutes * 60000L); - startTime = System.currentTimeMillis(); - } + private static long timeLimit; public void reset(){ startTime = System.currentTimeMillis(); } - public boolean timeIsUp(){ + public static boolean timeIsUp(){ return System.currentTimeMillis() - startTime >= timeLimit; } diff --git a/src/test/java/Constraints/Shift10/SoftCostConstraintImplTest.java b/src/test/java/Constraints/Shift10/SoftCostConstraintImplTest.java index cfcbee2..23cb76b 100644 --- a/src/test/java/Constraints/Shift10/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/Shift10/SoftCostConstraintImplTest.java @@ -9,13 +9,10 @@ import Constraints.SoftConstraintManager; import IO.CourdeauInstanceReader; import Operators.OperationContext; -import Utils.RandomController; import org.junit.Assert; import org.junit.Test; import java.io.IOException; -import java.util.Arrays; -import java.util.Random; public class SoftCostConstraintImplTest { @@ -42,6 +39,7 @@ public void fulfilled() throws IOException { context.setMainRoute(mainRoute); for (Route sideRoute : solution.getRoutes()) { sideRoute.shuffle(); + solution.refreshDistance(); context.setSideRoute(sideRoute); for (int i = 0; i < mainRoute.length(); ++i) { context.setOperatePos(0, i); @@ -53,7 +51,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - Assert.assertEquals(costBefore + costChg, solution.getDistance(), 0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore + costChg, solution.refreshDistance(), 0.001); if (i >= mainRoute.length()) break; } } diff --git a/src/test/java/Constraints/Shift20/SoftCostConstraintImplTest.java b/src/test/java/Constraints/Shift20/SoftCostConstraintImplTest.java index 341e87e..3ab00db 100644 --- a/src/test/java/Constraints/Shift20/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/Shift20/SoftCostConstraintImplTest.java @@ -10,13 +10,10 @@ import IO.CourdeauInstanceReader; import Operators.OperationContext; import org.junit.Assert; -import org.junit.Before; import org.junit.Test; import java.io.IOException; -import static org.junit.Assert.*; - public class SoftCostConstraintImplTest { public void singleOperate(Solution solution, OperationContext context) { @@ -42,6 +39,7 @@ public void fulfilled() throws IOException { for (Route sideRoute:solution.getRoutes()) { context.setSideRoute(sideRoute); sideRoute.shuffle(); + solution.refreshDistance(); for (int i = 0; i < mainRoute.length() - 1; i++) { context.setOperatePos(0, i); for (int j = -1; j < sideRoute.length(); j++) { //插入在指定节点之后 @@ -52,7 +50,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - Assert.assertEquals(costBefore + costChg, solution.getDistance(), 0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore + costChg, solution.refreshDistance(), 0.001); if (i >= mainRoute.length() - 1) break; // shift 结点后,路径可能变短 } } diff --git a/src/test/java/Constraints/Substitute/HardTimeConstraintImplTest.java b/src/test/java/Constraints/Substitute/HardTimeConstraintImplTest.java deleted file mode 100644 index d6f9ef3..0000000 --- a/src/test/java/Constraints/Substitute/HardTimeConstraintImplTest.java +++ /dev/null @@ -1,27 +0,0 @@ -package Constraints.Substitute; - -import Common.Node.Customer; -import Common.Node.Depot; -import Common.Node.Node; -import Common.Route; -import org.junit.Before; - -import java.util.ArrayList; - -public class HardTimeConstraintImplTest { - Route route; - - @Before - public void before(){ - ArrayList r = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - r.add(new Customer(i, i,10-i,0,10)); - } - route = new Route(r, - new Depot(11,0,0,0,80,0), - new Depot(11,0,0,0,80,0) - ); - } -} - - diff --git a/src/test/java/Constraints/Swap11/SoftCostConstraintImplTest.java b/src/test/java/Constraints/Swap11/SoftCostConstraintImplTest.java index bce7c3e..0af299a 100644 --- a/src/test/java/Constraints/Swap11/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/Swap11/SoftCostConstraintImplTest.java @@ -29,6 +29,7 @@ public void fulfilled() throws IOException { context.setMainRoute(mainRoute); for (Route sideRoute : solution.getRoutes()) { sideRoute.shuffle(); + solution.refreshDistance(); context.setSideRoute(sideRoute); if (mainRoute==sideRoute){ for (int i = 0; i < mainRoute.length(); i++) { @@ -42,7 +43,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0){ context.mainRoute.swap11(context.sideRoute, context.operatePos[0], context.operatePos[1]); - Assert.assertEquals(costBefore + costChg, solution.getDistance(), 0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore + costChg, solution.refreshDistance(), 0.001); } } } @@ -56,7 +58,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { context.mainRoute.swap11(context.sideRoute, context.operatePos[0], context.operatePos[1]); - Assert.assertEquals(costBefore + costChg, solution.getDistance(), 0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore + costChg, solution.refreshDistance(), 0.001); } } } diff --git a/src/test/java/Constraints/Swap21/SoftCostConstraintImplTest.java b/src/test/java/Constraints/Swap21/SoftCostConstraintImplTest.java index 51c276a..496a1dd 100644 --- a/src/test/java/Constraints/Swap21/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/Swap21/SoftCostConstraintImplTest.java @@ -9,16 +9,12 @@ import Constraints.SoftConstraintManager; import IO.CourdeauInstanceReader; import Operators.OperationContext; -import Operators.RandomRuin; -import Utils.RandomController; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.Arrays; -import static org.junit.Assert.*; - public class SoftCostConstraintImplTest { public void singleOperate(Solution solution, OperationContext context) { context.mainRoute.swap21(context.sideRoute,context.operatePos[0],context.operatePos[1]); @@ -39,6 +35,7 @@ public void fulfilled() throws IOException { for (Route sideRoute:solution.getRoutes()) { context.setSideRoute(sideRoute); sideRoute.shuffle(); + solution.refreshDistance(); if (mainRoute==sideRoute){ for (int i = 0; i < mainRoute.length() - 1; i++) { context.setOperatePos(0,i); @@ -54,7 +51,8 @@ public void fulfilled() throws IOException { // System.out.println(sideRoute); // System.out.println(Arrays.toString(context.operatePos)); // } - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); } } } @@ -68,12 +66,13 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - if (Math.abs(costBefore+costChg-solution.getDistance()) > 0.001){ - System.out.println(mainRoute); - System.out.println(sideRoute); - System.out.println(Arrays.toString(context.operatePos)); - } - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); +// if (Math.abs(costBefore+costChg-solution.getDistance()) > 0.001){ +// System.out.println(mainRoute); +// System.out.println(sideRoute); +// System.out.println(Arrays.toString(context.operatePos)); +// } + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); if (i >= mainRoute.length() - 1)break; } } diff --git a/src/test/java/Constraints/Swap22/SoftCostConstraintImplTest.java b/src/test/java/Constraints/Swap22/SoftCostConstraintImplTest.java index 7ea9719..b3fc773 100644 --- a/src/test/java/Constraints/Swap22/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/Swap22/SoftCostConstraintImplTest.java @@ -14,8 +14,6 @@ import java.io.IOException; -import static org.junit.Assert.*; - public class SoftCostConstraintImplTest { public void singleOperate(Solution solution, OperationContext context) { @@ -37,6 +35,7 @@ public void fulfilled() throws IOException { for (Route sideRoute:solution.getRoutes()) { context.setSideRoute(sideRoute); sideRoute.shuffle(); + solution.refreshDistance(); if (mainRoute==sideRoute){ for (int i = 0; i < mainRoute.length()-1; i++) { context.setOperatePos(0,i); @@ -47,7 +46,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0){ singleOperate(solution, context); - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); } } } @@ -61,7 +61,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); } } } diff --git a/src/test/java/Constraints/TwoOpt/SoftCostConstraintImplTest.java b/src/test/java/Constraints/TwoOpt/SoftCostConstraintImplTest.java index 819e14e..3234d0a 100644 --- a/src/test/java/Constraints/TwoOpt/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/TwoOpt/SoftCostConstraintImplTest.java @@ -14,8 +14,6 @@ import java.io.IOException; -import static org.junit.Assert.*; - public class SoftCostConstraintImplTest { public void singleOperate(Solution solution, OperationContext context) { @@ -34,6 +32,7 @@ public void fulfilled() throws IOException { for (Route mainRoute:solution.getRoutes()) { context.setMainRoute(mainRoute); mainRoute.shuffle(); + solution.refreshDistance(); for (int i = 0; i < mainRoute.length() - 2; i++) { context.setOperatePos(0, i); for (int j = i + 2; j < mainRoute.length(); j++) { @@ -43,7 +42,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); } } } diff --git a/src/test/java/Constraints/TwoOptStar1/SoftCostConstraintImplTest.java b/src/test/java/Constraints/TwoOptStar1/SoftCostConstraintImplTest.java index 861beba..e807dd9 100644 --- a/src/test/java/Constraints/TwoOptStar1/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/TwoOptStar1/SoftCostConstraintImplTest.java @@ -2,6 +2,7 @@ import Algorithm.GreedyGenerator; import Common.Node.Customer; +import Common.Node.Node; import Common.Problem; import Common.Route; import Common.Solution; @@ -10,13 +11,12 @@ import Constraints.SoftConstraintManager; import IO.CourdeauInstanceReader; import Operators.OperationContext; -import Utils.RandomController; import org.junit.Assert; import org.junit.Test; import java.io.IOException; -import java.util.Arrays; import java.util.HashMap; +import java.util.List; public class SoftCostConstraintImplTest { public void singleOperate(Solution solution, OperationContext context) { @@ -44,6 +44,7 @@ public void fulfilled() throws IOException { for (Route sideRoute : solution.getRoutes()) { if (mainRoute == sideRoute || mainRoute.start != sideRoute.start) continue; sideRoute.shuffle(); + solution.refreshDistance(); context.setSideRoute(sideRoute); for (int i = 0; i < mainRoute.length() - 1; i++) { context.setOperatePos(0, i); @@ -63,8 +64,9 @@ public void fulfilled() throws IOException { // System.out.println(sideRoute); // System.out.println(Arrays.toString(context.operatePos)); // } - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); - Assert.assertEquals(status,hardConstraintManager.fulfilled(context)); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); +// Assert.assertEquals(status,hardConstraintManager.fulfilled(context)); if (i >= mainRoute.length() - 1 || j >= sideRoute.length() - 1) break; refreshOperateVal(context); } diff --git a/src/test/java/Constraints/TwoOptStar2/SoftCostConstraintImplTest.java b/src/test/java/Constraints/TwoOptStar2/SoftCostConstraintImplTest.java index 98126f4..967bb9f 100644 --- a/src/test/java/Constraints/TwoOptStar2/SoftCostConstraintImplTest.java +++ b/src/test/java/Constraints/TwoOptStar2/SoftCostConstraintImplTest.java @@ -2,6 +2,7 @@ import Algorithm.GreedyGenerator; import Common.Node.Customer; +import Common.Node.Node; import Common.Problem; import Common.Route; import Common.Solution; @@ -14,9 +15,9 @@ import org.junit.Test; import java.io.IOException; +import java.util.Collections; import java.util.HashMap; - -import static org.junit.Assert.*; +import java.util.List; public class SoftCostConstraintImplTest { @@ -56,6 +57,7 @@ public void fulfilled() throws IOException { for (Route sideRoute : solution.getRoutes()) { if (mainRoute == sideRoute || mainRoute.start != sideRoute.start) continue; sideRoute.shuffle(); + solution.refreshDistance(); context.setSideRoute(sideRoute); for (int i = 0; i < mainRoute.length() - 1; i++) { context.setOperatePos(0, i); @@ -70,7 +72,8 @@ public void fulfilled() throws IOException { double costBefore = solution.getDistance(); if (status == HardConstraint.ConsStatus.FULFILLED && costChg < 0) { singleOperate(solution, context); - Assert.assertEquals(costBefore+costChg,solution.getDistance(),0.001); + solution.updateDistance(costChg); + Assert.assertEquals(costBefore+costChg,solution.refreshDistance(),0.001); if (i >= mainRoute.length() - 1 || j >= sideRoute.length() - 1) break; refreshOperateVal(context); } diff --git a/src/test/java/EntryTest.java b/src/test/java/EntryTest.java index e2714d1..ab04e8b 100644 --- a/src/test/java/EntryTest.java +++ b/src/test/java/EntryTest.java @@ -10,7 +10,6 @@ import org.apache.log4j.Logger; import org.junit.Assert; import org.junit.Test; -import org.quartz.SchedulerException; import java.io.IOException; import java.util.ArrayList; @@ -94,6 +93,9 @@ public void randomOpt() throws IOException { bestSol = new Solution(solution); logger.info(solution.getDistance()); } + double distance = solution.getDistance(); + if (Math.abs(solution.refreshDistance()-distance)>0.001) System.out.println(operationSelector.getClass().getName()); + Assert.assertEquals(solution.refreshDistance(),distance,0.001); } Assert.assertTrue(validChecker(solution)); System.out.println(bestSol.getDistance());