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

add option to get activities from job

This commit is contained in:
oblonski 2019-07-18 22:44:46 +02:00
parent 47566d750c
commit dd3f29b5cc
No known key found for this signature in database
GPG key ID: 179DE487285680D1
6 changed files with 147 additions and 24 deletions

View file

@ -0,0 +1,92 @@
/*
* Licensed to GraphHopper GmbH under one or more contributor
* license agreements. See the NOTICE file distributed with this work for
* additional information regarding copyright ownership.
*
* GraphHopper GmbH licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.graphhopper.jsprit.core.problem.job;
import com.graphhopper.jsprit.core.problem.Location;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
import java.util.Collection;
public class Activity {
public enum Type {
PICKUP, DELIVERY, SERVICE
}
public static class Builder {
private final Type activityType;
private Location location;
Collection<TimeWindow> timeWindows;
private double serviceTime;
public Builder(Location location, Type activityType) {
this.location = location;
this.activityType = activityType;
}
public Builder setTimeWindows(Collection<TimeWindow> timeWindows) {
this.timeWindows = timeWindows;
return this;
}
public Builder setServiceTime(double serviceTime) {
this.serviceTime = serviceTime;
return this;
}
public Activity build() {
return new Activity(this);
}
}
private Location location;
private Collection<TimeWindow> timeWindows;
private double serviceTime;
private Activity.Type activityType;
Activity(Builder builder) {
location = builder.location;
timeWindows = builder.timeWindows;
serviceTime = builder.serviceTime;
activityType = builder.activityType;
}
public Type getActivityType() {
return activityType;
}
public Location getLocation() {
return location;
}
public Collection<TimeWindow> getTimeWindows() {
return timeWindows;
}
public double getServiceTime() {
return serviceTime;
}
}

View file

@ -23,6 +23,8 @@ import com.graphhopper.jsprit.core.problem.HasId;
import com.graphhopper.jsprit.core.problem.HasIndex; import com.graphhopper.jsprit.core.problem.HasIndex;
import com.graphhopper.jsprit.core.problem.Skills; import com.graphhopper.jsprit.core.problem.Skills;
import java.util.List;
/** /**
* Basic interface for all jobs. * Basic interface for all jobs.
* *
@ -36,23 +38,23 @@ public interface Job extends HasId, HasIndex {
* *
* @return id * @return id
*/ */
public String getId(); String getId();
/** /**
* Returns size, i.e. capacity-demand, of this job which can consist of an arbitrary number of capacity dimensions. * Returns size, i.e. capacity-demand, of this job which can consist of an arbitrary number of capacity dimensions.
* *
* @return Capacity * @return Capacity
*/ */
public Capacity getSize(); Capacity getSize();
public Skills getRequiredSkills(); Skills getRequiredSkills();
/** /**
* Returns name. * Returns name.
* *
* @return name * @return name
*/ */
public String getName(); String getName();
/** /**
* Get priority of job. Only 1 (very high) to 10 (very low) are allowed. * Get priority of job. Only 1 (very high) to 10 (very low) are allowed.
@ -61,8 +63,10 @@ public interface Job extends HasId, HasIndex {
* *
* @return priority * @return priority
*/ */
public int getPriority(); int getPriority();
public double getMaxTimeInVehicle(); double getMaxTimeInVehicle();
List<Activity> getActivities();
} }

View file

@ -26,7 +26,9 @@ import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindows;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindowsImpl; import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindowsImpl;
import com.graphhopper.jsprit.core.util.Coordinate; import com.graphhopper.jsprit.core.util.Coordinate;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
/** /**
* Service implementation of a job. * Service implementation of a job.
@ -93,6 +95,8 @@ public class Service extends AbstractJob {
protected double maxTimeInVehicle = Double.MAX_VALUE; protected double maxTimeInVehicle = Double.MAX_VALUE;
private Activity activity;
Builder(String id){ Builder(String id){
this.id = id; this.id = id;
timeWindows = new TimeWindowsImpl(); timeWindows = new TimeWindowsImpl();
@ -209,6 +213,7 @@ public class Service extends AbstractJob {
this.setType("service"); this.setType("service");
capacity = capacityBuilder.build(); capacity = capacityBuilder.build();
skills = skillBuilder.build(); skills = skillBuilder.build();
activity = new Activity.Builder(location, Activity.Type.SERVICE).setServiceTime(serviceTime).setTimeWindows(timeWindows.getTimeWindows()).build();
return (T) new Service(this); return (T) new Service(this);
} }
@ -282,6 +287,8 @@ public class Service extends AbstractJob {
private final double maxTimeInVehicle; private final double maxTimeInVehicle;
private List<Activity> activities = new ArrayList<>();
Service(Builder<?> builder) { Service(Builder<?> builder) {
setUserData(builder.userData); setUserData(builder.userData);
id = builder.id; id = builder.id;
@ -294,6 +301,7 @@ public class Service extends AbstractJob {
timeWindows = builder.timeWindows; timeWindows = builder.timeWindows;
priority = builder.priority; priority = builder.priority;
maxTimeInVehicle = builder.maxTimeInVehicle; maxTimeInVehicle = builder.maxTimeInVehicle;
activities.add(builder.activity);
} }
public Collection<TimeWindow> getTimeWindows(){ public Collection<TimeWindow> getTimeWindows(){
@ -414,4 +422,9 @@ public class Service extends AbstractJob {
return this.maxTimeInVehicle; return this.maxTimeInVehicle;
} }
@Override
public List<Activity> getActivities() {
return activities;
}
} }

View file

@ -24,7 +24,9 @@ import com.graphhopper.jsprit.core.problem.Skills;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow; import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindow;
import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindowsImpl; import com.graphhopper.jsprit.core.problem.solution.route.activity.TimeWindowsImpl;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List;
/** /**
@ -46,8 +48,6 @@ import java.util.Collection;
public class Shipment extends AbstractJob { public class Shipment extends AbstractJob {
/** /**
* Builder that builds the shipment. * Builder that builds the shipment.
* *
@ -89,6 +89,10 @@ public class Shipment extends AbstractJob {
public double maxTimeInVehicle = Double.MAX_VALUE; public double maxTimeInVehicle = Double.MAX_VALUE;
private Activity pickup;
private Activity delivery;
/** /**
* Returns new instance of this builder. * Returns new instance of this builder.
* *
@ -252,6 +256,8 @@ public class Shipment extends AbstractJob {
if (deliveryLocation_ == null) throw new IllegalArgumentException("The delivery location is missing."); if (deliveryLocation_ == null) throw new IllegalArgumentException("The delivery location is missing.");
capacity = capacityBuilder.build(); capacity = capacityBuilder.build();
skills = skillBuilder.build(); skills = skillBuilder.build();
pickup = new Activity.Builder(pickupLocation_, Activity.Type.PICKUP).setServiceTime(pickupServiceTime).setTimeWindows(pickupTimeWindows.getTimeWindows()).build();
delivery = new Activity.Builder(deliveryLocation_, Activity.Type.DELIVERY).setServiceTime(deliveryServiceTime).setTimeWindows(deliveryTimeWindows.getTimeWindows()).build();
return new Shipment(this); return new Shipment(this);
} }
@ -368,6 +374,8 @@ public class Shipment extends AbstractJob {
private final double maxTimeInVehicle; private final double maxTimeInVehicle;
private List<Activity> activities = new ArrayList<>();
Shipment(Builder builder) { Shipment(Builder builder) {
setUserData(builder.userData); setUserData(builder.userData);
this.id = builder.id; this.id = builder.id;
@ -382,6 +390,8 @@ public class Shipment extends AbstractJob {
this.pickupTimeWindows = builder.pickupTimeWindows; this.pickupTimeWindows = builder.pickupTimeWindows;
this.priority = builder.priority; this.priority = builder.priority;
this.maxTimeInVehicle = builder.maxTimeInVehicle; this.maxTimeInVehicle = builder.maxTimeInVehicle;
activities.add(builder.pickup);
activities.add(builder.delivery);
} }
@Override @Override
@ -520,4 +530,9 @@ public class Shipment extends AbstractJob {
public double getMaxTimeInVehicle() { public double getMaxTimeInVehicle() {
return maxTimeInVehicle; return maxTimeInVehicle;
} }
@Override
public List<Activity> getActivities() {
return activities;
}
} }

View file

@ -31,9 +31,9 @@ import com.graphhopper.jsprit.core.problem.job.Job;
*/ */
public interface TourActivity extends HasIndex { public interface TourActivity extends HasIndex {
public void setTheoreticalEarliestOperationStartTime(double earliest); void setTheoreticalEarliestOperationStartTime(double earliest);
public void setTheoreticalLatestOperationStartTime(double latest); void setTheoreticalLatestOperationStartTime(double latest);
/** /**
* Basic interface of job-activies. * Basic interface of job-activies.
@ -42,14 +42,14 @@ public interface TourActivity extends HasIndex {
* *
* @author schroeder * @author schroeder
*/ */
public interface JobActivity extends TourActivity { interface JobActivity extends TourActivity {
/** /**
* Returns the job that is involved with this activity. * Returns the job that is involved with this activity.
* *
* @return job * @return job
*/ */
public Job getJob(); Job getJob();
} }
@ -58,14 +58,14 @@ public interface TourActivity extends HasIndex {
* *
* @return name * @return name
*/ */
public abstract String getName(); String getName();
/** /**
* Returns location. * Returns location.
* *
* @return location * @return location
*/ */
public abstract Location getLocation(); Location getLocation();
/** /**
* Returns the theoretical earliest operation start time, which is the time that is just allowed * Returns the theoretical earliest operation start time, which is the time that is just allowed
@ -73,7 +73,7 @@ public interface TourActivity extends HasIndex {
* *
* @return earliest start time * @return earliest start time
*/ */
public abstract double getTheoreticalEarliestOperationStartTime(); double getTheoreticalEarliestOperationStartTime();
/** /**
* Returns the theoretical latest operation start time, which is the time that is just allowed * Returns the theoretical latest operation start time, which is the time that is just allowed
@ -81,7 +81,7 @@ public interface TourActivity extends HasIndex {
* *
* @return latest start time * @return latest start time
*/ */
public abstract double getTheoreticalLatestOperationStartTime(); double getTheoreticalLatestOperationStartTime();
/** /**
* Returns the operation-time this activity takes. * Returns the operation-time this activity takes.
@ -91,35 +91,35 @@ public interface TourActivity extends HasIndex {
* *
* @return operation time * @return operation time
*/ */
public abstract double getOperationTime(); double getOperationTime();
/** /**
* Returns the arrival-time of this activity. * Returns the arrival-time of this activity.
* *
* @return arrival time * @return arrival time
*/ */
public abstract double getArrTime(); double getArrTime();
/** /**
* Returns end-time of this activity. * Returns end-time of this activity.
* *
* @return end time * @return end time
*/ */
public abstract double getEndTime(); double getEndTime();
/** /**
* Sets the arrival time of that activity. * Sets the arrival time of that activity.
* *
* @param arrTime * @param arrTime
*/ */
public abstract void setArrTime(double arrTime); void setArrTime(double arrTime);
/** /**
* Sets the end-time of this activity. * Sets the end-time of this activity.
* *
* @param endTime * @param endTime
*/ */
public abstract void setEndTime(double endTime); void setEndTime(double endTime);
/** /**
* Returns the capacity-demand of that activity, in terms of what needs to be loaded or unloaded at * Returns the capacity-demand of that activity, in terms of what needs to be loaded or unloaded at
@ -127,13 +127,13 @@ public interface TourActivity extends HasIndex {
* *
* @return capacity * @return capacity
*/ */
public abstract Capacity getSize(); Capacity getSize();
/** /**
* Makes a deep copy of this activity. * Makes a deep copy of this activity.
* *
* @return copied activity * @return copied activity
*/ */
public abstract TourActivity duplicate(); TourActivity duplicate();
} }

View file

@ -22,7 +22,6 @@ import com.graphhopper.jsprit.analysis.toolbox.GraphStreamViewer.Label;
import com.graphhopper.jsprit.analysis.toolbox.Plotter; import com.graphhopper.jsprit.analysis.toolbox.Plotter;
import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm; import com.graphhopper.jsprit.core.algorithm.VehicleRoutingAlgorithm;
import com.graphhopper.jsprit.core.algorithm.box.Jsprit; import com.graphhopper.jsprit.core.algorithm.box.Jsprit;
import com.graphhopper.jsprit.core.algorithm.box.SchrimpfFactory;
import com.graphhopper.jsprit.core.problem.Location; import com.graphhopper.jsprit.core.problem.Location;
import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem; import com.graphhopper.jsprit.core.problem.VehicleRoutingProblem;
import com.graphhopper.jsprit.core.problem.job.Service; import com.graphhopper.jsprit.core.problem.job.Service;