skills) {
+ skillBuilder.addAllSkills(skills);
+ return this;
+ }
+
public Builder addAllRequiredSkills(Skills skills) {
- for (String s : skills.values()) {
- addRequiredSkill(s);
- }
+ addAllRequiredSkills(skills.values());
return this;
}
@@ -271,7 +277,7 @@ public class Shipment extends AbstractJob {
}
public Builder addDeliveryTimeWindow(TimeWindow timeWindow) {
- if(timeWindow == null) throw new IllegalArgumentException("time-window arg must not be null");
+ if (timeWindow == null) throw new IllegalArgumentException("The time window must not be null.");
if(!deliveryTimeWindowAdded){
deliveryTimeWindows = new TimeWindowsImpl();
deliveryTimeWindowAdded = true;
@@ -291,7 +297,7 @@ public class Shipment extends AbstractJob {
}
public Builder addPickupTimeWindow(TimeWindow timeWindow) {
- if(timeWindow == null) throw new IllegalArgumentException("time-window arg must not be null");
+ if (timeWindow == null) throw new IllegalArgumentException("The time window must not be null.");
if(!pickupTimeWindowAdded){
pickupTimeWindows = new TimeWindowsImpl();
pickupTimeWindowAdded = true;
@@ -319,7 +325,7 @@ public class Shipment extends AbstractJob {
*/
public Builder setPriority(int priority) {
if (priority < 1 || priority > 10)
- throw new IllegalArgumentException("incorrect priority. only 1 (very high) to 10 (very low) are allowed");
+ throw new IllegalArgumentException("The priority value is not valid. Only 1 (very high) to 10 (very low) are allowed.");
this.priority = priority;
return this;
}
@@ -331,7 +337,8 @@ public class Shipment extends AbstractJob {
* @return
*/
public Builder setMaxTimeInVehicle(double maxTimeInVehicle){
- if(maxTimeInVehicle < 0) throw new IllegalArgumentException("maxTimeInVehicle should be positive");
+ if (maxTimeInVehicle < 0)
+ throw new IllegalArgumentException("The maximum time in vehicle must be positive.");
this.maxTimeInVehicle = maxTimeInVehicle;
return this;
}
@@ -436,7 +443,7 @@ public class Shipment extends AbstractJob {
return pickupTimeWindows.getTimeWindows();
}
-
+
/**
* Returns a string with the shipment's attributes.
*
diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java
index f77f7b9c..0731abf2 100644
--- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java
+++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleImpl.java
@@ -24,6 +24,8 @@ import com.graphhopper.jsprit.core.problem.job.Break;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import java.util.Collection;
+
/**
* Implementation of {@link Vehicle}.
@@ -135,6 +137,7 @@ public class VehicleImpl extends AbstractVehicle {
private Builder(String id) {
super();
this.id = id;
+ if (id == null) throw new IllegalArgumentException("Vehicle id must not be null.");
}
/**
@@ -145,7 +148,7 @@ public class VehicleImpl extends AbstractVehicle {
* @throws IllegalArgumentException if type is null
*/
public Builder setType(VehicleType type) {
- if (type == null) throw new IllegalArgumentException("type cannot be null.");
+ if (type == null) throw new IllegalArgumentException("Vehicle type must not be null.");
this.type = type;
return this;
}
@@ -196,6 +199,8 @@ public class VehicleImpl extends AbstractVehicle {
* @return start location
*/
public Builder setStartLocation(Location startLocation) {
+ if (startLocation == null)
+ throw new IllegalArgumentException("Start location of vehicle " + id + " must not be null.");
this.startLocation = startLocation;
return this;
}
@@ -213,7 +218,7 @@ public class VehicleImpl extends AbstractVehicle {
*/
public Builder setEarliestStart(double earliest_startTime) {
if (earliest_startTime < 0)
- throw new IllegalArgumentException("earliest start of vehicle " + id + " must not be negative");
+ throw new IllegalArgumentException("The earliest start time of vehicle " + id + " must not be negative.");
this.earliestStart = earliest_startTime;
return this;
}
@@ -226,12 +231,19 @@ public class VehicleImpl extends AbstractVehicle {
*/
public Builder setLatestArrival(double latest_arrTime) {
if (latest_arrTime < 0)
- throw new IllegalArgumentException("latest arrival time of vehicle " + id + " must not be negative");
+ throw new IllegalArgumentException("The latest arrival time of vehicle " + id + " must not be negative.");
this.latestArrival = latest_arrTime;
return this;
}
+ public Builder addAllSkills(Collection skills) {
+ if (skills == null) throw new IllegalArgumentException("Skills of vehicle " + id + " must not be null");
+ skillBuilder.addAllSkills(skills);
+ return this;
+ }
+
public Builder addSkill(String skill) {
+ if (skill == null) throw new IllegalArgumentException("Skill of vehicle " + id + " must not be null");
skillBuilder.addSkill(skill);
return this;
}
@@ -254,17 +266,17 @@ public class VehicleImpl extends AbstractVehicle {
*/
public VehicleImpl build() {
if (latestArrival < earliestStart)
- throw new IllegalArgumentException("latest arrival of vehicle " + id + " must not be smaller than its start time");
+ throw new IllegalArgumentException("The latest arrival time of vehicle " + id + " must not be smaller than its start time.");
if (startLocation != null && endLocation != null) {
if (!startLocation.getId().equals(endLocation.getId()) && !returnToDepot)
- throw new IllegalArgumentException("this must not be. you specified both endLocationId and open-routes. this is contradictory.
" +
- "if you set endLocation, returnToDepot must be true. if returnToDepot is false, endLocationCoord must not be specified.");
+ throw new IllegalArgumentException("You specified both the end location and that the vehicle " + id + " does not need to return to its end location. This must not be. " +
+ "Either specify end location and return to depot or leave end location unspecified.");
}
if (startLocation != null && endLocation == null) {
endLocation = startLocation;
}
if (startLocation == null && endLocation == null)
- throw new IllegalArgumentException("vehicle requires startLocation. but neither locationId nor locationCoord nor startLocationId nor startLocationCoord has been set");
+ throw new IllegalArgumentException("Every vehicle requires a start location, but vehicle " + id + " does not have one.");
skills = skillBuilder.build();
return new VehicleImpl(this);
}
diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleTypeImpl.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleTypeImpl.java
index 3e8da61d..112c137c 100644
--- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleTypeImpl.java
+++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/problem/vehicle/VehicleTypeImpl.java
@@ -151,7 +151,8 @@ public class VehicleTypeImpl implements VehicleType {
* if velocity is smaller than zero
*/
public VehicleTypeImpl.Builder setMaxVelocity(double inMeterPerSeconds) {
- if (inMeterPerSeconds < 0.0) throw new IllegalArgumentException("velocity cannot be smaller than zero");
+ if (inMeterPerSeconds < 0.0)
+ throw new IllegalArgumentException("The velocity of a vehicle (type) cannot be smaller than zero.");
this.maxVelo = inMeterPerSeconds;
return this;
}
@@ -166,7 +167,7 @@ public class VehicleTypeImpl implements VehicleType {
* @throws IllegalArgumentException if fixedCost is smaller than zero
*/
public VehicleTypeImpl.Builder setFixedCost(double fixedCost) {
- if (fixedCost < 0.0) throw new IllegalArgumentException("fixed costs cannot be smaller than zero");
+ if (fixedCost < 0.0) throw new IllegalArgumentException("Fixed costs must not be smaller than zero.");
this.fixedCost = fixedCost;
return this;
}
@@ -181,7 +182,8 @@ public class VehicleTypeImpl implements VehicleType {
* @throws IllegalArgumentException if perDistance is smaller than zero
*/
public VehicleTypeImpl.Builder setCostPerDistance(double perDistance) {
- if (perDistance < 0.0) throw new IllegalArgumentException("cost per distance must not be smaller than zero");
+ if (perDistance < 0.0)
+ throw new IllegalArgumentException("Cost per distance must not be smaller than zero.");
this.perDistance = perDistance;
return this;
}
@@ -260,9 +262,9 @@ public class VehicleTypeImpl implements VehicleType {
* @throws IllegalArgumentException if capacity dimension is already set
*/
public Builder addCapacityDimension(int dimIndex, int dimVal) {
- if (dimVal < 0) throw new IllegalArgumentException("capacity value cannot be negative");
+ if (dimVal < 0) throw new IllegalArgumentException("The capacity value must not be negative.");
if (capacityDimensions != null)
- throw new IllegalArgumentException("either build your dimension with build your dimensions with " +
+ throw new IllegalArgumentException("Either build your dimension with build your dimensions with " +
"addCapacityDimension(int dimIndex, int dimVal) or set the already built dimensions with .setCapacityDimensions(Capacity capacity)." +
"You used both methods.");
dimensionAdded = true;
@@ -283,7 +285,7 @@ public class VehicleTypeImpl implements VehicleType {
*/
public Builder setCapacityDimensions(Capacity capacity) {
if (dimensionAdded)
- throw new IllegalArgumentException("either build your dimension with build your dimensions with " +
+ throw new IllegalArgumentException("Either build your dimension with build your dimensions with " +
"addCapacityDimension(int dimIndex, int dimVal) or set the already built dimensions with .setCapacityDimensions(Capacity capacity)." +
"You used both methods.");
this.capacityDimensions = capacity;
diff --git a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java
index 63dbf938..0ab34dec 100644
--- a/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java
+++ b/jsprit-core/src/main/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTracker.java
@@ -29,15 +29,19 @@ import java.util.*;
*/
public class UnassignedJobReasonTracker implements JobUnassignedListener {
+ private final static String NO_REASON = "cannot determine a particular reason";
+
public static String getMostLikelyFailedConstraintName(Frequency failedConstraintNamesFrequency) {
- if (failedConstraintNamesFrequency == null) return "no reason found";
+ if (failedConstraintNamesFrequency == null || failedConstraintNamesFrequency.getUniqueCount() == 0)
+ return NO_REASON;
Iterator, Long>> entryIterator = failedConstraintNamesFrequency.entrySetIterator();
- int maxCount = 0;
+ long maxCount = 0;
String mostLikely = null;
while (entryIterator.hasNext()) {
Map.Entry, Long> entry = entryIterator.next();
if (entry.getValue() > maxCount) {
Comparable> key = entry.getKey();
+ maxCount = entry.getValue();
mostLikely = key.toString();
}
}
@@ -53,6 +57,7 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener {
Set failedConstraintNamesToBeIgnored = new HashSet<>();
public UnassignedJobReasonTracker() {
+ codesToHumanReadableReason.put(-1, NO_REASON);
codesToHumanReadableReason.put(1, "cannot serve required skill");
codesToHumanReadableReason.put(2, "cannot be visited within time window");
codesToHumanReadableReason.put(3, "does not fit into any vehicle due to capacity");
@@ -164,8 +169,9 @@ public class UnassignedJobReasonTracker implements JobUnassignedListener {
* @return
*/
public String getMostLikelyReason(String jobId) {
- if (!this.failedConstraintNamesFrequencyMapping.containsKey(jobId)) return "no reason found";
+ if (!this.failedConstraintNamesFrequencyMapping.containsKey(jobId)) return codesToHumanReadableReason.get(-1);
Frequency reasons = this.failedConstraintNamesFrequencyMapping.get(jobId);
+
String mostLikelyReason = getMostLikelyFailedConstraintName(reasons);
int code = toCode(mostLikelyReason);
if (code == -1) return mostLikelyReason;
diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/MaxTimeInVehicle_IT.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/MaxTimeInVehicle_IT.java
index 18285a11..a592b9da 100644
--- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/MaxTimeInVehicle_IT.java
+++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/MaxTimeInVehicle_IT.java
@@ -54,10 +54,11 @@ public class MaxTimeInVehicle_IT {
StateManager stateManager = new StateManager(vrp);
StateId id = stateManager.createStateId("max-time");
- stateManager.addStateUpdater(new UpdateMaxTimeInVehicle(stateManager,id,vrp.getTransportCosts(),vrp.getActivityCosts()));
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
+ stateManager.addStateUpdater(new UpdateMaxTimeInVehicle(stateManager, id, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId));
ConstraintManager constraintManager = new ConstraintManager(vrp,stateManager);
- constraintManager.addConstraint(new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts(),id,stateManager, vrp), ConstraintManager.Priority.CRITICAL);
+ constraintManager.addConstraint(new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), id, stateManager, vrp, openJobsId), ConstraintManager.Priority.CRITICAL);
VehicleRoutingAlgorithm vra = Jsprit.Builder.newInstance(vrp).setStateAndConstraintManager(stateManager,constraintManager).buildAlgorithm();
VehicleRoutingProblemSolution solution = Solutions.bestOf(vra.searchSolutions());
diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/state/UpdateMaxTimeInVehicleTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/state/UpdateMaxTimeInVehicleTest.java
index f39164d1..75aaf145 100644
--- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/state/UpdateMaxTimeInVehicleTest.java
+++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/algorithm/state/UpdateMaxTimeInVehicleTest.java
@@ -30,15 +30,12 @@ import com.graphhopper.jsprit.core.problem.vehicle.Vehicle;
import com.graphhopper.jsprit.core.problem.vehicle.VehicleImpl;
import com.graphhopper.jsprit.core.problem.vehicle.VehicleType;
import com.graphhopper.jsprit.core.problem.vehicle.VehicleTypeImpl;
-
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
/**
* Created by schroeder on 15/09/16.
@@ -61,7 +58,9 @@ public class UpdateMaxTimeInVehicleTest {
private StateManager stateManager;
- private StateId latestStartId;
+ private StateId minSlackId;
+
+ private StateId openJobsId;
@Before
public void doBefore() {
@@ -107,12 +106,13 @@ public class UpdateMaxTimeInVehicleTest {
stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(),vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(route), null);
- latestStartId = stateManager.createStateId("slack-time-id");
+ minSlackId = stateManager.createStateId("min-slack-id");
+ openJobsId = stateManager.createStateId("open-jobs-id");
// Map maxTimes = new HashMap<>();
// maxTimes.put("s",40d);
// maxTimes.put("shipment",20d);
- maxTimeInVehicleConstraint = new UpdateMaxTimeInVehicle(stateManager, latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ maxTimeInVehicleConstraint = new UpdateMaxTimeInVehicle(stateManager, minSlackId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
maxTimeInVehicleConstraint.setVehiclesToUpdate(new UpdateVehicleDependentPracticalTimeWindows.VehiclesToUpdate() {
@Override
public Collection get(VehicleRoute route) {
@@ -128,23 +128,23 @@ public class UpdateMaxTimeInVehicleTest {
// for(TourActivity act : route.getActivities()){
// String jobId = ((TourActivity.JobActivity)act).getJob().getId();
// if(jobId.equals("s4")){
-// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), minSlackId,Double.class);
// Assert.assertEquals(40, slackTime, 0.001);
// }
// if(jobId.equals("s3")){
-// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), minSlackId,Double.class);
// Assert.assertEquals(30, slackTime, 0.001);
// }
// if(jobId.equals("s2")){
-// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), minSlackId,Double.class);
// Assert.assertEquals(20, slackTime, 0.001);
// }
// if(jobId.equals("s")){
-// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,route.getVehicle(), minSlackId,Double.class);
// Assert.assertEquals(Double.MAX_VALUE, slackTime, 0.001);
// }
// }
-// Double slackTime = stateManager.getRouteState(route,route.getVehicle(), latestStartId,Double.class);
+// Double slackTime = stateManager.getRouteState(route,route.getVehicle(), minSlackId,Double.class);
// Assert.assertNotNull(slackTime);
// Assert.assertEquals(50,slackTime,0.001);
// }
@@ -155,23 +155,23 @@ public class UpdateMaxTimeInVehicleTest {
// for(TourActivity act : route.getActivities()){
// String jobId = ((TourActivity.JobActivity)act).getJob().getId();
// if(jobId.equals("s4")){
-// Double slackTime = stateManager.getActivityState(act,vehicle2, latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,vehicle2, minSlackId,Double.class);
// Assert.assertEquals(40, slackTime, 0.001);
// }
// if(jobId.equals("s3")){
-// Double slackTime = stateManager.getActivityState(act,vehicle2, latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,vehicle2, minSlackId,Double.class);
// Assert.assertEquals(30, slackTime, 0.001);
// }
// if(jobId.equals("s2")){
-// Double slackTime = stateManager.getActivityState(act,vehicle2, latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,vehicle2, minSlackId,Double.class);
// Assert.assertEquals(20, slackTime, 0.001);
// }
// if(jobId.equals("s")){
-// Double slackTime = stateManager.getActivityState(act,vehicle2, latestStartId,Double.class);
+// Double slackTime = stateManager.getActivityState(act,vehicle2, minSlackId,Double.class);
// Assert.assertEquals(Double.MAX_VALUE, slackTime, 0.001);
// }
// }
-// Double slackTime = stateManager.getRouteState(route,vehicle2, latestStartId,Double.class);
+// Double slackTime = stateManager.getRouteState(route,vehicle2, minSlackId,Double.class);
// Assert.assertNotNull(slackTime);
// Assert.assertEquals(40,slackTime,0.001);
// }
@@ -182,17 +182,17 @@ public class UpdateMaxTimeInVehicleTest {
for(TourActivity act : route2.getActivities()){
String jobId = ((TourActivity.JobActivity)act).getJob().getId();
if(jobId.equals("d1")){
- Double slackTime = stateManager.getActivityState(act,v, latestStartId,Double.class);
+ Double slackTime = stateManager.getActivityState(act, v, minSlackId, Double.class);
Assert.assertEquals(Double.MAX_VALUE, slackTime, 0.001);
}
if(jobId.equals("shipment")){
if(act instanceof PickupActivity){
- Double slackTime = stateManager.getActivityState(act,v, latestStartId,Double.class);
+ Double slackTime = stateManager.getActivityState(act, v, minSlackId, Double.class);
Assert.assertEquals(Double.MAX_VALUE, slackTime, 0.001);
}
else{
- Double slackTime = stateManager.getActivityState(act,v, latestStartId,Double.class);
- Assert.assertEquals(40, slackTime, 0.001);
+ Double slackTime = stateManager.getActivityState(act, v, minSlackId, Double.class);
+ Assert.assertEquals(0, slackTime, 0.001);
}
}
diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/constraint/MaxTimeInVehicleConstraintTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/constraint/MaxTimeInVehicleConstraintTest.java
index 3e96ef7c..95def3f0 100644
--- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/constraint/MaxTimeInVehicleConstraintTest.java
+++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/problem/constraint/MaxTimeInVehicleConstraintTest.java
@@ -20,6 +20,7 @@ package com.graphhopper.jsprit.core.problem.constraint;
import com.graphhopper.jsprit.core.algorithm.state.StateId;
import com.graphhopper.jsprit.core.algorithm.state.StateManager;
+import com.graphhopper.jsprit.core.algorithm.state.UpdateActivityTimes;
import com.graphhopper.jsprit.core.algorithm.state.UpdateMaxTimeInVehicle;
import com.graphhopper.jsprit.core.problem.AbstractActivity;
import com.graphhopper.jsprit.core.problem.Location;
@@ -112,13 +113,15 @@ public class MaxTimeInVehicleConstraintTest {
.addPickup(s1).addDelivery(s1).build();
StateManager stateManager = new StateManager(vrp);
- StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId minSlackId = stateManager.createStateId("min-slack-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, minSlackId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(route),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), minSlackId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(route,s2,v,route.getDriver(),0.);
List acts = vrp.getActivities(s2);
@@ -126,7 +129,7 @@ public class MaxTimeInVehicleConstraintTest {
c.getAssociatedActivities().add(acts.get(1));
Assert.assertEquals(HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, route.getStart(), acts.get(0), route.getActivities().get(0), 0));
- Assert.assertEquals(HardActivityConstraint.ConstraintsStatus.NOT_FULFILLED, constraint.fulfilled(c, act(route,0), acts.get(0), act(route,1), 20));
+ Assert.assertEquals(HardActivityConstraint.ConstraintsStatus.NOT_FULFILLED, constraint.fulfilled(c, act(route, 0), acts.get(0), act(route, 1), 20));
Assert.assertEquals(HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, act(route,1), acts.get(0), route.getEnd(), 40));
//insert pickup at 0
@@ -148,12 +151,14 @@ public class MaxTimeInVehicleConstraintTest {
ini(30d, Double.MAX_VALUE, Double.MAX_VALUE);
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(route),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(route,d2,v,route.getDriver(),0.);
List acts = vrp.getActivities(d2);
c.getAssociatedActivities().add(acts.get(0));
@@ -165,24 +170,67 @@ public class MaxTimeInVehicleConstraintTest {
}
+ @Test
+ public void insertingD2JustAfterStartShouldWork() {
+ ini(20d, 30, Double.MAX_VALUE);
+
+ StateManager stateManager = new StateManager(vrp);
+ StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
+
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
+ stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
+ stateManager.informInsertionStarts(Arrays.asList(route), new ArrayList());
+
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
+ JobInsertionContext c = new JobInsertionContext(route, d2, v, route.getDriver(), 0.);
+ List acts = vrp.getActivities(d2);
+ c.getAssociatedActivities().add(acts.get(0));
+
+ Assert.assertEquals("inserting d2 just after start should work", HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, route.getStart(), acts.get(0), route.getActivities().get(0), 0));
+ }
+
+ @Test
+ public void insertingD2AfterFirstDeliveryShouldWork() {
+ ini(20d, 30, Double.MAX_VALUE);
+
+ StateManager stateManager = new StateManager(vrp);
+ StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
+
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
+ stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
+ stateManager.informInsertionStarts(Arrays.asList(route), new ArrayList());
+
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
+ JobInsertionContext c = new JobInsertionContext(route, d2, v, route.getDriver(), 0.);
+ List acts = vrp.getActivities(d2);
+ c.getAssociatedActivities().add(acts.get(0));
+
+
+ Assert.assertEquals("inserting d2 after first delivery should work", HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, route.getActivities().get(0), acts.get(0), route.getActivities().get(1), 10));
+ }
+
@Test
public void insertingDeliveryInBetweenShipmentShouldFail(){
ini(20d, 30, Double.MAX_VALUE);
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(),vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(route),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(route,d2,v,route.getDriver(),0.);
List acts = vrp.getActivities(d2);
c.getAssociatedActivities().add(acts.get(0));
- Assert.assertEquals("inserting d2 just after start should work", HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, route.getStart(), acts.get(0), route.getActivities().get(0), 0));
- Assert.assertEquals("inserting d2 after first delivery should work", HardActivityConstraint.ConstraintsStatus.FULFILLED, constraint.fulfilled(c, route.getActivities().get(0), acts.get(0), route.getActivities().get(1), 10));
Assert.assertEquals("inserting d2 between pickup and delivery shipment should fail due to max-in-vehicle constraint of shipment", HardActivityConstraint.ConstraintsStatus.NOT_FULFILLED, constraint.fulfilled(c, route.getActivities().get(1), acts.get(0), route.getActivities().get(2), 20));
Assert.assertEquals("inserting d2 at end should fail", HardActivityConstraint.ConstraintsStatus.NOT_FULFILLED, constraint.fulfilled(c, route.getActivities().get(2), acts.get(0), route.getEnd(), 40));
}
@@ -197,12 +245,14 @@ public class MaxTimeInVehicleConstraintTest {
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(r),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(r, s1,v,r.getDriver(),0.);
List acts = vrp.getActivities(s1);
c.getAssociatedActivities().add(acts.get(0));
@@ -223,12 +273,14 @@ public class MaxTimeInVehicleConstraintTest {
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(r), new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(r, s1, v, r.getDriver(), 0.);
List acts = vrp.getActivities(s1);
c.getAssociatedActivities().add(acts.get(0));
@@ -250,12 +302,14 @@ public class MaxTimeInVehicleConstraintTest {
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(r), new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(r, s1, v, r.getDriver(), 0.);
List acts = vrp.getActivities(s1);
c.getAssociatedActivities().add(acts.get(0));
@@ -308,12 +362,14 @@ public class MaxTimeInVehicleConstraintTest {
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(r),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(r, s1,v,r.getDriver(),0.);
List acts = vrp.getActivities(s1);
c.getAssociatedActivities().add(acts.get(0));
@@ -337,14 +393,16 @@ public class MaxTimeInVehicleConstraintTest {
StateManager stateManager = new StateManager(vrp);
StateId latestStartId = stateManager.createStateId("latest-start-id");
+ StateId openJobsId = stateManager.createStateId("open-jobs-id");
Map maxTimes = new HashMap<>();
maxTimes.put("s1",25d);
- UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager,latestStartId,vrp.getTransportCosts(), vrp.getActivityCosts());
+ UpdateMaxTimeInVehicle updater = new UpdateMaxTimeInVehicle(stateManager, latestStartId, vrp.getTransportCosts(), vrp.getActivityCosts(), openJobsId);
stateManager.addStateUpdater(updater);
+ stateManager.addStateUpdater(new UpdateActivityTimes(vrp.getTransportCosts(), vrp.getActivityCosts()));
stateManager.informInsertionStarts(Arrays.asList(r),new ArrayList());
- MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(),vrp.getActivityCosts() , latestStartId, stateManager, vrp);
+ MaxTimeInVehicleConstraint constraint = new MaxTimeInVehicleConstraint(vrp.getTransportCosts(), vrp.getActivityCosts(), latestStartId, stateManager, vrp, openJobsId);
JobInsertionContext c = new JobInsertionContext(r, s1,v,r.getDriver(),0.);
List acts = vrp.getActivities(s1);
c.getAssociatedActivities().add(acts.get(0));
diff --git a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java
index 7b975e9a..0b8f639f 100644
--- a/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java
+++ b/jsprit-core/src/test/java/com/graphhopper/jsprit/core/util/UnassignedJobReasonTrackerTest.java
@@ -134,6 +134,19 @@ public class UnassignedJobReasonTrackerTest {
Assert.assertEquals(4, reasonTracker.getMostLikelyReasonCode(solution.getUnassignedJobs().iterator().next().getId()));
}
+ @Test
+ public void getMostLikelyTest() {
+ Frequency frequency = new Frequency();
+ frequency.addValue("a");
+ frequency.addValue("b");
+ frequency.addValue("a");
+ frequency.addValue("a");
+ frequency.addValue("a");
+ frequency.addValue("a");
+ frequency.addValue("a");
+ Assert.assertEquals("a", UnassignedJobReasonTracker.getMostLikelyFailedConstraintName(frequency));
+ }
+
@Test
public void testFreq() {
Frequency frequency = new Frequency();