mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
Compare commits
2 commits
267775d252
...
e4b5bbf5fa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4b5bbf5fa | ||
|
|
8ba60c061b |
4 changed files with 23 additions and 13 deletions
|
|
@ -21,6 +21,7 @@ package com.graphhopper.jsprit.core.algorithm.recreate;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
||||||
|
import com.graphhopper.jsprit.core.problem.constraint.HardConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardRouteConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.HardRouteConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext;
|
import com.graphhopper.jsprit.core.problem.misc.JobInsertionContext;
|
||||||
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
import com.graphhopper.jsprit.core.problem.solution.route.activity.TourActivity;
|
||||||
|
|
@ -45,17 +46,17 @@ abstract class AbstractInsertionCalculator implements JobInsertionCostsCalculato
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime, Collection<String> failedActivityConstraints, ConstraintManager constraintManager) {
|
ConstraintsStatus fulfilled(JobInsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime, Collection<HardConstraint> failedActivityConstraints, ConstraintManager constraintManager) {
|
||||||
ConstraintsStatus notFulfilled = null;
|
ConstraintsStatus notFulfilled = null;
|
||||||
List<String> failed = new ArrayList<>();
|
List<HardConstraint> failed = new ArrayList<>();
|
||||||
for (HardActivityConstraint c : constraintManager.getCriticalHardActivityConstraints()) {
|
for (HardActivityConstraint c : constraintManager.getCriticalHardActivityConstraints()) {
|
||||||
ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
||||||
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)) {
|
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)) {
|
||||||
failedActivityConstraints.add(c.getClass().getSimpleName());
|
failedActivityConstraints.add(c);
|
||||||
return status;
|
return status;
|
||||||
} else {
|
} else {
|
||||||
if (status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
if (status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
||||||
failed.add(c.getClass().getSimpleName());
|
failed.add(c);
|
||||||
notFulfilled = status;
|
notFulfilled = status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -68,11 +69,11 @@ abstract class AbstractInsertionCalculator implements JobInsertionCostsCalculato
|
||||||
for (HardActivityConstraint c : constraintManager.getHighPrioHardActivityConstraints()) {
|
for (HardActivityConstraint c : constraintManager.getHighPrioHardActivityConstraints()) {
|
||||||
ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
ConstraintsStatus status = c.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
||||||
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)) {
|
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK)) {
|
||||||
failedActivityConstraints.add(c.getClass().getSimpleName());
|
failedActivityConstraints.add(c);
|
||||||
return status;
|
return status;
|
||||||
} else {
|
} else {
|
||||||
if (status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
if (status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
||||||
failed.add(c.getClass().getSimpleName());
|
failed.add(c);
|
||||||
notFulfilled = status;
|
notFulfilled = status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -85,7 +86,7 @@ abstract class AbstractInsertionCalculator implements JobInsertionCostsCalculato
|
||||||
for (HardActivityConstraint constraint : constraintManager.getLowPrioHardActivityConstraints()) {
|
for (HardActivityConstraint constraint : constraintManager.getLowPrioHardActivityConstraints()) {
|
||||||
ConstraintsStatus status = constraint.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
ConstraintsStatus status = constraint.fulfilled(iFacts, prevAct, newAct, nextAct, prevActDepTime);
|
||||||
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK) || status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
if (status.equals(ConstraintsStatus.NOT_FULFILLED_BREAK) || status.equals(ConstraintsStatus.NOT_FULFILLED)) {
|
||||||
failedActivityConstraints.add(constraint.getClass().getSimpleName());
|
failedActivityConstraints.add(constraint);
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ package com.graphhopper.jsprit.core.algorithm.recreate;
|
||||||
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
||||||
|
import com.graphhopper.jsprit.core.problem.constraint.HardConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
||||||
|
|
@ -108,7 +109,7 @@ final class ServiceInsertionCalculator extends AbstractInsertionCalculator {
|
||||||
InsertionData noInsertion = checkRouteContraints(insertionContext, constraintManager);
|
InsertionData noInsertion = checkRouteContraints(insertionContext, constraintManager);
|
||||||
if (noInsertion != null) return noInsertion;
|
if (noInsertion != null) return noInsertion;
|
||||||
|
|
||||||
Collection<String> failedActivityConstraints = new ArrayList<>();
|
Collection<HardConstraint> failedActivityConstraints = new ArrayList<>();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
check soft constraints at route level
|
check soft constraints at route level
|
||||||
|
|
@ -167,7 +168,9 @@ final class ServiceInsertionCalculator extends AbstractInsertionCalculator {
|
||||||
}
|
}
|
||||||
if(insertionIndex == InsertionData.NO_INDEX) {
|
if(insertionIndex == InsertionData.NO_INDEX) {
|
||||||
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
||||||
emptyInsertionData.getFailedConstraintNames().addAll(failedActivityConstraints);
|
for (HardConstraint c : failedActivityConstraints) {
|
||||||
|
emptyInsertionData.addFailedConstrainName(c.getClass().getSimpleName());
|
||||||
|
}
|
||||||
return emptyInsertionData;
|
return emptyInsertionData;
|
||||||
}
|
}
|
||||||
InsertionData insertionData = new InsertionData(bestCost, InsertionData.NO_INDEX, insertionIndex, newVehicle, newDriver);
|
InsertionData insertionData = new InsertionData(bestCost, InsertionData.NO_INDEX, insertionIndex, newVehicle, newDriver);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ package com.graphhopper.jsprit.core.algorithm.recreate;
|
||||||
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
||||||
|
import com.graphhopper.jsprit.core.problem.constraint.HardConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
||||||
|
|
@ -128,7 +129,7 @@ final class ShipmentInsertionCalculator extends AbstractInsertionCalculator {
|
||||||
//pickupShipmentLoop
|
//pickupShipmentLoop
|
||||||
List<TourActivity> activities = currentRoute.getTourActivities().getActivities();
|
List<TourActivity> activities = currentRoute.getTourActivities().getActivities();
|
||||||
|
|
||||||
List<String> failedActivityConstraints = new ArrayList<>();
|
List<HardConstraint> failedActivityConstraints = new ArrayList<>();
|
||||||
while (!tourEnd) {
|
while (!tourEnd) {
|
||||||
TourActivity nextAct;
|
TourActivity nextAct;
|
||||||
if (i < activities.size()) {
|
if (i < activities.size()) {
|
||||||
|
|
@ -228,7 +229,9 @@ final class ShipmentInsertionCalculator extends AbstractInsertionCalculator {
|
||||||
}
|
}
|
||||||
if (pickupInsertionIndex == InsertionData.NO_INDEX) {
|
if (pickupInsertionIndex == InsertionData.NO_INDEX) {
|
||||||
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
||||||
emptyInsertionData.getFailedConstraintNames().addAll(failedActivityConstraints);
|
for (HardConstraint failed : failedActivityConstraints) {
|
||||||
|
emptyInsertionData.addFailedConstrainName(failed.getClass().getSimpleName());
|
||||||
|
}
|
||||||
return emptyInsertionData;
|
return emptyInsertionData;
|
||||||
}
|
}
|
||||||
InsertionData insertionData = new InsertionData(bestCost, pickupInsertionIndex, deliveryInsertionIndex, newVehicle, newDriver);
|
InsertionData insertionData = new InsertionData(bestCost, pickupInsertionIndex, deliveryInsertionIndex, newVehicle, newDriver);
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ package com.graphhopper.jsprit.core.algorithm.recreate;
|
||||||
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
import com.graphhopper.jsprit.core.problem.JobActivityFactory;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
import com.graphhopper.jsprit.core.problem.constraint.ConstraintManager;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
import com.graphhopper.jsprit.core.problem.constraint.HardActivityConstraint.ConstraintsStatus;
|
||||||
|
import com.graphhopper.jsprit.core.problem.constraint.HardConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftActivityConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
import com.graphhopper.jsprit.core.problem.constraint.SoftRouteConstraint;
|
||||||
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
import com.graphhopper.jsprit.core.problem.cost.VehicleRoutingActivityCosts;
|
||||||
|
|
@ -146,7 +147,7 @@ public final class ShipmentInsertionCalculatorFlex extends AbstractInsertionCalc
|
||||||
//pickupShipmentLoop
|
//pickupShipmentLoop
|
||||||
List<TourActivity> activities = currentRoute.getTourActivities().getActivities();
|
List<TourActivity> activities = currentRoute.getTourActivities().getActivities();
|
||||||
|
|
||||||
List<String> failedActivityConstraints = new ArrayList<>();
|
List<HardConstraint> failedActivityConstraints = new ArrayList<>();
|
||||||
while (!tourEnd) {
|
while (!tourEnd) {
|
||||||
TourActivity nextAct;
|
TourActivity nextAct;
|
||||||
if (i < activities.size()) {
|
if (i < activities.size()) {
|
||||||
|
|
@ -252,7 +253,9 @@ public final class ShipmentInsertionCalculatorFlex extends AbstractInsertionCalc
|
||||||
|
|
||||||
if (pickupInsertionIndex == InsertionData.NO_INDEX) {
|
if (pickupInsertionIndex == InsertionData.NO_INDEX) {
|
||||||
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
InsertionData emptyInsertionData = new InsertionData.NoInsertionFound();
|
||||||
emptyInsertionData.getFailedConstraintNames().addAll(failedActivityConstraints);
|
for (HardConstraint failed : failedActivityConstraints) {
|
||||||
|
emptyInsertionData.addFailedConstrainName(failed.getClass().getSimpleName());
|
||||||
|
}
|
||||||
return emptyInsertionData;
|
return emptyInsertionData;
|
||||||
}
|
}
|
||||||
InsertionData insertionData = new InsertionData(bestCost, pickupInsertionIndex, deliveryInsertionIndex, newVehicle, newDriver);
|
InsertionData insertionData = new InsertionData(bestCost, pickupInsertionIndex, deliveryInsertionIndex, newVehicle, newDriver);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue