mirror of
https://github.com/graphhopper/jsprit.git
synced 2020-01-24 07:45:05 +01:00
fix #213
This commit is contained in:
parent
1e8b4f4d66
commit
d102cbb651
5 changed files with 43 additions and 61 deletions
|
|
@ -91,6 +91,8 @@ public class VehicleRoutingProblem {
|
||||||
|
|
||||||
private Set<Vehicle> uniqueVehicles = new HashSet<Vehicle>();
|
private Set<Vehicle> uniqueVehicles = new HashSet<Vehicle>();
|
||||||
|
|
||||||
|
private Set<String> addedVehicleIds = new HashSet<String>();
|
||||||
|
|
||||||
private boolean hasBreaks = false;
|
private boolean hasBreaks = false;
|
||||||
|
|
||||||
private JobActivityFactory jobActivityFactory = new JobActivityFactory() {
|
private JobActivityFactory jobActivityFactory = new JobActivityFactory() {
|
||||||
|
|
@ -289,7 +291,10 @@ public class VehicleRoutingProblem {
|
||||||
* @return the builder
|
* @return the builder
|
||||||
*/
|
*/
|
||||||
public Builder addInitialVehicleRoute(VehicleRoute route) {
|
public Builder addInitialVehicleRoute(VehicleRoute route) {
|
||||||
addVehicle((AbstractVehicle) route.getVehicle());
|
if(!addedVehicleIds.contains(route.getVehicle().getId())){
|
||||||
|
addVehicle((AbstractVehicle) route.getVehicle());
|
||||||
|
addedVehicleIds.add(route.getVehicle().getId());
|
||||||
|
}
|
||||||
for (TourActivity act : route.getActivities()) {
|
for (TourActivity act : route.getActivities()) {
|
||||||
AbstractActivity abstractAct = (AbstractActivity) act;
|
AbstractActivity abstractAct = (AbstractActivity) act;
|
||||||
abstractAct.setIndex(activityIndexCounter);
|
abstractAct.setIndex(activityIndexCounter);
|
||||||
|
|
@ -360,6 +365,10 @@ public class VehicleRoutingProblem {
|
||||||
* @return this builder
|
* @return this builder
|
||||||
*/
|
*/
|
||||||
public Builder addVehicle(AbstractVehicle vehicle) {
|
public Builder addVehicle(AbstractVehicle vehicle) {
|
||||||
|
if(addedVehicleIds.contains(vehicle.getId())){
|
||||||
|
throw new IllegalStateException("problem already contains a vehicle with id " + vehicle.getId() + ". choose unique ids for each vehicle.");
|
||||||
|
}
|
||||||
|
else addedVehicleIds.add(vehicle.getId());
|
||||||
if (!uniqueVehicles.contains(vehicle)) {
|
if (!uniqueVehicles.contains(vehicle)) {
|
||||||
vehicle.setIndex(vehicleIndexCounter);
|
vehicle.setIndex(vehicleIndexCounter);
|
||||||
incVehicleIndexCounter();
|
incVehicleIndexCounter();
|
||||||
|
|
|
||||||
|
|
@ -272,7 +272,7 @@ public class StateManagerTest {
|
||||||
public void whenMemorizingTwoVehicleInfoForRoute_itShouldBeMemorized() {
|
public void whenMemorizingTwoVehicleInfoForRoute_itShouldBeMemorized() {
|
||||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
||||||
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
VehicleRoute route = getRoute(vehicle);
|
VehicleRoute route = getRoute(vehicle);
|
||||||
|
|
||||||
//getting the indices created in vrpBuilder
|
//getting the indices created in vrpBuilder
|
||||||
|
|
@ -292,7 +292,7 @@ public class StateManagerTest {
|
||||||
public void whenMemorizingTwoVehicleInfoForAct_itShouldBeMemorized() {
|
public void whenMemorizingTwoVehicleInfoForAct_itShouldBeMemorized() {
|
||||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
||||||
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
|
|
||||||
//getting the indices created in vrpBuilder
|
//getting the indices created in vrpBuilder
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
|
|
@ -314,7 +314,7 @@ public class StateManagerTest {
|
||||||
public void whenClearing_arrElementsShouldBeNull() {
|
public void whenClearing_arrElementsShouldBeNull() {
|
||||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").setCostPerDistance(4.).build();
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).build();
|
||||||
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
|
|
||||||
//getting the indices created in vrpBuilder
|
//getting the indices created in vrpBuilder
|
||||||
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
|
|
|
||||||
|
|
@ -326,7 +326,7 @@ public class VehicleRoutingProblemTest {
|
||||||
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance();
|
||||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build();
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("type").build();
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
|
|
||||||
builder.addVehicle(vehicle);
|
builder.addVehicle(vehicle);
|
||||||
builder.addVehicle(vehicle2);
|
builder.addVehicle(vehicle2);
|
||||||
|
|
@ -342,7 +342,7 @@ public class VehicleRoutingProblemTest {
|
||||||
VehicleType type2 = VehicleTypeImpl.Builder.newInstance("type2").build();
|
VehicleType type2 = VehicleTypeImpl.Builder.newInstance("type2").build();
|
||||||
|
|
||||||
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type).build();
|
||||||
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v").setStartLocation(Location.newInstance("loc")).setType(type2).build();
|
VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("v2").setStartLocation(Location.newInstance("loc")).setType(type2).build();
|
||||||
|
|
||||||
builder.addVehicle(vehicle);
|
builder.addVehicle(vehicle);
|
||||||
builder.addVehicle(vehicle2);
|
builder.addVehicle(vehicle2);
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ public class SkillConstraintTest {
|
||||||
public void doBefore() {
|
public void doBefore() {
|
||||||
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").build();
|
VehicleType type = VehicleTypeImpl.Builder.newInstance("t").build();
|
||||||
vehicle = VehicleImpl.Builder.newInstance("v").addSkill("skill1").addSkill("skill2").addSkill("skill3").addSkill("skill4").setStartLocation(Location.newInstance("start")).setType(type).build();
|
vehicle = VehicleImpl.Builder.newInstance("v").addSkill("skill1").addSkill("skill2").addSkill("skill3").addSkill("skill4").setStartLocation(Location.newInstance("start")).setType(type).build();
|
||||||
vehicle2 = VehicleImpl.Builder.newInstance("v").addSkill("skill4").addSkill("skill5").setStartLocation(Location.newInstance("start")).setType(type).build();
|
vehicle2 = VehicleImpl.Builder.newInstance("v2").addSkill("skill4").addSkill("skill5").setStartLocation(Location.newInstance("start")).setType(type).build();
|
||||||
|
|
||||||
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance("loc")).addRequiredSkill("skill1").build();
|
Service service = Service.Builder.newInstance("s").setLocation(Location.newInstance("loc")).addRequiredSkill("skill1").build();
|
||||||
Service service2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance("loc")).addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3").build();
|
Service service2 = Service.Builder.newInstance("s2").setLocation(Location.newInstance("loc")).addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3").build();
|
||||||
|
|
|
||||||
|
|
@ -2,9 +2,24 @@
|
||||||
<problem xmlns="http://www.w3schools.com"
|
<problem xmlns="http://www.w3schools.com"
|
||||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3schools.com vrp_xml_schema.xsd">
|
||||||
<problemType>
|
<problemType>
|
||||||
<fleetSize>INFINITE</fleetSize>
|
<fleetSize>FINITE</fleetSize>
|
||||||
</problemType>
|
</problemType>
|
||||||
<vehicles>
|
<vehicles>
|
||||||
|
<vehicle>
|
||||||
|
<id>v2</id>
|
||||||
|
<typeId>vehType2</typeId>
|
||||||
|
<startLocation>
|
||||||
|
<id>loc</id>
|
||||||
|
</startLocation>
|
||||||
|
<endLocation>
|
||||||
|
<id>loc</id>
|
||||||
|
</endLocation>
|
||||||
|
<timeSchedule>
|
||||||
|
<start>0.0</start>
|
||||||
|
<end>1.7976931348623157E308</end>
|
||||||
|
</timeSchedule>
|
||||||
|
<returnToDepot>true</returnToDepot>
|
||||||
|
</vehicle>
|
||||||
<vehicle>
|
<vehicle>
|
||||||
<id>v1</id>
|
<id>v1</id>
|
||||||
<typeId>vehType</typeId>
|
<typeId>vehType</typeId>
|
||||||
|
|
@ -33,58 +48,16 @@
|
||||||
<time>0.0</time>
|
<time>0.0</time>
|
||||||
</costs>
|
</costs>
|
||||||
</type>
|
</type>
|
||||||
|
<type>
|
||||||
|
<id>vehType2</id>
|
||||||
|
<capacity-dimensions>
|
||||||
|
<dimension index="0">200</dimension>
|
||||||
|
</capacity-dimensions>
|
||||||
|
<costs>
|
||||||
|
<fixed>0.0</fixed>
|
||||||
|
<distance>1.0</distance>
|
||||||
|
<time>0.0</time>
|
||||||
|
</costs>
|
||||||
|
</type>
|
||||||
</vehicleTypes>
|
</vehicleTypes>
|
||||||
<services>
|
|
||||||
<service id="1" type="service">
|
|
||||||
<location>
|
|
||||||
<id>loc</id>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>2.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
<service id="2" type="service">
|
|
||||||
<location>
|
|
||||||
<id>loc2</id>
|
|
||||||
</location>
|
|
||||||
<capacity-dimensions>
|
|
||||||
<dimension index="0">1</dimension>
|
|
||||||
</capacity-dimensions>
|
|
||||||
<duration>4.0</duration>
|
|
||||||
<timeWindows>
|
|
||||||
<timeWindow>
|
|
||||||
<start>0.0</start>
|
|
||||||
<end>1.7976931348623157E308</end>
|
|
||||||
</timeWindow>
|
|
||||||
</timeWindows>
|
|
||||||
</service>
|
|
||||||
</services>
|
|
||||||
<solutions>
|
|
||||||
<solution>
|
|
||||||
<cost>10.0</cost>
|
|
||||||
<routes>
|
|
||||||
<route>
|
|
||||||
<driverId>noDriver</driverId>
|
|
||||||
<vehicleId>v1</vehicleId>
|
|
||||||
<start>0.0</start>
|
|
||||||
<act type="service">
|
|
||||||
<serviceId>1</serviceId>
|
|
||||||
<arrTime>0.0</arrTime>
|
|
||||||
<endTime>0.0</endTime>
|
|
||||||
</act>
|
|
||||||
<end>0.0</end>
|
|
||||||
</route>
|
|
||||||
</routes>
|
|
||||||
<unassignedJobs>
|
|
||||||
<job id="2"/>
|
|
||||||
</unassignedJobs>
|
|
||||||
</solution>
|
|
||||||
</solutions>
|
|
||||||
</problem>
|
</problem>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue