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:
parent
690bcb532a
commit
0936d461f5
4 changed files with 6191 additions and 27 deletions
|
|
@ -25,8 +25,12 @@ import basics.Delivery;
|
|||
import basics.Pickup;
|
||||
import basics.Service;
|
||||
import basics.costs.VehicleRoutingTransportCosts;
|
||||
import basics.route.DeliverService;
|
||||
import basics.route.DeliverShipment;
|
||||
import basics.route.DeliveryActivity;
|
||||
import basics.route.PickupActivity;
|
||||
import basics.route.PickupService;
|
||||
import basics.route.PickupShipment;
|
||||
import basics.route.ServiceActivity;
|
||||
import basics.route.Start;
|
||||
import basics.route.TourActivity;
|
||||
|
|
@ -222,13 +226,28 @@ class HardConstraints {
|
|||
|
||||
private StateManager stateManager;
|
||||
|
||||
private boolean backhaul = false;
|
||||
|
||||
public HardPickupAndDeliveryActivityLevelConstraint(StateManager stateManager) {
|
||||
super();
|
||||
this.stateManager = stateManager;
|
||||
}
|
||||
|
||||
public HardPickupAndDeliveryActivityLevelConstraint(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 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 futurePicks;
|
||||
int pastDeliveries;
|
||||
|
|
@ -242,12 +261,12 @@ class HardConstraints {
|
|||
futurePicks = (int) stateManager.getActivityState(prevAct, StateTypes.FUTURE_PICKS).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()){
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if(newAct instanceof DeliveryActivity){
|
||||
if(newAct instanceof DeliverService){
|
||||
if(loadAtPrevAct + Math.abs(newAct.getCapacityDemand()) + pastDeliveries > iFacts.getNewVehicle().getCapacity()){
|
||||
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 {
|
||||
|
||||
private StateManager stateManager;
|
||||
|
|
@ -269,10 +344,10 @@ class HardConstraints {
|
|||
|
||||
@Override
|
||||
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 ServiceActivity && nextAct instanceof DeliveryActivity){ return false; }
|
||||
if(newAct instanceof DeliveryActivity && prevAct instanceof PickupActivity){ return false; }
|
||||
if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return false; }
|
||||
if(newAct instanceof PickupService && nextAct instanceof DeliverService){ return false; }
|
||||
// if(newAct instanceof ServiceActivity && nextAct instanceof DeliveryActivity){ return false; }
|
||||
if(newAct instanceof DeliverService && prevAct instanceof PickupService){ return false; }
|
||||
// if(newAct instanceof DeliveryActivity && prevAct instanceof ServiceActivity){ return false; }
|
||||
int loadAtPrevAct;
|
||||
int futurePicks;
|
||||
int pastDeliveries;
|
||||
|
|
|
|||
|
|
@ -22,7 +22,6 @@ import org.apache.log4j.Logger;
|
|||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import util.Coordinate;
|
||||
import util.Solutions;
|
||||
import algorithms.HardConstraints.HardActivityLevelConstraintManager;
|
||||
import algorithms.StateManager.StateImpl;
|
||||
|
|
@ -45,12 +44,10 @@ import basics.algo.JobInsertedListener;
|
|||
import basics.algo.SearchStrategy;
|
||||
import basics.algo.SearchStrategyManager;
|
||||
import basics.algo.SolutionCostCalculator;
|
||||
import basics.io.VrpXMLReader;
|
||||
import basics.io.VrpXMLWriter;
|
||||
import basics.route.TourActivity;
|
||||
import basics.route.Vehicle;
|
||||
import basics.route.VehicleImpl;
|
||||
import basics.route.VehicleRoute;
|
||||
import basics.route.VehicleType;
|
||||
import basics.route.VehicleTypeImpl;
|
||||
|
||||
public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
||||
|
||||
|
|
@ -64,26 +61,27 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
public void setup(){
|
||||
|
||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
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();
|
||||
|
||||
builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2);
|
||||
builder.addVehicle(v);
|
||||
new VrpXMLReader(builder).read("src/test/resources/C101_solomon_pd.xml");
|
||||
// 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();
|
||||
//
|
||||
// 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();
|
||||
//
|
||||
// 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();
|
||||
//
|
||||
// builder.addJob(s1).addJob(s2).addJob(serv1).addJob(serv2);
|
||||
// builder.addVehicle(v);
|
||||
|
||||
vrp = builder.build();
|
||||
|
||||
final StateManagerImpl stateManager = new StateManagerImpl();
|
||||
|
||||
HardActivityLevelConstraintManager actLevelConstraintAccumulator = new HardActivityLevelConstraintManager();
|
||||
actLevelConstraintAccumulator.addConstraint(new HardConstraints.HardPickupAndDeliveryActivityLevelConstraint(stateManager));
|
||||
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);
|
||||
|
||||
|
|
@ -200,8 +198,8 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
// System.out.println("ini: costs="+iniSolution.getCost()+";#routes="+iniSolution.getRoutes().size());
|
||||
vra.addInitialSolution(iniSolution);
|
||||
|
||||
vra.setNuOfIterations(10000);
|
||||
vra.setPrematureBreak(1000);
|
||||
vra.setNuOfIterations(1000);
|
||||
vra.setPrematureBreak(100);
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -222,7 +220,7 @@ public class BuildPDVRPWithShipmentsAlgoFromScratchTest {
|
|||
|
||||
// for()
|
||||
|
||||
// new VrpXMLWriter(vrp, solutions).write("output/pd_solomon_r101.xml");
|
||||
new VrpXMLWriter(vrp, solutions).write("src/test/resources/pd_solomon_c101_sol.xml");
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
2535
jsprit-core/src/test/resources/C101_solomon_pd.xml
Normal file
2535
jsprit-core/src/test/resources/C101_solomon_pd.xml
Normal file
File diff suppressed because it is too large
Load diff
3556
jsprit-core/src/test/resources/pd_solomon_c101_sol.xml
Normal file
3556
jsprit-core/src/test/resources/pd_solomon_c101_sol.xml
Normal file
File diff suppressed because it is too large
Load diff
Loading…
Add table
Add a link
Reference in a new issue