mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
Merge pull request #26 from bringg/add-vehicle-fixed-cost-to-new-routes
add vehicle fixed cost to new routes
This commit is contained in:
commit
5f9b9e1929
6 changed files with 71 additions and 14 deletions
|
|
@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue