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

add vehicle fixed cost to new routes

This commit is contained in:
Kandel Irina 2018-01-31 08:13:26 +02:00
parent 8d4de24ff7
commit ec13abcf4b
6 changed files with 71 additions and 14 deletions

View file

@ -75,15 +75,9 @@ public abstract class AbstractInsertionStrategy implements InsertionStrategy {
protected VehicleRoutingProblem vrp; protected VehicleRoutingProblem vrp;
protected double minVehicleCost = Double.POSITIVE_INFINITY;
public AbstractInsertionStrategy(VehicleRoutingProblem vrp) { public AbstractInsertionStrategy(VehicleRoutingProblem vrp) {
this.insertionsListeners = new InsertionListeners(); this.insertionsListeners = new InsertionListeners();
this.vrp = vrp; this.vrp = vrp;
for (Vehicle vehicle : vrp.getVehicles()) {
minVehicleCost = Math.min(vehicle.getType().getVehicleCostParams().fix, minVehicleCost);
}
eventListeners = new EventListeners(); eventListeners = new EventListeners();
} }
@ -133,4 +127,9 @@ public abstract class AbstractInsertionStrategy implements InsertionStrategy {
insertionsListeners.informJobInserted(unassignedJob, inRoute, iData.getInsertionCost(), iData.getAdditionalTime()); insertionsListeners.informJobInserted(unassignedJob, inRoute, iData.getInsertionCost(), iData.getAdditionalTime());
} }
protected static void updateNewRouteInsertionData(InsertionData iData) {
if (iData.getSelectedVehicle() != null)
iData.setInsertionCost(iData.getInsertionCost() + iData.getSelectedVehicle().getType().getVehicleCostParams().fix);
}
} }

View file

