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

Replacing the termination logic to reduce run-times with marginal effect on quality.

This commit is contained in:
safraeli 2019-05-21 10:26:27 +03:00
parent 4b88ac2028
commit 6b94da291f
2 changed files with 28 additions and 1 deletions

View file

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

View file

@ -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<Job>());
int terminatedAfter = 0;
for (int i = 0; i < 200; i++) {
boolean terminate = termination.isPrematureBreak(discoveredSolution);
if (terminate) {
terminatedAfter = i;
break;
}
}
Assert.assertEquals(100, terminatedAfter);
}
}