1
0
Fork 0
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:
Stefan Schroeder 2013-08-22 11:01:03 +02:00
parent 59319ff355
commit 211d56d928
14 changed files with 120 additions and 70 deletions

View file

@ -3,6 +3,8 @@ package algorithms;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import basics.route.End;
import basics.route.Start;
import basics.route.TourActivity; import basics.route.TourActivity;
import basics.route.VehicleRoute; import basics.route.VehicleRoute;
@ -10,11 +12,11 @@ class BackwardInTimeListeners {
interface BackwardInTimeListener{ 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 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); listeners.add(l);
} }
public void start(VehicleRoute route){ public void start(VehicleRoute route, End end, double latestArrivalTime){
for(BackwardInTimeListener l : listeners){ l.start(route); } for(BackwardInTimeListener l : listeners){ l.start(route, end, latestArrivalTime); }
} }
/** /**
@ -37,14 +39,14 @@ class BackwardInTimeListeners {
* *
* @param act * @param act
* @param latestDepartureTime * @param latestDepartureTime
* @param latestOperationStartTime * @param latestArrivalTime
*/ */
public void prevActivity(TourActivity act, double latestDepartureTime, double latestOperationStartTime){ public void prevActivity(TourActivity act, double latestDepartureTime, double latestArrivalTime){
for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestOperationStartTime); } for(BackwardInTimeListener l : listeners){ l.prevActivity(act,latestDepartureTime,latestArrivalTime); }
} }
public void finnish(){ public void end(Start start, double latestDepartureTime){
for(BackwardInTimeListener l : listeners){ l.finnish(); } for(BackwardInTimeListener l : listeners){ l.end(start, latestDepartureTime); }
} }
} }

View file

@ -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++){ for(int i=0;i<memorySize;i++){
InsertionData data = bestInsertionsQueue.poll(); InsertionData data = bestInsertionsQueue.poll();
if(data == null){ if(data == null){

View file

@ -3,6 +3,8 @@ package algorithms;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import basics.route.End;
import basics.route.Start;
import basics.route.TourActivity; import basics.route.TourActivity;
import basics.route.VehicleRoute; import basics.route.VehicleRoute;
@ -10,11 +12,11 @@ class ForwardInTimeListeners {
interface ForwardInTimeListener{ 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 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); listeners.add(l);
} }
public void start(VehicleRoute route){ public void start(VehicleRoute route, Start start, double departureTime){
for(ForwardInTimeListener l : listeners){ l.start(route); } for(ForwardInTimeListener l : listeners){ l.start(route, start, departureTime); }
} }
public void nextActivity(TourActivity act, double arrTime, double endTime){ public void nextActivity(TourActivity act, double arrTime, double endTime){
for(ForwardInTimeListener l : listeners){ l.nextActivity(act,arrTime,endTime); } for(ForwardInTimeListener l : listeners){ l.nextActivity(act,arrTime,endTime); }
} }
public void finnish(){ public void end(End end, double arrivalTime){
for(ForwardInTimeListener l : listeners){ l.finnish(); } for(ForwardInTimeListener l : listeners){ l.end(end, arrivalTime); }
} }
} }

View file

@ -46,22 +46,29 @@ class IterateRouteBackwardInTime implements VehicleRouteUpdater{
* *
*/ */
public void iterate(VehicleRoute vehicleRoute) { public void iterate(VehicleRoute vehicleRoute) {
listeners.start(vehicleRoute); listeners.start(vehicleRoute, vehicleRoute.getEnd(), vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime());
Iterator<TourActivity> reverseActIter = vehicleRoute.getTourActivities().reverseActivityIterator(); Iterator<TourActivity> reverseActIter = vehicleRoute.getTourActivities().reverseActivityIterator();
TourActivity prevAct; TourActivity prevAct;
prevAct = vehicleRoute.getEnd(); prevAct = vehicleRoute.getEnd();
double startAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime(); double latestArrivalTimeAtPrevAct = prevAct.getTheoreticalLatestOperationStartTime();
listeners.prevActivity(prevAct, startAtPrevAct, startAtPrevAct);
while(reverseActIter.hasNext()){ while(reverseActIter.hasNext()){
TourActivity currAct = reverseActIter.next(); TourActivity currAct = reverseActIter.next();
double latestDepTimeAtCurrAct = startAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), startAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle()); double latestDepTimeAtCurrAct = latestArrivalTimeAtPrevAct - transportTime.getBackwardTransportTime(currAct.getLocationId(), prevAct.getLocationId(), latestArrivalTimeAtPrevAct, vehicleRoute.getDriver(),vehicleRoute.getVehicle());
double potentialLatestOperationStartTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime(); double potentialLatestArrivalTimeAtCurrAct = latestDepTimeAtCurrAct - currAct.getOperationTime();
double latestOperationStartTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestOperationStartTimeAtCurrAct); double latestArrivalTime = Math.min(currAct.getTheoreticalLatestOperationStartTime(), potentialLatestArrivalTimeAtCurrAct);
listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestOperationStartTime);
listeners.prevActivity(currAct, latestDepTimeAtCurrAct, latestArrivalTime);
prevAct = currAct; 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); } public void addListener(BackwardInTimeListener l){ listeners.addListener(l); }