@ -63,8 +63,8 @@ public final class BestInsertion extends AbstractInsertionStrategy {
@Override @Override
public Collection<Job> insertUnassignedJobs(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) { public Collection<Job> insertUnassignedJobs(Collection<VehicleRoute> vehicleRoutes, Collection<Job> unassignedJobs) {
List<Job> badJobs = new ArrayList<Job>(unassignedJobs.size()); List<Job> badJobs = new ArrayList<>(unassignedJobs.size());
List<Job> unassignedJobList = new ArrayList<Job>(unassignedJobs); List<Job> unassignedJobList = new ArrayList<>(unassignedJobs);
Collections.shuffle(unassignedJobList, random); Collections.shuffle(unassignedJobList, random);
Collections.sort(unassignedJobList, new AccordingToPriorities()); Collections.sort(unassignedJobList, new AccordingToPriorities());
for (Job unassignedJob : unassignedJobList) { for (Job unassignedJob : unassignedJobList) {
@ -85,7 +85,7 @@ public final class BestInsertion extends AbstractInsertionStrategy {
VehicleRoute newRoute = VehicleRoute.emptyRoute(); VehicleRoute newRoute = VehicleRoute.emptyRoute();
InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost); InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost);
if (!(newIData instanceof InsertionData.NoInsertionFound)) { if (!(newIData instanceof InsertionData.NoInsertionFound)) {
newIData.setInsertionCost(newIData.getInsertionCost() + minVehicleCost); updateNewRouteInsertionData(newIData);
if (newIData.getInsertionCost() < bestInsertionCost + noiseMaker.makeNoise()) { if (newIData.getInsertionCost() < bestInsertionCost + noiseMaker.makeNoise()) {
bestInsertion = new Insertion(newRoute, newIData); bestInsertion = new Insertion(newRoute, newIData);
vehicleRoutes.add(newRoute); vehicleRoutes.add(newRoute);

View file

@ -138,7 +138,7 @@ public final class BestInsertionConcurrent extends AbstractInsertionStrategy {
} }
VehicleRoute newRoute = VehicleRoute.emptyRoute(); VehicleRoute newRoute = VehicleRoute.emptyRoute();
InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost); InsertionData newIData = bestInsertionCostCalculator.getInsertionData(newRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, bestInsertionCost);
newIData.setInsertionCost(newIData.getInsertionCost() + minVehicleCost); updateNewRouteInsertionData(newIData);
if (newIData.getInsertionCost() < bestInsertionCost) { if (newIData.getInsertionCost() < bestInsertionCost) {
bestInsertion = new Insertion(newRoute, newIData); bestInsertion = new Insertion(newRoute, newIData);
vehicleRoutes.add(newRoute); vehicleRoutes.add(newRoute);

View file

@ -137,7 +137,7 @@ public class RegretInsertion extends AbstractInsertionStrategy {
private ScoredJob nextJob(Collection<VehicleRoute> routes, Collection<Job> unassignedJobList, List<ScoredJob> badJobs) { private ScoredJob nextJob(Collection<VehicleRoute> routes, Collection<Job> unassignedJobList, List<ScoredJob> badJobs) {
ScoredJob bestScoredJob = null; ScoredJob bestScoredJob = null;
for (Job unassignedJob : unassignedJobList) { for (Job unassignedJob : unassignedJobList) {
ScoredJob scoredJob = getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction, minVehicleCost); ScoredJob scoredJob = getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction);
if (scoredJob instanceof ScoredJob.BadJob) { if (scoredJob instanceof ScoredJob.BadJob) {
badJobs.add(scoredJob); badJobs.add(scoredJob);
continue; continue;
@ -156,7 +156,7 @@ public class RegretInsertion extends AbstractInsertionStrategy {
return bestScoredJob; return bestScoredJob;
} }
static ScoredJob getScoredJob(Collection<VehicleRoute> routes, Job unassignedJob, JobInsertionCostsCalculator insertionCostsCalculator, ScoringFunction scoringFunction, double newVehicleCost) { static ScoredJob getScoredJob(Collection<VehicleRoute> routes, Job unassignedJob, JobInsertionCostsCalculator insertionCostsCalculator, ScoringFunction scoringFunction) {
InsertionData best = null; InsertionData best = null;
InsertionData secondBest = null; InsertionData secondBest = null;
VehicleRoute bestRoute = null; VehicleRoute bestRoute = null;
@ -186,7 +186,7 @@ public class RegretInsertion extends AbstractInsertionStrategy {
VehicleRoute emptyRoute = VehicleRoute.emptyRoute(); VehicleRoute emptyRoute = VehicleRoute.emptyRoute();
InsertionData iData = insertionCostsCalculator.getInsertionData(emptyRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, benchmark); InsertionData iData = insertionCostsCalculator.getInsertionData(emptyRoute, unassignedJob, NO_NEW_VEHICLE_YET, NO_NEW_DEPARTURE_TIME_YET, NO_NEW_DRIVER_YET, benchmark);
if (!(iData instanceof InsertionData.NoInsertionFound)) { if (!(iData instanceof InsertionData.NoInsertionFound)) {
iData.setInsertionCost(iData.getInsertionCost() + newVehicleCost); updateNewRouteInsertionData(iData);
if (best == null) { if (best == null) {
best = iData; best = iData;
bestRoute = emptyRoute; bestRoute = emptyRoute;

View file

@ -139,7 +139,7 @@ public class RegretInsertionConcurrent extends AbstractInsertionStrategy {
@Override @Override
public ScoredJob call() throws Exception { public ScoredJob call() throws Exception {
return RegretInsertion.getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction, minVehicleCost); return RegretInsertion.getScoredJob(routes, unassignedJob, insertionCostsCalculator, scoringFunction);
} }
}); });

View file

@ -0,0 +1,58 @@
package com.graphhopper.jsprit.core.algorithm.recreate;
import com.graphhopper.jsprit.core.problem.Location;
import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
import org.junit.Test;
import java.util.Random;
import java.util.UUID;
import static org.junit.Assert.assertEquals;
public class AbstractInsertionStrategyTest {
Random random = new Random();
@Test
public void updateNewRouteInsertionDataNoInsertion() {
InsertionData iData = new InsertionData.NoInsertionFound();
AbstractInsertionStrategy.updateNewRouteInsertionData(iData);
assertEquals(iData.getInsertionCost(), Double.MAX_VALUE, .001);
}
@Test
public void updateNewRouteInsertionDataNewInsertionNoVehicle() {
double insertionCost = random.nextDouble();
Vehicle vehicle = new VehicleImpl.NoVehicle();
InsertionData iData = new InsertionData(insertionCost, -1, -1, vehicle, null);
AbstractInsertionStrategy.updateNewRouteInsertionData(iData);
assertEquals(iData.getInsertionCost(), insertionCost, .001);
}
@Test
public void updateNewRouteInsertionDataNewInsertionVehicleWithFixedCost() {
double insertionCost = random.nextDouble();
double fixedCost = random.nextDouble();
Vehicle vehicle = VehicleImpl.Builder.newInstance(UUID.randomUUID().toString())
.setType(VehicleTypeImpl.Builder.newInstance(UUID.randomUUID().toString()).setFixedCost(fixedCost).build())
.setStartLocation(Location.newInstance(random.nextDouble(), random.nextDouble()))
.build();
InsertionData iData = new InsertionData(insertionCost, -1, -1, vehicle, null);
AbstractInsertionStrategy.updateNewRouteInsertionData(iData);
assertEquals(iData.getInsertionCost(), insertionCost + fixedCost, .001);
}
@Test
public void updateNewRouteInsertionDataNewInsertionVehicleWithoutType() {
double insertionCost = random.nextDouble();
Vehicle vehicle = VehicleImpl.Builder.newInstance(UUID.randomUUID().toString())
.setStartLocation(Location.newInstance(random.nextDouble(), random.nextDouble()))
.build();
InsertionData iData = new InsertionData(insertionCost, -1, -1, vehicle, null);
AbstractInsertionStrategy.updateNewRouteInsertionData(iData);
assertEquals(iData.getInsertionCost(), insertionCost, .001);
}
}