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);
+ }
+}