diff --git a/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java index 2897ca31..3f265f96 100644 --- a/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java +++ b/jsprit-core/src/main/java/jsprit/core/algorithm/termination/IterationWithoutImprovementTermination.java @@ -20,33 +20,44 @@ import jsprit.core.algorithm.SearchStrategy.DiscoveredSolution; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; - +/** + * Terminates algorithm prematurely based on iterations without any improvement (i.e. new solution acceptance). + * + *

Termination will be activated by:
+ * + * algorithm.setPrematureAlgorithmTermination(this);
+ * + * @author stefan schroeder + * + */ public class IterationWithoutImprovementTermination implements PrematureAlgorithmTermination{ private static Logger log = LogManager.getLogger(IterationWithoutImprovementTermination.class); - private int nuOfIterationWithoutImprovement; + private int noIterationWithoutImprovement; private int iterationsWithoutImprovement = 0; - - public IterationWithoutImprovementTermination(int nuOfIterationsWithoutImprovement){ - this.nuOfIterationWithoutImprovement=nuOfIterationsWithoutImprovement; + + /** + * Constructs termination. + * + * @param noIterationsWithoutImprovement previous iterations without any improvement + */ + public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement){ + this.noIterationWithoutImprovement =noIterationsWithoutImprovement; log.info("initialise " + this); } @Override public String toString() { - return "[name=IterationWithoutImprovementBreaker][iterationsWithoutImprovement="+nuOfIterationWithoutImprovement+"]"; + return "[name=IterationWithoutImprovementBreaker][iterationsWithoutImprovement="+ noIterationWithoutImprovement +"]"; } @Override public boolean isPrematureBreak(DiscoveredSolution discoveredSolution) { if(discoveredSolution.isAccepted()) iterationsWithoutImprovement = 0; else iterationsWithoutImprovement++; - if(iterationsWithoutImprovement > nuOfIterationWithoutImprovement){ - return true; - } - return false; + return (iterationsWithoutImprovement > noIterationWithoutImprovement); } diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java new file mode 100644 index 00000000..3c24051c --- /dev/null +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/termination/IterationsWithoutImprovementTest.java @@ -0,0 +1,61 @@ +package jsprit.core.algorithm.termination; + + +import jsprit.core.algorithm.SearchStrategy; +import junit.framework.Assert; +import org.junit.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class IterationsWithoutImprovementTest { + + @Test + public void itShouldTerminateAfter100(){ + IterationWithoutImprovementTermination termination = new IterationWithoutImprovementTermination(100); + SearchStrategy.DiscoveredSolution discoveredSolution = mock(SearchStrategy.DiscoveredSolution.class); + when(discoveredSolution.isAccepted()).thenReturn(false); + int terminatedAfter = 0; + for(int i=0;i<200;i++){ + boolean terminate = termination.isPrematureBreak(discoveredSolution); + if(terminate) { + terminatedAfter = i; + break; + } + } + Assert.assertEquals(100,terminatedAfter); + } + + @Test + public void itShouldTerminateAfter1(){ + IterationWithoutImprovementTermination termination = new IterationWithoutImprovementTermination(1); + SearchStrategy.DiscoveredSolution discoveredSolution = mock(SearchStrategy.DiscoveredSolution.class); + when(discoveredSolution.isAccepted()).thenReturn(false); + int terminatedAfter = 0; + for(int i=0;i<200;i++){ + boolean terminate = termination.isPrematureBreak(discoveredSolution); + if(terminate) { + terminatedAfter = i; + break; + } + } + Assert.assertEquals(1,terminatedAfter); + } + + @Test + public void itShouldTerminateAfter150(){ + IterationWithoutImprovementTermination termination = new IterationWithoutImprovementTermination(100); + SearchStrategy.DiscoveredSolution discoveredSolution = mock(SearchStrategy.DiscoveredSolution.class); + int terminatedAfter = 0; + for(int i=0;i<200;i++){ + when(discoveredSolution.isAccepted()).thenReturn(false); + if(i == 49) when(discoveredSolution.isAccepted()).thenReturn(true); + boolean terminate = termination.isPrematureBreak(discoveredSolution); + if(terminate) { + terminatedAfter = i; + break; + } + } + Assert.assertEquals(150,terminatedAfter); + } +}