View file

@ -48,15 +48,13 @@ class IterateRouteForwardInTime implements VehicleRouteUpdater{
* *
*/ */
public void iterate(VehicleRoute vehicleRoute) { public void iterate(VehicleRoute vehicleRoute) {
listeners.start(vehicleRoute); listeners.start(vehicleRoute, vehicleRoute.getStart(), vehicleRoute.getStart().getEndTime());
Vehicle vehicle = vehicleRoute.getVehicle(); Vehicle vehicle = vehicleRoute.getVehicle();
Driver driver = vehicleRoute.getDriver(); Driver driver = vehicleRoute.getDriver();
TourActivity prevAct = vehicleRoute.getStart(); TourActivity prevAct = vehicleRoute.getStart();
double startAtPrevAct = prevAct.getEndTime(); double startAtPrevAct = prevAct.getEndTime();
listeners.nextActivity(prevAct,startAtPrevAct,startAtPrevAct);
for(TourActivity currentAct : vehicleRoute.getTourActivities().getActivities()){ for(TourActivity currentAct : vehicleRoute.getTourActivities().getActivities()){
double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle); double transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle);
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime; 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 transportTime = this.transportTime.getTransportTime(prevAct.getLocationId(), currentAct.getLocationId(), startAtPrevAct, driver, vehicle);
double arrivalTimeAtCurrAct = startAtPrevAct + transportTime; double arrivalTimeAtCurrAct = startAtPrevAct + transportTime;
listeners.nextActivity(currentAct,arrivalTimeAtCurrAct,arrivalTimeAtCurrAct); listeners.end(vehicleRoute.getEnd(), arrivalTimeAtCurrAct);
listeners.finnish();
} }
public void addListener(ForwardInTimeListener l){ public void addListener(ForwardInTimeListener l){

View file

@ -2,25 +2,30 @@ package algorithms;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import algorithms.ForwardInTimeListeners.ForwardInTimeListener;
import basics.route.End;
import basics.route.Start;
import basics.route.TourActivity; import basics.route.TourActivity;
import basics.route.VehicleRoute; import basics.route.VehicleRoute;
import algorithms.ForwardInTimeListeners.ForwardInTimeListener;
class UpdateActivityTimes implements ForwardInTimeListener{ class UpdateActivityTimes implements ForwardInTimeListener{
private Logger log = Logger.getLogger(UpdateActivityTimes.class); private Logger log = Logger.getLogger(UpdateActivityTimes.class);
@Override @Override
public void start(VehicleRoute route) {} public void start(VehicleRoute route, Start start, double departureTime) {
start.setEndTime(departureTime);
}
@Override @Override
public void nextActivity(TourActivity act, double arrTime, double endTime) { public void nextActivity(TourActivity act, double arrTime, double endTime) {
// log.debug(act.toString() + " arrTime="+ arrTime + " endTime=" + endTime);
act.setArrTime(arrTime); act.setArrTime(arrTime);
act.setEndTime(endTime); act.setEndTime(endTime);
} }
@Override @Override
public void finnish() {} public void end(End end, double arrivalTime) {
end.setArrTime(arrivalTime);
}
} }

View file

@ -33,18 +33,15 @@ class UpdateCostsAtAllLevels implements ForwardInTimeListener{
} }
@Override @Override
public void start(VehicleRoute route) { public void start(VehicleRoute route, Start start, double departureTime) {
vehicleRoute = route; vehicleRoute = route;
vehicleRoute.getVehicleRouteCostCalculator().reset(); vehicleRoute.getVehicleRouteCostCalculator().reset();
prevAct = start;
startTimeAtPrevAct = departureTime;
} }
@Override @Override
public void nextActivity(TourActivity act, double arrTime, double endTime) { 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 transportCost = this.transportCost.getTransportCost(prevAct.getLocationId(), act.getLocationId(), startTimeAtPrevAct, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle()); double actCost = activityCost.getActivityCost(act, arrTime, vehicleRoute.getDriver(), vehicleRoute.getVehicle());
@ -54,17 +51,23 @@ class UpdateCostsAtAllLevels implements ForwardInTimeListener{
totalOperationCost += transportCost; totalOperationCost += transportCost;
totalOperationCost += actCost; totalOperationCost += actCost;
if(!(act instanceof End)){
states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost)); states.putActivityState(act, StateTypes.COSTS, new StateImpl(totalOperationCost));
}
prevAct = act; prevAct = act;
startTimeAtPrevAct = endTime; startTimeAtPrevAct = endTime;
} }
}
@Override @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)); states.putRouteState(vehicleRoute, StateTypes.COSTS, new StateImpl(totalOperationCost));
//this is rather strange and likely to change //this is rather strange and likely to change

View file

@ -17,15 +17,14 @@ class UpdateEarliestStartTimeWindowAtActLocations implements ForwardInTimeListen
} }
@Override @Override
public void start(VehicleRoute route) {} public void start(VehicleRoute route, Start start, double departureTime) {}
@Override @Override
public void nextActivity(TourActivity act, double arrTime, double endTime) { 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()))); states.putActivityState(act, StateTypes.EARLIEST_OPERATION_START_TIME, new StateImpl(Math.max(arrTime, act.getTheoreticalEarliestOperationStartTime())));
} }
@Override @Override
public void finnish() {} public void end(End end, double arrivalTime) {}
} }

View file

@ -17,16 +17,16 @@ class UpdateLatestOperationStartTimeAtActLocations implements BackwardInTimeList
} }
@Override @Override
public void start(VehicleRoute route) {} public void start(VehicleRoute route, End end, double latestArrivalTime) {}
@Override @Override
public void prevActivity(TourActivity act,double latestDepartureTime, double latestOperationStartTime) { 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)); states.putActivityState(act, StateTypes.LATEST_OPERATION_START_TIME, new StateImpl(latestOperationStartTime));
} }
@Override @Override
public void finnish() {} public void end(Start start, double latestDepartureTime) {}
} }

View file

@ -27,17 +27,16 @@ class UpdateLoadAtAllLevels implements ForwardInTimeListener{
} }
@Override @Override
public void start(VehicleRoute route) { vehicleRoute = route; } public void start(VehicleRoute route, Start start, double departureTime) { vehicleRoute = route; }
@Override @Override
public void nextActivity(TourActivity act, double arrTime, double endTime) { public void nextActivity(TourActivity act, double arrTime, double endTime) {
if(act instanceof Start || act instanceof End){ return; }
load += (double)act.getCapacityDemand(); load += (double)act.getCapacityDemand();
states.putActivityState(act, StateTypes.LOAD, new StateImpl(load)); states.putActivityState(act, StateTypes.LOAD, new StateImpl(load));
} }
@Override @Override
public void finnish() { public void end(End end, double arrivalTime) {
states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load)); states.putRouteState(vehicleRoute, StateTypes.LOAD, new StateImpl(load));
load=0; load=0;
vehicleRoute = null; vehicleRoute = null;

View 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;
}
}

View file

@ -189,7 +189,7 @@ public class TestIterateRouteForwardInTime {
forwardInTime.iterate(vehicleRoute); forwardInTime.iterate(vehicleRoute);
assertEquals(40.0, states.getRouteStates(vehicleRoute).getState(StateTypes.COSTS).toDouble(), 0.05); 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); assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
} }

View file

@ -158,7 +158,7 @@ public class TestTourStateUpdaterWithService {
updateStates.update(vehicleRoute); updateStates.update(vehicleRoute);
assertEquals(40.0, states.getRouteState(vehicleRoute, StateTypes.COSTS).toDouble(), 0.05); 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); assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
} }

View file

@ -26,6 +26,7 @@ import java.util.Collection;
import readers.SolomonReader; import readers.SolomonReader;
import algorithms.GreedySchrimpfFactory; import algorithms.GreedySchrimpfFactory;
import algorithms.SchrimpfFactory; import algorithms.SchrimpfFactory;
import algorithms.VehicleRoutingAlgorithms;
import algorithms.selectors.SelectBest; import algorithms.selectors.SelectBest;
import analysis.AlgorithmSearchProgressChartListener; import analysis.AlgorithmSearchProgressChartListener;
import analysis.SolutionPlotter; import analysis.SolutionPlotter;
@ -75,7 +76,8 @@ public class SolomonExample {
* *
* The algorithm can be defined and configured in an xml-file. * 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")); vra.getAlgorithmListeners().addListener(new AlgorithmSearchProgressChartListener("output/sol_progress.png"));
/* /*
* Solve the problem. * Solve the problem.