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

remove instanceof job stuff

This commit is contained in:
oblonski 2019-07-19 09:05:12 +02:00
parent ad851b1951
commit ac84b62651
No known key found for this signature in database
GPG key ID: 179DE487285680D1
6 changed files with 30 additions and 74 deletions

View file

@ -20,9 +20,9 @@ package com.graphhopper.jsprit.core.algorithm.recreate;
import com.graphhopper.jsprit.core.problem.Location;
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
import com.graphhopper.jsprit.core.problem.job.Activity;
import com.graphhopper.jsprit.core.problem.job.Job;
import com.graphhopper.jsprit.core.problem.job.Service;
import com.graphhopper.jsprit.core.problem.job.Shipment;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
/**
* Created by schroeder on 15/10/15.
@ -51,42 +51,30 @@ public class DefaultScorer implements ScoringFunction {
@Override
public double score(InsertionData best, Job job) {
double score;
if (job instanceof Service) {
score = scoreService(best, job);
} else if (job instanceof Shipment) {
score = scoreShipment(best, job);
} else throw new IllegalStateException("not supported");
return score;
return scoreJob(best, job);
}
private double scoreShipment(InsertionData best, Job job) {
Shipment shipment = (Shipment) job;
double maxDepotDistance_1 = Math.max(
getDistance(best.getSelectedVehicle().getStartLocation(), shipment.getPickupLocation()),
getDistance(best.getSelectedVehicle().getStartLocation(), shipment.getDeliveryLocation())
);
double maxDepotDistance_2 = Math.max(
getDistance(best.getSelectedVehicle().getEndLocation(), shipment.getPickupLocation()),
getDistance(best.getSelectedVehicle().getEndLocation(), shipment.getDeliveryLocation())
);
double maxDepotDistance = Math.max(maxDepotDistance_1, maxDepotDistance_2);
double minTimeToOperate = Math.min(shipment.getPickupTimeWindow().getEnd() - shipment.getPickupTimeWindow().getStart(),
shipment.getDeliveryTimeWindow().getEnd() - shipment.getDeliveryTimeWindow().getStart());
private double scoreJob(InsertionData best, Job job) {
Location startLocation = best.getSelectedVehicle().getStartLocation();
Location endLocation = best.getSelectedVehicle().getEndLocation();
double maxDepotDistance = 0;
double minTimeToOperate = Double.MAX_VALUE;
for (Activity act : job.getActivities()) {
maxDepotDistance = Math.max(maxDepotDistance, getDistance(startLocation, act.getLocation()));
maxDepotDistance = Math.max(maxDepotDistance, getDistance(endLocation, act.getLocation()));
TimeWindow tw = getLargestTimeWindow(act);
minTimeToOperate = Math.min(minTimeToOperate, tw.getEnd() - tw.getStart());
}
return Math.max(timeWindowParam * minTimeToOperate, minTimeWindowScore) + depotDistanceParam * maxDepotDistance;
}
private double scoreService(InsertionData best, Job job) {
Location location = ((Service) job).getLocation();
double maxDepotDistance = 0;
if (location != null) {
maxDepotDistance = Math.max(
getDistance(best.getSelectedVehicle().getStartLocation(), location),
getDistance(best.getSelectedVehicle().getEndLocation(), location)
);
private TimeWindow getLargestTimeWindow(Activity act) {
TimeWindow timeWindow = null;
for (TimeWindow tw : act.getTimeWindows()) {
if (timeWindow == null) timeWindow = tw;
else if (tw.larger(timeWindow)) timeWindow = tw;
}
return Math.max(timeWindowParam * (((Service) job).getTimeWindow().getEnd() - ((Service) job).getTimeWindow().getStart()), minTimeWindowScore) +
depotDistanceParam * maxDepotDistance;
return TimeWindow.newInstance(0, Double.MAX_VALUE);
}

View file

@ -20,10 +20,7 @@ package com.graphhopper.jsprit.core.problem;
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingTransportCosts;
import com.graphhopper.jsprit.core.problem.cost.WaitingTimeCosts;
import com.graphhopper.jsprit.core.problem.job.Break;
import com.graphhopper.jsprit.core.problem.job.Job;
import com.graphhopper.jsprit.core.problem.job.Service;
import com.graphhopper.jsprit.core.problem.job.Shipment;
import com.graphhopper.jsprit.core.problem.job.*;
import com.graphhopper.jsprit.core.problem.solution.route.VehicleRoute;
import com.graphhopper.jsprit.core.problem.solution.route.activity.BreakActivity;
import com.graphhopper.jsprit.core.problem.solution.route.activity.DefaultShipmentActivityFactory;
@ -226,18 +223,8 @@ public class VehicleRoutingProblem {
}
private void addLocationToTentativeLocations(Job job) {
if (job instanceof Service) {
Location location = ((Service) job).getLocation();
// tentative_coordinates.put(location.getId(), location.getCoordinate());
addLocationToTentativeLocations(location);
} else if (job instanceof Shipment) {
Shipment shipment = (Shipment) job;
Location pickupLocation = shipment.getPickupLocation();
addLocationToTentativeLocations(pickupLocation);
// tentative_coordinates.put(pickupLocation.getId(), pickupLocation.getCoordinate());
Location deliveryLocation = shipment.getDeliveryLocation();
addLocationToTentativeLocations(deliveryLocation);
// tentative_coordinates.put(deliveryLocation.getId(), deliveryLocation.getCoordinate());
for (Activity act : job.getActivities()) {
addLocationToTentativeLocations(act.getLocation());
}
}
@ -247,13 +234,7 @@ public class VehicleRoutingProblem {
}
private void addJobToFinalJobMapAndCreateActivities(Job job) {
if (job instanceof Service) {
Service service = (Service) job;
addService(service);
} else if (job instanceof Shipment) {
Shipment shipment = (Shipment) job;
addShipment(shipment);
}
addJobToFinalMap(job);
List<AbstractActivity> jobActs = jobActivityFactory.createActivities(job);
for (AbstractActivity act : jobActs) {
act.setIndex(activityIndexCounter);
@ -333,13 +314,11 @@ public class VehicleRoutingProblem {
return this;
}
private void addShipment(Shipment job) {
private void addJobToFinalMap(Job job) {
if (jobs.containsKey(job.getId())) {
logger.warn("The job " + job + " has already been added to the job list. This overrides the existing job.");
}
addLocationToTentativeLocations(job);
// tentative_coordinates.put(job.getPickupLocation().getId(), job.getPickupLocation().getCoordinate());
// tentative_coordinates.put(job.getDeliveryLocation().getId(), job.getDeliveryLocation().getCoordinate());
jobs.put(job.getId(), job);
}
@ -516,15 +495,6 @@ public class VehicleRoutingProblem {
return Collections.unmodifiableCollection(tentativeJobs.values());
}
private Builder addService(Service service) {
addLocationToTentativeLocations(service);
if (jobs.containsKey(service.getId())) {
logger.warn("The service " + service + " has already been added to job list. This overrides existing job.");
}
jobs.put(service.getId(), service);
return this;
}
}

View file

@ -59,6 +59,7 @@ public class Delivery extends Service {
this.setType("delivery");
super.capacity = super.capacityBuilder.build();
super.skills = super.skillBuilder.build();
super.activity = new Activity.Builder(location, Activity.Type.DELIVERY).setTimeWindows(timeWindows.getTimeWindows()).setServiceTime(serviceTime).build();
return new Delivery(this);
}

View file

@ -61,6 +61,7 @@ public class Pickup extends Service {
this.setType("pickup");
super.capacity = super.capacityBuilder.build();
super.skills = super.skillBuilder.build();
super.activity = new Activity.Builder(location, Activity.Type.PICKUP).setTimeWindows(timeWindows.getTimeWindows()).setServiceTime(serviceTime).build();
return new Pickup(this);
}

View file

@ -96,7 +96,7 @@ public class Service extends AbstractJob {
protected double maxTimeInVehicle = Double.MAX_VALUE;
private Activity activity;
protected Activity activity;
Builder(String id){
this.id = id;

View file

@ -130,12 +130,8 @@ public class VehicleRoutingProblemTest {
@Test
public void whenServicesAreAdded_vrpShouldContainThem() {
Service s1 = mock(Service.class);
when(s1.getId()).thenReturn("s1");
when(s1.getLocation()).thenReturn(Location.Builder.newInstance().setIndex(1).build());
Service s2 = mock(Service.class);
when(s2.getId()).thenReturn("s2");
when(s2.getLocation()).thenReturn(Location.Builder.newInstance().setIndex(1).build());
Service s1 = Service.Builder.newInstance("s1").setLocation(Location.Builder.newInstance().setIndex(1).build()).build();
Service s2 = Service.Builder.newInstance("s2").setLocation(Location.Builder.newInstance().setIndex(1).build()).build();
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
vrpBuilder.addJob(s1).addJob(s2);