1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

clean, test and document core.algorithm.termination.IterationWithoutImprovementTermination

This commit is contained in:
oblonski 2014-08-12 12:45:33 +02:00
parent b3dd790be2
commit dce8019b80
2 changed files with 82 additions and 10 deletions

View file

@ -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).
*
* <p>Termination will be activated by:<br>
*
* <code>algorithm.setPrematureAlgorithmTermination(this);</code><br>
*
* @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);
}

View file

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