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

constraints and example

This commit is contained in:
oblonski 2013-11-07 06:39:24 +01:00
parent 690bcb532a
commit 0936d461f5
4 changed files with 6191 additions and 27 deletions

View file

@ -25,8 +25,12 @@ import basics.Delivery;
import basics.Pickup; import basics.Pickup;
import basics.Service; import basics.Service;
import basics.costs.VehicleRoutingTransportCosts; import basics.costs.VehicleRoutingTransportCosts;
import basics.route.DeliverService;
import basics.route.DeliverShipment;
import basics.route.DeliveryActivity; import basics.route.DeliveryActivity;
import basics.route.PickupActivity; import basics.route.PickupActivity;
import basics.route.PickupService;
import basics.route.PickupShipment;
import basics.route.ServiceActivity; import basics.route.ServiceActivity;
import basics.route.Start; import basics.route.Start;
import basics.route.TourActivity; import basics.route.TourActivity;
@ -222,13 +226,28 @@ class HardConstraints {
private StateManager stateManager; private StateManager stateManager;
private boolean backhaul = false;
public HardPickupAndDeliveryActivityLevelConstraint(StateManager stateManager) { public HardPickupAndDeliveryActivityLevelConstraint(StateManager stateManager) {
super(); super();
this.stateManager = stateManager; this.stateManager = stateManager;
} }
public HardPickupAndDeliveryActivityLevelConstraint(StateManager stateManager, boolean backhaul) {
super();
this.stateManager = stateManager;
this.backhaul = backhaul;
}
@Override @Override
public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
if(!(newAct instanceof PickupService) && !(newAct instanceof DeliverService)){
return true;
}
if(backhaul){
if(newAct instanceof PickupService && nextAct instanceof DeliverService){ return false; }
if(newAct instanceof DeliverService && prevAct instanceof PickupService){ return false; }
}
int loadAtPrevAct; int loadAtPrevAct;
int futurePicks; int futurePicks;
int pastDeliveries; int pastDeliveries;
@ -242,12 +261,12 @@ class HardConstraints {
futurePicks = (int) stateManager.getActivityState(prevAct, StateTypes.FUTURE_PICKS).toDouble(); futurePicks = (int) stateManager.getActivityState(prevAct, StateTypes.FUTURE_PICKS).toDouble();
pastDeliveries = (int) stateManager.getActivityState(prevAct, StateTypes.PAST_DELIVERIES).toDouble(); pastDeliveries = (int) stateManager.getActivityState(prevAct, StateTypes.PAST_DELIVERIES).toDouble();
} }
if(newAct instanceof PickupActivity || newAct instanceof ServiceActivity){ if(newAct instanceof PickupService){
if(loadAtPrevAct + newAct.getCapacityDemand() + futurePicks > iFacts.getNewVehicle().getCapacity()){ if(loadAtPrevAct + newAct.getCapacityDemand() + futurePicks > iFacts.getNewVehicle().getCapacity()){
return false; return false;
} }
} }
if(newAct instanceof DeliveryActivity){ if(newAct instanceof DeliverService){
if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) + pastDeliveries > iFacts.getNewVehicle().getCapacity()){ if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) + pastDeliveries > iFacts.getNewVehicle().getCapacity()){
return false; return false;
} }
@ -258,6 +277,62 @@ class HardConstraints {
} }
static class HardPickupAndDeliveryShipmentActivityLevelConstraint implements HardActivityLevelConstraint {
private StateManager stateManager;
private boolean backhaul = false;
public HardPickupAndDeliveryShipmentActivityLevelConstraint(StateManager stateManager) {
super();
this.stateManager = stateManager;
}
public HardPickupAndDeliveryShipmentActivityLevelConstraint(StateManager stateManager, boolean backhaul) {
super();
this.stateManager = stateManager;
this.backhaul = backhaul;
}
@Override
public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
if(!(newAct instanceof PickupShipment) && !(newAct instanceof DeliverShipment)){
return true;
}
if(backhaul){
// if(newAct instanceof PickupShipment && nextAct instanceof DeliverShipment){ return false; }
if(newAct instanceof DeliverShipment && prevAct instanceof PickupShipment){ return false; }
}
int loadAtPrevAct;
// int futurePicks;
// int pastDeliveries;
if(prevAct instanceof Start){
loadAtPrevAct = (int)stateManager.getRouteState(iFacts.getRoute(), StateTypes.LOAD_AT_DEPOT).toDouble();
// futurePicks = (int)stateManager.getRouteState(iFacts.getRoute(), StateTypes.LOAD).toDouble();
// pastDeliveries = 0;
}
else{
loadAtPrevAct = (int) stateManager.getActivityState(prevAct, StateTypes.LOAD).toDouble();
// futurePicks = (int) stateManager.getActivityState(prevAct, StateTypes.FUTURE_PICKS).toDouble();
// pastDeliveries = (int) stateManager.getActivityState(prevAct, StateTypes.PAST_DELIVERIES).toDouble();
}
if(newAct instanceof PickupShipment){
if(loadAtPrevAct + newAct.getCapacityDemand() > iFacts.getNewVehicle().getCapacity()){
return false;
}
}
if(newAct instanceof DeliverShipment){
if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) > iFacts.getNewVehicle().getCapacity()){
return false;
}
}
return true;
}
}
static class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivityLevelConstraint { static class HardPickupAndDeliveryBackhaulActivityLevelConstraint implements HardActivityLevelConstraint {
private StateManager stateManager; private StateManager stateManager;
@ -269,10 +344,10 @@ class HardConstraints {
@Override @Override
public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) { public boolean fulfilled(InsertionContext iFacts, TourActivity prevAct, TourActivity newAct, TourActivity nextAct, double prevActDepTime) {
if(newAct instanceof PickupActivity && nextAct instanceof DeliveryActivity){ return false; } if(newAct instanceof PickupService && nextAct instanceof DeliverService){ return false; }
if(newAct instanceof ServiceActivity && nextAct instanceof DeliveryActivity){ return false; } // if(newAct instanceof ServiceActivity && nextAct instanceof DeliveryActivity){ return false; }
if(newAct instanceof DeliveryActivity && prevAct instanceof PickupActivity){ return false; } if(newAct instanceof DeliverService && prevAct instanceof PickupService){ return false; }
if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return false; } // if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return false; }
int loadAtPrevAct; int loadAtPrevAct;
int futurePicks; int futurePicks;
int pastDeliveries; int pastDeliveries;

View file

@ -22,7 +22,6 @@ import org.apache.log4j.Logger;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import util.Coordinate;
import util.Solutions; import util.Solutions;
import algorithms.HardConstraints.HardActivityLevelConstraintManager; import algorithms.HardConstraints.HardActivityLevelConstraintManager;
import algorithms.StateManager.StateImpl; import algorithms.StateManager.StateImpl;
@ -45,12 +44,10 @@ import basics.algo.JobInsertedListener;
import basics.algo.SearchStrategy; import basics.algo.SearchStrategy;
import basics.algo.SearchStrategyManager; import basics.algo.SearchStrategyManager;
import basics.algo.SolutionCostCalculator; import basics.algo.SolutionCostCalculator;
import basics.io.VrpXMLReader;
import basics.io.VrpXMLWriter;
import basics.route.TourActivity; import basics.route.TourActivity;
import basics.route.Vehicle;
import basics.route.VehicleImpl;
import basics.route.VehicleRoute; import basics.route.VehicleRoute;
import basics.route.VehicleType;
import basics.route.VehicleTypeImpl;
public class BuildPDVRPWithShipmentsAlgoFromScratchTest { public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
@ -64,26 +61,27 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
public void setup(){ public void setup(){
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
new VrpXMLReader(builder).read("src/test/resources/C101_solomon_pd.xml");
VehicleType type = VehicleTypeImpl.Builder.newInstance("t", 2).setCostPerDistance(1.0).build(); // VehicleType type = VehicleTypeImpl.Builder.newInstance("t", 2).setCostPerDistance(1.0).build();
Vehicle v = VehicleImpl.Builder.newInstance("v").setLocationCoord(Coordinate.newInstance(-1, -1)).setType(type).build(); // Vehicle v = VehicleImpl.Builder.newInstance("v").setLocationCoord(Coordinate.newInstance(-1, -1)).setType(type).build();
//
Shipment s1 = Shipment.Builder.newInstance("s1", 1).setPickupCoord(Coordinate.newInstance(0, 0)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); // Shipment s1 = Shipment.Builder.newInstance("s1", 1).setPickupCoord(Coordinate.newInstance(0, 0)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build();
Shipment s2 = Shipment.Builder.newInstance("s2", 1).setPickupCoord(Coordinate.newInstance(1, 1)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build(); // Shipment s2 = Shipment.Builder.newInstance("s2", 1).setPickupCoord(Coordinate.newInstance(1, 1)).setDeliveryCoord(Coordinate.newInstance(10, 10)).build();
//
Service serv1 = Service.Builder.newInstance("serv1", 1).setCoord(Coordinate.newInstance(0, 5)).build(); // Service serv1 = Service.Builder.newInstance("serv1", 1).setCoord(Coordinate.newInstance(0, 5)).build();
Service serv2 = Service.Builder.newInstance("serv2", 1).setCoord(Coordinate.newInstance(5, 0)).build(); // Service serv2 = Service.Builder.newInstance("serv2", 1).setCoord(Coordinate.newInstance(5, 0)).build();
//
builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2); // builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2);
builder.addVehicle(v); // builder.addVehicle(v);
vrp = builder.build(); vrp = builder.build();
final StateManagerImpl stateManager = new StateManagerImpl(); final StateManagerImpl stateManager = new StateManagerImpl();
HardActivityLevelConstraintManager actLevelConstraintAccumulator = new HardActivityLevelConstraintManager(); HardActivityLevelConstraintManager actLevelConstraintAccumulator = new HardActivityLevelConstraintManager();
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager));
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts())); actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardTimeWindowActivityLevelConstraint(stateManager, vrp.getTransportCosts()));
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager));
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryShipmentActivityLevelConstraint(stateManager));
ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator); ActivityInsertionCostsCalculator marginalCalculus = new LocalActivityInsertionCostsCalculator(vrp.getTransportCosts(), vrp.getActivityCosts(), actLevelConstraintAccumulator);
@ -200,8 +198,8 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size()); // System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size());
vra.addInitialSolution(iniSolution); vra.addInitialSolution(iniSolution);
vra.setNuOfIterations(10000); vra.setNuOfIterations(1000);
vra.setPrematureBreak(1000); vra.setPrematureBreak(100);
} }
@ -222,7 +220,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
// for() // for()
// new VrpXMLWriter(vrp, solutions).write("output/pd_solomon_r101.xml"); new VrpXMLWriter(vrp, solutions).write("src/test/resources/pd_solomon_c101_sol.xml");
} }

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff