diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java index e75b2bcf..67bb9475 100644 --- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java +++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java @@ -57,8 +57,12 @@ public class IterationWithoutImprovementTermination implements PrematureAlgorith * @param noIterationsWithoutImprovement previous iterations without any improvement */ public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement) { + this(noIterationsWithoutImprovement, 0.0); + } + + public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement, double terminationByCostPercentage) { this.noIterationWithoutImprovement = noIterationsWithoutImprovement; - this.terminationByCostPercentage = 0.1; // TODO: Fetch it from configuration + this.terminationByCostPercentage = terminationByCostPercentage; costs = new ArrayList<>(); unassignedCount = new ArrayList<>(); log.debug("initialise " + this); diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java index 8cdd708a..7b59817a 100644 --- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java +++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java @@ -20,8 +20,11 @@ package com.graphhopper.jsprit.core.algorithm.termination; import com.graphhopper.jsprit.core.algorithm.SearchStrategy; +import com.graphhopper.jsprit.core.problem.job.Job; +import com.graphhopper.jsprit.core.problem.solution.VehicleRoutingProblemSolution; import junit.framework.Assert; import org.junit.Test; +import java.util.ArrayList; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -76,4 +79,24 @@ public class IterationsWithoutImprovementTest { } Assert.assertEquals(150, terminatedAfter); } + + @Test + public void itShouldTerminateAfter100ByPercentage() { + IterationWithoutImprovementTermination termination = new IterationWithoutImprovementTermination(100, 0.1); + SearchStrategy.DiscoveredSolution discoveredSolution = mock(SearchStrategy.DiscoveredSolution.class); + VehicleRoutingProblemSolution solution = mock(VehicleRoutingProblemSolution.class); + when(discoveredSolution.getSolution()).thenReturn(solution); + when(solution.getCost()).thenReturn(100.0); + when(solution.getUnassignedJobs()).thenReturn(new ArrayList()); + + int terminatedAfter = 0; + for (int i = 0; i < 200; i++) { + boolean terminate = termination.isPrematureBreak(discoveredSolution); + if (terminate) { + terminatedAfter = i; + break; + } + } + Assert.assertEquals(100, terminatedAfter); + } }