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:
parent
4b88ac2028
commit
6b94da291f
2 changed files with 28 additions and 1 deletions
|
|
@ -57,8 +57,12 @@ public class IterationWithoutImprovementTermination implements PrematureAlgorith
|
||||||
* @param noIterationsWithoutImprovement previous iterations without any improvement
|
* @param noIterationsWithoutImprovement previous iterations without any improvement
|
||||||
*/
|
*/
|
||||||
public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement) {
|
public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement) {
|
||||||
|
this(noIterationsWithoutImprovement, 0.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IterationWithoutImprovementTermination(int noIterationsWithoutImprovement, double terminationByCostPercentage) {
|
||||||
this.noIterationWithoutImprovement = noIterationsWithoutImprovement;
|
this.noIterationWithoutImprovement = noIterationsWithoutImprovement;
|
||||||
this.terminationByCostPercentage = 0.1; // TODO: Fetch it from configuration
|
this.terminationByCostPercentage = terminationByCostPercentage;
|
||||||
costs = new ArrayList<>();
|
costs = new ArrayList<>();
|
||||||
unassignedCount = new ArrayList<>();
|
unassignedCount = new ArrayList<>();
|
||||||
log.debug("initialise " + this);
|
log.debug("initialise " + this);
|
||||||
|
|
|
||||||
|
|
@ -20,8 +20,11 @@ package com.graphhopper.jsprit.core.algorithm.termination;
|
||||||
|
|
||||||
|
|
||||||
import com.graphhopper.jsprit.core.algorithm.SearchStrategy;
|
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 junit.framework.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
@ -76,4 +79,24 @@ public class IterationsWithoutImprovementTest {
|
||||||
}
|
}
|
||||||
Assert.assertEquals(150, terminatedAfter);
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue