mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
experiment with insertionCalcs
This commit is contained in:
parent
50ca0971a5
commit
099d01ddd8
47 changed files with 1711 additions and 1343 deletions
|
|
@ -36,7 +36,6 @@ import algorithms.selectors.SelectRandomlyTest;
|
|||
GendreauPostOptTest.class,
|
||||
TestAlgorithmReader.class,
|
||||
// TestAux.class,
|
||||
TestCalculatesActivityInsertion.class,
|
||||
TestCalculatesServiceInsertion.class,
|
||||
TestCalculatesServiceInsertionOnRouteLevel.class,
|
||||
TestSchrimpf.class,
|
||||
|
|
|
|||
|
|
@ -41,12 +41,12 @@ import basics.costs.VehicleRoutingActivityCosts;
|
|||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.Driver;
|
||||
import basics.route.DriverImpl;
|
||||
import basics.route.ServiceActivity;
|
||||
import basics.route.TimeWindow;
|
||||
import basics.route.TourActivities;
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleImpl;
|
||||
import basics.route.VehicleRoute;
|
||||
import basics.route.VehicleType;
|
||||
import basics.route.VehicleTypeImpl;
|
||||
|
||||
public class GendreauPostOptTest {
|
||||
|
|
@ -71,15 +71,11 @@ public class GendreauPostOptTest {
|
|||
|
||||
Service job3;
|
||||
|
||||
private RouteStates states;
|
||||
private StatesContainerImpl states;
|
||||
|
||||
private List<Vehicle> vehicles;
|
||||
|
||||
private TourStateUpdater updater;
|
||||
|
||||
private VehicleFleetManagerImpl fleetManager;
|
||||
|
||||
private RouteAlgorithmImpl routeAlgorithm;
|
||||
|
||||
private JobInsertionCalculator insertionCalc;
|
||||
|
||||
|
|
@ -151,7 +147,7 @@ public class GendreauPostOptTest {
|
|||
|
||||
// Collection<Vehicle> vehicles = Arrays.asList(lightVehicle1,lightVehicle2, heavyVehicle);
|
||||
fleetManager = new VehicleFleetManagerImpl(vehicles);
|
||||
states = new RouteStates();
|
||||
states = new StatesContainerImpl();
|
||||
|
||||
activityCosts = new ExampleActivityCostFunction();
|
||||
|
||||
|
|
@ -162,23 +158,7 @@ public class GendreauPostOptTest {
|
|||
|
||||
insertionCalc = new CalculatesVehTypeDepServiceInsertion(fleetManager, withFixCost);
|
||||
|
||||
updater = new TourStateUpdater(states, cost, activityCosts);
|
||||
|
||||
//
|
||||
//
|
||||
// routeAlgorithm = RouteAlgorithmImpl.newInstance(insertionCalc, updater);
|
||||
// routeAlgorithm.setActivityStates(states);
|
||||
// if(fleetManager != null){
|
||||
// routeAlgorithm.getListeners().add(new RouteAlgorithm.VehicleSwitchedListener() {
|
||||
//
|
||||
// @Override
|
||||
// public void vehicleSwitched(Vehicle oldVehicle, Vehicle newVehicle) {
|
||||
// fleetManager.unlock(oldVehicle);
|
||||
// fleetManager.lock(newVehicle);
|
||||
// }
|
||||
// });
|
||||
// }
|
||||
|
||||
// updater = new TourStateUpdater(states, cost, activityCosts);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -188,18 +168,19 @@ public class GendreauPostOptTest {
|
|||
jobs.add(job1);
|
||||
jobs.add(job2);
|
||||
|
||||
states.initialiseStateOfJobs(jobs);
|
||||
vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build();
|
||||
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(job1, true));
|
||||
tour.addActivity(states.getActivity(job2, true));
|
||||
tour.addActivity(ServiceActivity.newInstance(job1));
|
||||
tour.addActivity(ServiceActivity.newInstance(job2));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle);
|
||||
updater.updateRoute(route);
|
||||
|
||||
fleetManager.lock(heavyVehicle);
|
||||
|
||||
UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts());
|
||||
stateUpdater.update(route);
|
||||
|
||||
Collection<VehicleRoute> routes = new ArrayList<VehicleRoute>();
|
||||
routes.add(route);
|
||||
// routes.add(new VehicleRoute(getEmptyTour(),getDriver(),getNoVehicle()));
|
||||
|
|
@ -209,7 +190,6 @@ public class GendreauPostOptTest {
|
|||
|
||||
assertEquals(110.0, sol.getCost(), 0.5);
|
||||
|
||||
UpdateRoute stateUpdater = new UpdateRoute(states, vrp.getTransportCosts(), vrp.getActivityCosts());
|
||||
|
||||
RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts()));
|
||||
radialRuin.addListener(stateUpdater);
|
||||
|
|
@ -234,17 +214,17 @@ public class GendreauPostOptTest {
|
|||
jobs.add(job2);
|
||||
jobs.add(job3);
|
||||
|
||||
states.initialiseStateOfJobs(jobs);
|
||||
vrp = VehicleRoutingProblem.Builder.newInstance().addAllJobs(jobs).addAllVehicles(vehicles).setRoutingCost(cost).build();
|
||||
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(job1, true));
|
||||
tour.addActivity(states.getActivity(job2, true));
|
||||
tour.addActivity(states.getActivity(job3, true));
|
||||
|
||||
tour.addActivity(ServiceActivity.newInstance(job1));
|
||||
tour.addActivity(ServiceActivity.newInstance(job2));
|
||||
tour.addActivity(ServiceActivity.newInstance(job3));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),heavyVehicle);
|
||||
updater.updateRoute(route);
|
||||
|
||||
UpdateStates stateUpdater = new UpdateStates(states, vrp.getTransportCosts(), vrp.getActivityCosts());
|
||||
stateUpdater.update(route);
|
||||
|
||||
fleetManager.lock(heavyVehicle);
|
||||
|
||||
|
|
@ -255,8 +235,6 @@ public class GendreauPostOptTest {
|
|||
|
||||
assertEquals(110.0, sol.getCost(), 0.5);
|
||||
|
||||
UpdateRoute stateUpdater = new UpdateRoute(states, vrp.getTransportCosts(), vrp.getActivityCosts());
|
||||
|
||||
RuinRadial radialRuin = new RuinRadial(vrp, 0.2, new JobDistanceAvgCosts(vrp.getTransportCosts()));
|
||||
InsertionStrategy insertionStrategy = new BestInsertion(insertionCalc);
|
||||
insertionStrategy.addListener(stateUpdater);
|
||||
|
|
@ -272,18 +250,6 @@ public class GendreauPostOptTest {
|
|||
assertEquals(2,newSolution.getRoutes().size());
|
||||
assertEquals(80.0,newSolution.getCost(),0.5);
|
||||
}
|
||||
|
||||
private Vehicle getNoVehicle() {
|
||||
return new VehicleImpl.NoVehicle();
|
||||
}
|
||||
|
||||
private Driver getDriver() {
|
||||
return DriverImpl.noDriver();
|
||||
}
|
||||
|
||||
private TourActivities getEmptyTour() {
|
||||
return new TourActivities();
|
||||
}
|
||||
|
||||
private Service getService(String to, double serviceTime) {
|
||||
Service s = Service.Builder.newInstance(to, 0).setLocationId(to).setServiceTime(serviceTime).setTimeWindow(TimeWindow.newInstance(0.0, 20.0)).build();
|
||||
|
|
|
|||
|
|
@ -1,286 +0,0 @@
|
|||
/*******************************************************************************
|
||||
* Copyright (C) 2013 Stefan Schroeder
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* Contributors:
|
||||
* Stefan Schroeder - initial API and implementation
|
||||
******************************************************************************/
|
||||
package algorithms;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import algorithms.RouteStates.ActivityState;
|
||||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.TourActivities;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleRoute;
|
||||
|
||||
|
||||
|
||||
public class TestCalculatesActivityInsertion {
|
||||
|
||||
VehicleRoutingTransportCosts costs;
|
||||
|
||||
Vehicle newVehicle;
|
||||
|
||||
private RouteStates states;
|
||||
|
||||
private CalculatesActivityInsertionWithHardTimeWindows insertionCalculator;
|
||||
|
||||
@Before
|
||||
public void setup(){
|
||||
costs = mock(VehicleRoutingTransportCosts.class);
|
||||
newVehicle = mock(Vehicle.class);
|
||||
|
||||
when(costs.getTransportCost("depot", "1", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("depot", "2", 0.0, null, null)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("depot", "3", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("1", "2", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("1", "3", 0.0, null, null)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("2", "3", 0.0, null, null)).thenReturn(10.0);
|
||||
|
||||
when(costs.getTransportCost("1", "depot", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("2", "depot", 0.0, null, null)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("3", "depot", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("2", "1", 0.0, null, null)).thenReturn(10.0);
|
||||
when(costs.getTransportCost("3", "1", 0.0, null, null)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("3", "2", 0.0, null, null)).thenReturn(10.0);
|
||||
|
||||
when(costs.getTransportCost("depot", "1", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("depot", "2", 0.0, null, newVehicle)).thenReturn(40.0);
|
||||
when(costs.getTransportCost("depot", "3", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("1", "2", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("1", "3", 0.0, null, newVehicle)).thenReturn(40.0);
|
||||
when(costs.getTransportCost("2", "3", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
|
||||
when(costs.getTransportCost("1", "depot", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("2", "depot", 0.0, null, newVehicle)).thenReturn(40.0);
|
||||
when(costs.getTransportCost("3", "depot", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("2", "1", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
when(costs.getTransportCost("3", "1", 0.0, null, newVehicle)).thenReturn(40.0);
|
||||
when(costs.getTransportCost("3", "2", 0.0, null, newVehicle)).thenReturn(20.0);
|
||||
|
||||
states = new RouteStates();
|
||||
|
||||
insertionCalculator = new CalculatesActivityInsertionWithHardTimeWindows(states,costs,activityCosts());
|
||||
|
||||
}
|
||||
|
||||
private ExampleActivityCostFunction activityCosts() {
|
||||
return new ExampleActivityCostFunction();
|
||||
}
|
||||
|
||||
public TourActivity getActivityMock(String id, double earliestOperationStart, double currCost){
|
||||
TourActivity act = mock(TourActivity.class);
|
||||
when(act.getLocationId()).thenReturn(id);
|
||||
states.getActivityStates().put(act, new ActivityState(act));
|
||||
states.getState(act).setEarliestOperationStart(earliestOperationStart);
|
||||
states.getState(act).setCurrentCost(currCost);
|
||||
// when(act.getEarliestOperationStartTime()).thenReturn(earliestOperationStart);
|
||||
// when(act.getCurrentCost()).thenReturn(currCost);
|
||||
return act;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJob_itCalculatesMarginalCostChanges(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity prevAct = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity nextAct = getActivityMock("3", 0.0, 30.0);
|
||||
TourActivity act2insert = getActivityMock("2", 0.0, 0.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(prevAct);
|
||||
vehicleRoute.getTourActivities().addActivity(nextAct);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,prevAct,nextAct,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
// when(states.getRouteState(vehicleRoute).getCosts()).thenReturn(40.0);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, prevAct, nextAct, act2insert, null, null);
|
||||
assertEquals(0.0,c,0.2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJob_itCalculatesMarginalCostChanges2(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(act2);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, act1, act2, act3, null, null);
|
||||
assertEquals(20.0,c,0.2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJob_itCalculatesMarginalCostChanges3(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 0.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 20.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, start, act1, act3, null, null);
|
||||
assertEquals(20.0,c,0.2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(act2);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, act1, act2, act3, null, newVehicle);
|
||||
assertEquals(50.0,c,0.2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJobWithANewVehicle_itCalculatesLocalMarginalCostChangesAndAfterInsertionCostChanges(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(act2);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, act1, act2, act3, null, newVehicle);
|
||||
assertEquals(50.0,c,0.2);
|
||||
}
|
||||
|
||||
//already on route-level
|
||||
// @Test
|
||||
// public void whenInsertingANewJobWithANewVehicle_itCalculatesTotalMarginalCostChanges(){
|
||||
// Tour tour = mock(Tour.class);
|
||||
// TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
// TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
// TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
// TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
// TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
//
|
||||
// List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
// when(tour.getActivities()).thenReturn(activities);
|
||||
//
|
||||
// double c = insertionCalculator.calculate(tour, act1, act2, act3, null, newVehicle);
|
||||
// assertEquals(80.0,c,0.2);
|
||||
// }
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJobWithANewVehicle_itCalculatesTotalMarginalCostChanges2(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(act2);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, act2, end, act3, null, newVehicle);
|
||||
assertEquals(20.0,c,0.2);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenInsertingANewJobWithANewVehicle_itCalculatesTotalMarginalCostChanges3(){
|
||||
VehicleRoute vehicleRoute = VehicleRoute.emptyRoute();
|
||||
|
||||
TourActivities tour = mock(TourActivities.class);
|
||||
TourActivity start = getActivityMock("depot", 0.0, 0.0);
|
||||
TourActivity act1 = getActivityMock("1", 0.0, 10.0);
|
||||
TourActivity act3 = getActivityMock("3", 0.0, 0.0);
|
||||
TourActivity act2 = getActivityMock("2", 0.0, 20.0);
|
||||
TourActivity end = getActivityMock("depot", 0.0, 40.0);
|
||||
|
||||
vehicleRoute.getTourActivities().addActivity(start);
|
||||
vehicleRoute.getTourActivities().addActivity(act1);
|
||||
vehicleRoute.getTourActivities().addActivity(act2);
|
||||
vehicleRoute.getTourActivities().addActivity(end);
|
||||
|
||||
List<TourActivity> activities = Arrays.asList(start,act1,act2,end);
|
||||
when(tour.getActivities()).thenReturn(activities);
|
||||
|
||||
double c = insertionCalculator.calculate(vehicleRoute, start, act1, act3, null, newVehicle);
|
||||
assertEquals(50.0,c,0.2);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -36,6 +36,7 @@ import basics.Job;
|
|||
import basics.Service;
|
||||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.DriverImpl;
|
||||
import basics.route.ServiceActivity;
|
||||
import basics.route.TimeWindow;
|
||||
import basics.route.TourActivities;
|
||||
import basics.route.TourActivity;
|
||||
|
|
@ -61,12 +62,12 @@ public class TestCalculatesServiceInsertion {
|
|||
|
||||
private Service third;
|
||||
|
||||
private RouteStates states;
|
||||
|
||||
private TourStateUpdater tourStateUpdater;
|
||||
private StatesContainerImpl states;
|
||||
|
||||
private NoDriver driver;
|
||||
|
||||
private UpdateStates stateUpdater;
|
||||
|
||||
@Before
|
||||
public void setup(){
|
||||
Logger.getRootLogger().setLevel(Level.DEBUG);
|
||||
|
|
@ -151,17 +152,14 @@ public class TestCalculatesServiceInsertion {
|
|||
jobs.add(second);
|
||||
jobs.add(third);
|
||||
|
||||
states = new RouteStates();
|
||||
states.initialiseStateOfJobs(jobs);
|
||||
states = new StatesContainerImpl();
|
||||
|
||||
ExampleActivityCostFunction activityCosts = new ExampleActivityCostFunction();
|
||||
|
||||
serviceInsertion = new CalculatesServiceInsertion(costs, activityCosts);
|
||||
serviceInsertion.setActivityStates(states);
|
||||
|
||||
tourStateUpdater = new TourStateUpdater(states, costs, activityCosts);
|
||||
|
||||
|
||||
stateUpdater = new UpdateStates(states, costs, activityCosts);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -176,7 +174,7 @@ public class TestCalculatesServiceInsertion {
|
|||
TourActivities tour = new TourActivities();
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -186,10 +184,10 @@ public class TestCalculatesServiceInsertion {
|
|||
@Test
|
||||
public void whenInsertingTheSecondJobInAnNonEmptyTourWithVehicle_itCalculatesMarginalCostChanges(){
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(first, true));
|
||||
tour.addActivity(ServiceActivity.newInstance(first));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -199,12 +197,12 @@ public class TestCalculatesServiceInsertion {
|
|||
@Test
|
||||
public void whenInsertingThirdJobWithVehicle_itCalculatesMarginalCostChanges(){
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(first,true));
|
||||
tour.addActivity(states.getActivity(second,true));
|
||||
tour.addActivity(ServiceActivity.newInstance(first));
|
||||
tour.addActivity(ServiceActivity.newInstance(second));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -214,12 +212,12 @@ public class TestCalculatesServiceInsertion {
|
|||
@Test
|
||||
public void whenInsertingThirdJobWithNewVehicle_itCalculatesMarginalCostChanges(){
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(first,true));
|
||||
tour.addActivity(states.getActivity(second,true));
|
||||
tour.addActivity(ServiceActivity.newInstance(first));
|
||||
tour.addActivity(ServiceActivity.newInstance(second));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, third, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -229,11 +227,11 @@ public class TestCalculatesServiceInsertion {
|
|||
@Test
|
||||
public void whenInsertingASecondJobWithAVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(first,true));
|
||||
tour.addActivity(states.getActivity(third,true));
|
||||
tour.addActivity(ServiceActivity.newInstance(first));
|
||||
tour.addActivity(ServiceActivity.newInstance(third));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -243,13 +241,13 @@ public class TestCalculatesServiceInsertion {
|
|||
@Test
|
||||
public void whenInsertingASecondJobWithANewVehicle_itCalculatesLocalMarginalCostChanges(){
|
||||
TourActivities tour = new TourActivities();
|
||||
tour.addActivity(states.getActivity(first,true));
|
||||
tour.addActivity(states.getActivity(third,true));
|
||||
tour.addActivity(ServiceActivity.newInstance(first));
|
||||
tour.addActivity(ServiceActivity.newInstance(third));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
// route.addActivity(states.getActivity(first,true));
|
||||
// route.addActivity(states.getActivity(third,true));
|
||||
tourStateUpdater.updateRoute(route);
|
||||
stateUpdater.update(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, newVehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
|
|||
|
|
@ -64,9 +64,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
|
||||
private Service third;
|
||||
|
||||
private RouteStates states;
|
||||
|
||||
private TourStateUpdater tourStateUpdater;
|
||||
private StatesContainerImpl states;
|
||||
|
||||
private NoDriver driver;
|
||||
|
||||
|
|
@ -167,7 +165,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
TourActivities tour = new TourActivities();
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
tourStateUpdater.iterate(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, first, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(20.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -208,7 +206,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
|
||||
tourStateUpdater.updateRoute(route);
|
||||
tourStateUpdater.iterate(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, third, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -223,7 +221,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
|
||||
tourStateUpdater.updateRoute(route);
|
||||
tourStateUpdater.iterate(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, third, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -237,7 +235,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
tour.addActivity(states.getActivity(third,true));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
tourStateUpdater.iterate(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, second, vehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(0.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
@ -251,7 +249,7 @@ public class TestCalculatesServiceInsertionOnRouteLevel {
|
|||
tour.addActivity(states.getActivity(third,true));
|
||||
|
||||
VehicleRoute route = VehicleRoute.newInstance(tour,driver,vehicle);
|
||||
tourStateUpdater.updateRoute(route);
|
||||
tourStateUpdater.iterate(route);
|
||||
|
||||
InsertionData iData = serviceInsertion.calculate(route, second, newVehicle, vehicle.getEarliestDeparture(), null, Double.MAX_VALUE);
|
||||
assertEquals(40.0, iData.getInsertionCost(), 0.2);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,196 @@
|
|||
package algorithms;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
|
||||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import util.Coordinate;
|
||||
import util.ManhattanDistanceCalculator;
|
||||
import basics.Job;
|
||||
import basics.Service;
|
||||
import basics.costs.DefaultVehicleRoutingActivityCosts;
|
||||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.Driver;
|
||||
import basics.route.DriverImpl;
|
||||
import basics.route.ServiceActivity;
|
||||
import basics.route.TimeWindow;
|
||||
import basics.route.TourActivities;
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleImpl;
|
||||
import basics.route.VehicleRoute;
|
||||
import basics.route.VehicleTypeImpl;
|
||||
|
||||
public class TestIterateRouteForwardInTime {
|
||||
|
||||
TourActivities tour;
|
||||
|
||||
Driver driver;
|
||||
|
||||
Vehicle vehicle;
|
||||
|
||||
TourActivities anotherTour;
|
||||
|
||||
|
||||
|
||||
RouteStates states;
|
||||
|
||||
private VehicleRoute vehicleRoute;
|
||||
|
||||
private VehicleRoutingTransportCosts cost;
|
||||
|
||||
ServiceActivity firstAct;
|
||||
|
||||
ServiceActivity secondAct;
|
||||
|
||||
@Before
|
||||
public void setUp(){
|
||||
cost = new VehicleRoutingTransportCosts() {
|
||||
|
||||
@Override
|
||||
public double getBackwardTransportTime(String fromId, String toId,
|
||||
double arrivalTime, Driver driver, Vehicle vehicle) {
|
||||
return getTransportCost(fromId, toId, arrivalTime, driver, vehicle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBackwardTransportCost(String fromId, String toId,
|
||||
double arrivalTime, Driver driver, Vehicle vehicle) {
|
||||
return getTransportCost(fromId, toId, arrivalTime, driver, vehicle);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getTransportCost(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
String[] fromTokens = fromId.split(",");
|
||||
String[] toTokens = toId.split(",");
|
||||
double fromX = Double.parseDouble(fromTokens[0]);
|
||||
double fromY = Double.parseDouble(fromTokens[1]);
|
||||
|
||||
double toX = Double.parseDouble(toTokens[0]);
|
||||
double toY = Double.parseDouble(toTokens[1]);
|
||||
|
||||
return ManhattanDistanceCalculator.calculateDistance(new Coordinate(fromX, fromY), new Coordinate(toX, toY));
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getTransportTime(String fromId, String toId, double departureTime, Driver driver, Vehicle vehicle) {
|
||||
return getTransportCost(fromId, toId, departureTime, driver, vehicle);
|
||||
}
|
||||
};
|
||||
|
||||
Service firstService = Service.Builder.newInstance("1", 5).setLocationId("10,0").setTimeWindow(TimeWindow.newInstance(0, 20)).build();
|
||||
Service secondService = Service.Builder.newInstance("2", 5).setLocationId("0,10").setTimeWindow(TimeWindow.newInstance(0, 50)).build();
|
||||
|
||||
Collection<Job> services = new ArrayList<Job>();
|
||||
services.add(firstService);
|
||||
services.add(secondService);
|
||||
|
||||
VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("test", 0).build();
|
||||
vehicle = VehicleImpl.Builder.newInstance("testvehicle").setType(type).setLocationId("0,0")
|
||||
.setEarliestStart(0.0).setLatestArrival(50.0).build();
|
||||
|
||||
tour = new TourActivities();
|
||||
firstAct = ServiceActivity.newInstance(firstService);
|
||||
tour.addActivity(firstAct);
|
||||
secondAct = ServiceActivity.newInstance(secondService);
|
||||
tour.addActivity(secondAct);
|
||||
|
||||
vehicleRoute = VehicleRoute.newInstance(tour,DriverImpl.noDriver(),vehicle);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenIteratingWithoutUpdate_itShouldUpdateNothing() {
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(0.0,firstAct.getArrTime(),0.1);
|
||||
assertEquals(0.0,firstAct.getEndTime(),0.1);
|
||||
|
||||
assertEquals(0.0,secondAct.getArrTime(),0.1);
|
||||
assertEquals(0.0,secondAct.getEndTime(),0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenIteratingWithActivityTimeUpdater_itShouldUpdateActivityTimes() {
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
forwardInTime.addListener(new UpdateActivityTimes());
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(10.0,firstAct.getArrTime(),0.1);
|
||||
assertEquals(10.0,firstAct.getEndTime(),0.1);
|
||||
|
||||
assertEquals(30.0,secondAct.getArrTime(),0.1);
|
||||
assertEquals(30.0,secondAct.getEndTime(),0.1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void whenIteratingWithLoadUpdateAtActLocations_itShouldUpdateLoad() {
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
StatesContainerImpl states = new StatesContainerImpl();
|
||||
forwardInTime.addListener(new UpdateLoadAtAllLevels(states));
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(5.0, states.getActivityStates(firstAct).getState(StateTypes.LOAD).toDouble(), 0.01);
|
||||
assertEquals(10.0, states.getActivityStates(secondAct).getState(StateTypes.LOAD).toDouble(), 0.01);
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testStatesOfAct0(){
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05);
|
||||
assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId());
|
||||
assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05);
|
||||
assertEquals(vehicleRoute.getVehicle().getLatestArrival(), vehicleRoute.getStart().getTheoreticalLatestOperationStartTime(),0.05);
|
||||
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatesOfAct1(){
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
StatesContainerImpl states = new StatesContainerImpl();
|
||||
forwardInTime.addListener(new UpdateLoadAtAllLevels(states));
|
||||
forwardInTime.addListener(new UpdateEarliestStartTimeWindowAtActLocations(states));
|
||||
forwardInTime.addListener(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, states));
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(10.0, states.getActivityStates(firstAct).getState(StateTypes.COSTS).toDouble(),0.05);
|
||||
assertEquals(5.0, states.getActivityStates(firstAct).getState(StateTypes.LOAD).toDouble(),0.05);
|
||||
assertEquals(10.0, states.getActivityStates(firstAct).getState(StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
|
||||
// assertEquals(20.0, states.getState(tour.getActivities().get(0)).getLatestOperationStart(),0.05);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatesOfAct2(){
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
StatesContainerImpl states = new StatesContainerImpl();
|
||||
forwardInTime.addListener(new UpdateLoadAtAllLevels(states));
|
||||
forwardInTime.addListener(new UpdateEarliestStartTimeWindowAtActLocations(states));
|
||||
forwardInTime.addListener(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, states));
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(30.0, states.getActivityStates(secondAct).getState(StateTypes.COSTS).toDouble(),0.05);
|
||||
assertEquals(10.0, states.getActivityStates(secondAct).getState(StateTypes.LOAD).toDouble(),0.05);
|
||||
assertEquals(30.0, states.getActivityStates(secondAct).getState(StateTypes.EARLIEST_OPERATION_START_TIME).toDouble(),0.05);
|
||||
// assertEquals(40.0, states.getState(tour.getActivities().get(1)).getLatestOperationStart(),0.05);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatesOfAct3(){
|
||||
IterateRouteForwardInTime forwardInTime = new IterateRouteForwardInTime(cost);
|
||||
StatesContainerImpl states = new StatesContainerImpl();
|
||||
forwardInTime.addListener(new UpdateActivityTimes());
|
||||
forwardInTime.addListener(new UpdateCostsAtAllLevels(new DefaultVehicleRoutingActivityCosts(), cost, states));
|
||||
forwardInTime.iterate(vehicleRoute);
|
||||
|
||||
assertEquals(40.0, states.getRouteStates(vehicleRoute).getState(StateTypes.COSTS).toDouble(), 0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
||||
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -119,14 +119,14 @@ public class TestTourStateUpdaterWithService {
|
|||
|
||||
@Test
|
||||
public void testCalculatedCost() {
|
||||
tdTourStatusProcessor.updateRoute(vehicleRoute);
|
||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
||||
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
|
||||
assertEquals(10, states.getRouteState(vehicleRoute).getLoad());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStatesOfAct0(){
|
||||
tdTourStatusProcessor.updateRoute(vehicleRoute);
|
||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
||||
assertEquals(0.0, vehicleRoute.getStart().getEndTime(),0.05);
|
||||
assertEquals(vehicleRoute.getVehicle().getLocationId(), vehicleRoute.getStart().getLocationId());
|
||||
assertEquals(vehicleRoute.getVehicle().getEarliestDeparture(), vehicleRoute.getStart().getTheoreticalEarliestOperationStartTime(),0.05);
|
||||
|
|
@ -136,7 +136,7 @@ public class TestTourStateUpdaterWithService {
|
|||
|
||||
@Test
|
||||
public void testStatesOfAct1(){
|
||||
tdTourStatusProcessor.updateRoute(vehicleRoute);
|
||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
||||
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getCurrentCost(),0.05);
|
||||
assertEquals(5.0, states.getState(tour.getActivities().get(0)).getCurrentLoad(),0.05);
|
||||
assertEquals(10.0, states.getState(tour.getActivities().get(0)).getEarliestOperationStart(),0.05);
|
||||
|
|
@ -145,7 +145,7 @@ public class TestTourStateUpdaterWithService {
|
|||
|
||||
@Test
|
||||
public void testStatesOfAct2(){
|
||||
tdTourStatusProcessor.updateRoute(vehicleRoute);
|
||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
||||
assertEquals(30.0, states.getState(tour.getActivities().get(1)).getCurrentCost(),0.05);
|
||||
assertEquals(10.0, states.getState(tour.getActivities().get(1)).getCurrentLoad(),0.05);
|
||||
assertEquals(30.0, states.getState(tour.getActivities().get(1)).getEarliestOperationStart(),0.05);
|
||||
|
|
@ -154,7 +154,7 @@ public class TestTourStateUpdaterWithService {
|
|||
|
||||
@Test
|
||||
public void testStatesOfAct3(){
|
||||
tdTourStatusProcessor.updateRoute(vehicleRoute);
|
||||
tdTourStatusProcessor.iterate(vehicleRoute);
|
||||
assertEquals(40.0, states.getRouteState(vehicleRoute).getCosts(), 0.05);
|
||||
assertEquals(40.0, vehicleRoute.getEnd().getEndTime(),0.05);
|
||||
assertEquals(50.0, vehicleRoute.getEnd().getTheoreticalLatestOperationStartTime(),0.05);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue