mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
internal improvement of insertionCalc
This commit is contained in:
parent
59319ff355
commit
211d56d928
14 changed files with 120 additions and 70 deletions
|
|
@ -3,6 +3,8 @@ package algorithms;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import basics.route.End;
|
||||
import basics.route.Start;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.VehicleRoute;
|
||||
|
||||
|
|
@ -10,11 +12,11 @@ class BackwardInTimeListeners {
|
|||
|
||||
interface BackwardInTimeListener{
|
||||
|
||||
public void start(VehicleRoute route);
|
||||
public void start(VehicleRoute route, End end, double latestArrivalTime);
|
||||
|
||||
public void prevActivity(TourActivity act, double latestDepartureTime, double latestOperationStartTime);
|
||||
|
||||
public void finnish();
|
||||
public void end(Start start, double latestDepartureTime);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -24,8 +26,8 @@ class BackwardInTimeListeners {
|
|||
listeners.add(l);
|
||||
}
|
||||
|
||||
public void start(VehicleRoute route){
|
||||
for(BackwardInTimeListener l : listeners){ l.start(route); }
|
||||
public void start(VehicleRoute route, End end, double latestArrivalTime){
|
||||
for(BackwardInTimeListener l : listeners){ l.start(route, end, latestArrivalTime); }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -37,14 +39,14 @@ class BackwardInTimeListeners {
|
|||
*
|
||||
* @param act
|
||||
* @param latestDepartureTime
|
||||
* @param latestOperationStartTime
|
||||
* @param latestArrivalTime
|
||||
*/
|
||||
public void prevActivity(TourActivity act, double latestDepartureTime, double latestOperationStartTime){
|
||||
for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestOperationStartTime); }
|
||||
public void prevActivity(TourActivity act, double latestDepartureTime, double latestArrivalTime){
|
||||
for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestArrivalTime); }
|
||||
}
|
||||
|
||||
public void finnish(){
|
||||
for(BackwardInTimeListener l : listeners){ l.finnish(); }
|
||||
public void end(Start start, double latestDepartureTime){
|
||||
for(BackwardInTimeListener l : listeners){ l.end(start, latestDepartureTime); }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -241,6 +241,14 @@ final class CalculatesServiceInsertionOnRouteLevel implements JobInsertionCalcul
|
|||
*
|
||||
*/
|
||||
|
||||
if(memorySize==0){
|
||||
InsertionData insertion = bestInsertionsQueue.poll();
|
||||
if(insertion != null){
|
||||
best_insertion_index = insertion.getDeliveryInsertionIndex();
|
||||
best_insertion_costs = insertion.getInsertionCost();
|
||||
}
|
||||
}
|
||||
|
||||
for(int i=0;i<memorySize;i++){
|
||||
InsertionData data = bestInsertionsQueue.poll();
|
||||
if(data == null){
|
||||
|
|
|
|||
|
|
@ -3,6 +3,8 @@ package algorithms;
|
|||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import basics.route.End;
|
||||
import basics.route.Start;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.VehicleRoute;
|
||||
|
||||
|
|
@ -10,11 +12,11 @@ class ForwardInTimeListeners {
|
|||
|
||||
interface ForwardInTimeListener{
|
||||
|
||||
public void start(VehicleRoute route);
|
||||
public void start(VehicleRoute route, Start start, double departureTime);
|
||||
|
||||
public void nextActivity(TourActivity act, double arrTime,double endTime);
|
||||
|
||||
public void finnish();
|
||||
public void end(End end, double arrivalTime);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -24,16 +26,16 @@ class ForwardInTimeListeners {
|
|||
listeners.add(l);
|
||||
}
|
||||
|
||||
public void start(VehicleRoute route){
|
||||
for(ForwardInTimeListener l : listeners){ l.start(route); }
|
||||
public void start(VehicleRoute route, Start start, double departureTime){
|
||||
for(ForwardInTimeListener l : listeners){ l.start(route, start, departureTime); }
|
||||
}
|
||||
|
||||
public void nextActivity(TourActivity act, double arrTime, double endTime){
|
||||
for(ForwardInTimeListener l : listeners){ l.nextActivity(act,arrTime,endTime); }
|
||||
}
|
||||
|
||||
public void finnish(){
|
||||
for(ForwardInTimeListener l : listeners){ l.finnish(); }
|
||||
public void end(End end, double arrivalTime){
|
||||
for(ForwardInTimeListener l : listeners){ l.end(end, arrivalTime); }
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -46,22 +46,29 @@ class IterateRouteBackwardInTime implements VehicleRouteUpdater{
|
|||
*
|
||||
*/
|
||||
public void iterate(VehicleRoute vehicleRoute) {
|
||||
listeners.start(vehicleRoute);
|
||||
listeners.start(vehicleRoute, vehicleRoute.getEnd(), vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime());
|
||||
|
||||
Iterator<TourActivity> reverseActIter = vehicleRoute.getTourActivities().reverseActivityIterator();
|
||||
TourActivity prevAct;
|
||||
prevAct = vehicleRoute.getEnd();
|
||||
double startAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime();
|
||||
listeners.prevActivity(prevAct, startAtPrevAct, startAtPrevAct);
|
||||
double latestArrivalTimeAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime();
|
||||
|
||||
while(reverseActIter.hasNext()){
|
||||
TourActivity currAct = reverseActIter.next();
|
||||
double latestDepTimeAtCurrAct = startAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), startAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle());
|
||||
double potentialLatestOperationStartTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime();
|
||||
double latestOperationStartTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestOperationStartTimeAtCurrAct);
|
||||
listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestOperationStartTime);
|
||||
double latestDepTimeAtCurrAct = latestArrivalTimeAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), latestArrivalTimeAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle());
|
||||
double potentialLatestArrivalTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime();
|
||||
double latestArrivalTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
|
||||
|
||||
listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestArrivalTime);
|
||||
|
||||
prevAct = currAct;
|
||||
startAtPrevAct = latestOperationStartTime;
|
||||
latestArrivalTimeAtPrevAct = latestArrivalTime;
|
||||
}
|
||||
listeners.finnish();
|
||||
|
||||
TourActivity currAct = vehicleRoute.getStart();
|
||||
double latestDepTimeAtCurrAct = latestArrivalTimeAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), latestArrivalTimeAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle());
|
||||
|
||||
listeners.end(vehicleRoute.getStart(), latestDepTimeAtCurrAct);
|
||||
}
|
||||
|
||||
public void addListener(BackwardInTimeListener l){ listeners.addListener(l); }
|
||||
|
|
|
|||
|
|
@ -48,15 +48,13 @@ class IterateRouteForwardInTime implements VehicleRouteUpdater{
|
|||
*
|
||||
*/
|
||||
public void iterate(VehicleRoute vehicleRoute) {
|
||||
listeners.start(vehicleRoute);
|
||||
listeners.start(vehicleRoute, vehicleRoute.getStart(), vehicleRoute.getStart().getEndTime());
|
||||
|
||||
Vehicle vehicle = vehicleRoute.getVehicle();
|
||||
Driver driver = vehicleRoute.getDriver();
|
||||
TourActivity prevAct = vehicleRoute.getStart();
|
||||
double startAtPrevAct = prevAct.getEndTime();
|
||||
|
||||
listeners.nextActivity(prevAct,startAtPrevAct,startAtPrevAct);
|
||||
|
||||
for(TourActivity currentAct : vehicleRoute.getTourActivities().getActivities()){
|
||||
double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle);
|
||||
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
|
||||
|
|
@ -73,9 +71,7 @@ class IterateRouteForwardInTime implements VehicleRouteUpdater{
|
|||
double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle);
|
||||
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
|
||||
|
||||
listeners.nextActivity(currentAct,arrivalTimeAtCurrAct,arrivalTimeAtCurrAct);
|
||||
listeners.finnish();
|
||||
|
||||
listeners.end(vehicleRoute.getEnd(), arrivalTimeAtCurrAct);
|
||||
}
|
||||
|
||||
public void addListener(ForwardInTimeListener l){
|
||||
|
|
|
|||
|
|
@ -2,25 +2,30 @@ package algorithms;
|
|||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import algorithms.ForwardInTimeListeners.ForwardInTimeListener;
|
||||
import basics.route.End;
|
||||
import basics.route.Start;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.VehicleRoute;
|
||||
import algorithms.ForwardInTimeListeners.ForwardInTimeListener;
|
||||
|
||||
class UpdateActivityTimes implements ForwardInTimeListener{
|
||||
|
||||
private Logger log = Logger.getLogger(UpdateActivityTimes.class);
|
||||
|
||||
@Override
|
||||
public void start(VehicleRoute route) {}
|
||||
public void start(VehicleRoute route, Start start, double departureTime) {
|
||||
start.setEndTime(departureTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void nextActivity(TourActivity act, double arrTime, double endTime) {
|
||||
// log.debug(act.toString() + " arrTime="+ arrTime + " endTime=" + endTime);
|
||||
act.setArrTime(arrTime);
|
||||
act.setEndTime(endTime);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finnish() {}
|
||||
public void end(End end, double arrivalTime) {
|
||||
end.setArrTime(arrivalTime);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,38 +33,41 @@ class UpdateCostsAtAllLevels implements ForwardInTimeListener{
|
|||
}
|
||||
|
||||
@Override
|
||||
public void start(VehicleRoute route) {
|
||||
public void start(VehicleRoute route, Start start, double departureTime) {
|
||||
vehicleRoute = route;
|
||||
vehicleRoute.getVehicleRouteCostCalculator().reset();
|
||||
prevAct = start;
|
||||
startTimeAtPrevAct = departureTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void nextActivity(TourActivity act, double arrTime, double endTime) {
|
||||
if(prevAct == null){
|
||||
prevAct = act;
|
||||
startTimeAtPrevAct = endTime;
|
||||
}
|
||||
else{
|
||||
double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost);
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost);
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost);
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost);
|
||||
|
||||
totalOperationCost += transportCost;
|
||||
totalOperationCost += actCost;
|
||||
totalOperationCost += transportCost;
|
||||
totalOperationCost += actCost;
|
||||
|
||||
if(!(act instanceof End)){
|
||||
states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost));
|
||||
}
|
||||
states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost));
|
||||
|
||||
prevAct = act;
|
||||
startTimeAtPrevAct = endTime;
|
||||
}
|
||||
prevAct = act;
|
||||
startTimeAtPrevAct = endTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finnish() {
|
||||
public void end(End end, double arrivalTime) {
|
||||
double transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), end.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
double actCost = activityCost.getActivityCost(end, arrivalTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
|
||||
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addTransportCost(transportCost);
|
||||
vehicleRoute.getVehicleRouteCostCalculator().addActivityCost(actCost);
|
||||
|
||||
totalOperationCost += transportCost;
|
||||
totalOperationCost += actCost;
|
||||
|
||||
states.putRouteState(vehicleRoute, StateTypes.COSTS, new StateImpl(totalOperationCost));
|
||||
|
||||
//this is rather strange and likely to change
|
||||
|
|
|
|||
|
|
@ -17,15 +17,14 @@ class UpdateEarliestStartTimeWindowAtActLocations implements ForwardInTimeListen
|
|||
}
|
||||
|
||||
@Override
|
||||
public void start(VehicleRoute route) {}
|
||||
public void start(VehicleRoute route, Start start, double departureTime) {}
|
||||
|
||||
@Override
|
||||
public void nextActivity(TourActivity act, double arrTime, double endTime) {
|
||||
if(act instanceof Start || act instanceof End) return;
|
||||
states.putActivityState(act, StateTypes.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(arrTime, act.getTheoreticalEarliestOperationStartTime())));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finnish() {}
|
||||
public void end(End end, double arrivalTime) {}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,16 +17,16 @@ class UpdateLatestOperationStartTimeAtActLocations implements BackwardInTimeList
|
|||
}
|
||||
|
||||
@Override
|
||||
public void start(VehicleRoute route) {}
|
||||
public void start(VehicleRoute route, End end, double latestArrivalTime) {}
|
||||
|
||||
@Override
|
||||
public void prevActivity(TourActivity act,double latestDepartureTime, double latestOperationStartTime) {
|
||||
// if(latestOperationStartTime < act.getArrTime()) throw new IllegalStateException(act.toString() + "; latestStart="+latestOperationStartTime+";actArrTime="+act.getArrTime());
|
||||
if(act instanceof Start || act instanceof End) return;
|
||||
states.putActivityState(act, StateTypes.LATEST_OPERATION_START_TIME, new StateImpl(latestOperationStartTime));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finnish() {}
|
||||
public void end(Start start, double latestDepartureTime) {}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -27,17 +27,16 @@ class UpdateLoadAtAllLevels implements ForwardInTimeListener{
|
|||
}
|
||||
|
||||
@Override
|
||||
public void start(VehicleRoute route) { vehicleRoute = route; }
|
||||
public void start(VehicleRoute route, Start start, double departureTime) { vehicleRoute = route; }
|
||||
|
||||
@Override
|
||||
public void nextActivity(TourActivity act, double arrTime, double endTime) {
|
||||
if(act instanceof Start || act instanceof End){ return; }
|
||||
load += (double)act.getCapacityDemand();
|
||||
states.putActivityState(act, StateTypes.LOAD, new StateImpl(load));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void finnish() {
|
||||
public void end(End end, double arrivalTime) {
|
||||
states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load));
|
||||
load=0;
|
||||
vehicleRoute = null;
|
||||
|
|
|
|||
27
jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java
Normal file
27
jsprit-core/src/test/java/algorithms/BuildFastCVRPTest.java
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
package algorithms;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import basics.VehicleRoutingAlgorithm;
|
||||
import basics.VehicleRoutingProblem;
|
||||
|
||||
public class BuildFastCVRPTest {
|
||||
|
||||
@Test
|
||||
public void buildFastCVRPAlgoTest(){
|
||||
|
||||
VehicleRoutingProblem vrp = null;
|
||||
|
||||
VehicleRoutingAlgorithm vra = createVRA(vrp);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public VehicleRoutingAlgorithm createVRA(VehicleRoutingProblem vrp){
|
||||
VehicleFleetManager fleetManager = new InfiniteVehicles(vrp.getVehicles());
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -189,7 +189,7 @@ public class TestIterateRouteForwardInTime {
|
|||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(40.0, states.getRouteStates(vehicleRoute).getState(StateTypes.COSTS).toDouble(), 0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getArrTime(),0.05);
|
||||
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -158,7 +158,7 @@ public class TestTourStateUpdaterWithService {
|
|||
updateStates.update(vehicleRoute);
|
||||
|
||||
assertEquals(40.0, states.getRouteState(vehicleRoute, StateTypes.COSTS).toDouble(), 0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getArrTime(),0.05);
|
||||
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -26,6 +26,7 @@ import java.util.Collection;
|
|||
import readers.SolomonReader;
|
||||
import algorithms.GreedySchrimpfFactory;
|
||||
import algorithms.SchrimpfFactory;
|
||||
import algorithms.VehicleRoutingAlgorithms;
|
||||
import algorithms.selectors.SelectBest;
|
||||
import analysis.AlgorithmSearchProgressChartListener;
|
||||
import analysis.SolutionPlotter;
|
||||
|
|
@ -75,7 +76,8 @@ public class SolomonExample {
|
|||
*
|
||||
* The algorithm can be defined and configured in an xml-file.
|
||||
*/
|
||||
VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||
// VehicleRoutingAlgorithm vra = new SchrimpfFactory().createAlgorithm(vrp);
|
||||
VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfig_solomon.xml");
|
||||
vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
|
||||
/*
|
||||
* Solve the problem.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue