diff --git a/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java index c8c20b8f..845a7e2a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/VehicleRoutingProblem.java @@ -628,8 +628,8 @@ public class VehicleRoutingProblem { this.nuActivities = builder.activityIndexCounter; logger.info("initialise " + this); } - - @Override + + @Override public String toString() { return "[fleetSize="+fleetSize+"][#jobs="+jobs.size()+"][#vehicles="+vehicles.size()+"][#vehicleTypes="+vehicleTypes.size()+"]["+ "transportCost="+transportCosts+"][activityCosts="+activityCosts+"]"; diff --git a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java index 019a5edb..76ca436a 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLReader.java @@ -70,45 +70,12 @@ public class VrpXMLReader{ } } } - + + @Deprecated interface JobConfigReader { - + void readConfig(XMLConfiguration vrpProblem); } - - static class ServiceConfigReader implements JobConfigReader{ - - VehicleRoutingProblem.Builder vrpBuilder; - - public ServiceConfigReader(jsprit.core.problem.VehicleRoutingProblem.Builder vrpBuilder) { - super(); - this.vrpBuilder = vrpBuilder; - } - - @Override - public void readConfig(XMLConfiguration config) { - - } - - } - - - static class ShipmentConfigReader implements JobConfigReader{ - - VehicleRoutingProblem.Builder vrpBuilder; - - public ShipmentConfigReader(jsprit.core.problem.VehicleRoutingProblem.Builder vrpBuilder) { - super(); - this.vrpBuilder = vrpBuilder; - } - - @Override - public void readConfig(XMLConfiguration config) { - - } - - } - private static Logger logger = LogManager.getLogger(VrpXMLReader.class); @@ -130,13 +97,16 @@ public class VrpXMLReader{ private Collection jobConfigReaders = new ArrayList(); - + @Deprecated public void addJobConfigReader(JobConfigReader reader){ jobConfigReaders.add(reader); } + + @Deprecated public void setTourActivityFactory(TourActivityFactory tourActivityFactory){ } - + + @Deprecated public void setServiceBuilderFactory(ServiceBuilderFactory serviceBuilderFactory){ this.serviceBuilderFactory=serviceBuilderFactory; } @@ -144,7 +114,8 @@ public class VrpXMLReader{ /** * @param schemaValidation the schemaValidation to set */ - public void setSchemaValidation(boolean schemaValidation) { + @SuppressWarnings("UnusedDeclaration") + public void setSchemaValidation(boolean schemaValidation) { this.schemaValidation = schemaValidation; } @@ -403,6 +374,7 @@ public class VrpXMLReader{ builder.setPickupLocation(pickupCoord.toString()); } } + //pickup-serviceTime String pickupServiceTime = shipmentConfig.getString("pickup.duration"); if(pickupServiceTime != null) builder.setPickupServiceTime(Double.parseDouble(pickupServiceTime)); @@ -414,8 +386,7 @@ public class VrpXMLReader{ TimeWindow pickupTW = TimeWindow.newInstance(Double.parseDouble(pickupTWStart), Double.parseDouble(pickupTWEnd)); builder.setPickupTimeWindow(pickupTW); } - - + //delivery-locationId String deliveryLocationId = shipmentConfig.getString("delivery.locationId"); if(deliveryLocationId != null){ @@ -434,6 +405,7 @@ public class VrpXMLReader{ builder.setDeliveryLocation(deliveryCoord.toString()); } } + //delivery-serviceTime String deliveryServiceTime = shipmentConfig.getString("delivery.duration"); if(deliveryServiceTime != null) builder.setDeliveryServiceTime(Double.parseDouble(deliveryServiceTime)); @@ -445,8 +417,16 @@ public class VrpXMLReader{ TimeWindow delTW = TimeWindow.newInstance(Double.parseDouble(delTWStart), Double.parseDouble(delTWEnd)); builder.setDeliveryTimeWindow(delTW); } - - + + //read skills + String skillString = shipmentConfig.getString("requiredSkills"); + if(skillString != null){ + String cleaned = skillString.replaceAll("\\s",""); + String[] skillTokens = cleaned.split("[,;]"); + for(String skill : skillTokens) builder.addRequiredSkill(skill.toLowerCase()); + } + + //build shipment Shipment shipment = builder.build(); // vrpBuilder.addJob(shipment); shipmentMap.put(shipment.getId(),shipment); @@ -515,6 +495,16 @@ public class VrpXMLReader{ builder.setTimeWindow(TimeWindow.newInstance(twConfig.getDouble("start"), twConfig.getDouble("end"))); } } + + //read skills + String skillString = serviceConfig.getString("requiredSkills"); + if(skillString != null){ + String cleaned = skillString.replaceAll("\\s",""); + String[] skillTokens = cleaned.split("[,;]"); + for(String skill : skillTokens) builder.addRequiredSkill(skill.toLowerCase()); + } + + //build service Service service = builder.build(); serviceMap.put(service.getId(),service); // vrpBuilder.addJob(service); @@ -595,7 +585,9 @@ public class VrpXMLReader{ VehicleType type = types.get(typeId); if(type == null) throw new IllegalStateException("vehicleType with typeId " + typeId + " is missing."); builder.setType(type); - String locationId = vehicleConfig.getString("location.id"); + + //read startlocation + String locationId = vehicleConfig.getString("location.id"); if(locationId == null) { locationId = vehicleConfig.getString("startLocation.id"); } @@ -618,7 +610,8 @@ public class VrpXMLReader{ builder.setStartLocationCoordinate(coordinate); } - + + //read endlocation String endLocationId = vehicleConfig.getString("endLocation.id"); if(endLocationId != null) builder.setEndLocationId(endLocationId); String endCoordX = vehicleConfig.getString("endLocation.coord[@x]"); @@ -634,15 +627,27 @@ public class VrpXMLReader{ builder.setEndLocationCoordinate(coordinate); } - + //read timeSchedule String start = vehicleConfig.getString("timeSchedule.start"); String end = vehicleConfig.getString("timeSchedule.end"); if(start != null) builder.setEarliestStart(Double.parseDouble(start)); if(end != null) builder.setLatestArrival(Double.parseDouble(end)); - String returnToDepot = vehicleConfig.getString("returnToDepot"); + + //read return2depot + String returnToDepot = vehicleConfig.getString("returnToDepot"); if(returnToDepot != null){ builder.setReturnToDepot(vehicleConfig.getBoolean("returnToDepot")); } + + //read skills + String skillString = vehicleConfig.getString("skills"); + if(skillString != null){ + String cleaned = skillString.replaceAll("\\s", ""); + String[] skillTokens = cleaned.split("[,;]"); + for(String skill : skillTokens) builder.addSkill(skill.toLowerCase()); + } + + //build vehicle VehicleImpl vehicle = builder.build(); vrpBuilder.addVehicle(vehicle); vehicleMap.put(vehicleId, vehicle); diff --git a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java index 63df9bd4..93216615 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/io/VrpXMLWriter.java @@ -16,6 +16,7 @@ ******************************************************************************/ package jsprit.core.problem.io; +import jsprit.core.problem.Skills; import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; @@ -55,8 +56,7 @@ public class VrpXMLWriter { private static final long serialVersionUID = 1L; public Document createDoc() throws ConfigurationException{ - Document doc = createDocument(); - return doc; + return createDocument(); } } @@ -227,7 +227,11 @@ public class VrpXMLWriter { xmlConfig.setProperty(shipmentPathString + "("+counter+").duration", service.getServiceDuration()); xmlConfig.setProperty(shipmentPathString + "("+counter+").timeWindows.timeWindow(0).start", service.getTimeWindow().getStart()); xmlConfig.setProperty(shipmentPathString + "("+counter+").timeWindows.timeWindow(0).end", service.getTimeWindow().getEnd()); - + + //skills + String skillString = getSkillString(service); + xmlConfig.setProperty(shipmentPathString + "("+counter+").requiredSkills", skillString); + counter++; } } @@ -265,6 +269,11 @@ public class VrpXMLWriter { xmlConfig.setProperty(shipmentPathString + "("+counter+").capacity-dimensions.dimension("+i+")[@index]", i); xmlConfig.setProperty(shipmentPathString + "("+counter+").capacity-dimensions.dimension("+i+")", shipment.getSize().get(i)); } + + //skills + String skillString = getSkillString(shipment); + xmlConfig.setProperty(shipmentPathString + "("+counter+").requiredSkills", skillString); + counter++; } } @@ -276,8 +285,7 @@ public class VrpXMLWriter { private void writeVehiclesAndTheirTypes(XMLConfiguration xmlConfig) { //vehicles - String vehiclePathString = new StringBuilder().append(Schema.VEHICLES).append("."). - append(Schema.VEHICLE).toString(); + String vehiclePathString = Schema.VEHICLES + "." + Schema.VEHICLE; int counter = 0; for(Vehicle vehicle : vrp.getVehicles()){ if(vehicle.getType() instanceof PenaltyVehicleType){ @@ -299,6 +307,11 @@ public class VrpXMLWriter { xmlConfig.setProperty(vehiclePathString + "("+counter+").timeSchedule.end", vehicle.getLatestArrival()); xmlConfig.setProperty(vehiclePathString + "("+counter+").returnToDepot", vehicle.isReturnToDepot()); + + //write skills + String skillString = getSkillString(vehicle); + xmlConfig.setProperty(vehiclePathString + "("+counter+").skills", skillString); + counter++; } @@ -328,4 +341,23 @@ public class VrpXMLWriter { } + private String getSkillString(Vehicle vehicle) { + return createSkillString(vehicle.getSkills()); + } + + private String getSkillString(Job job){ + return createSkillString(job.getRequiredSkills()); + } + + private String createSkillString(Skills skills) { + if(skills.values().size() == 0) return null; + String skillString = null; + for(String skill : skills.values()){ + if(skillString == null) skillString = skill; + else skillString += ", " + skill; + } + return skillString; + } + + } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java index c16d52c8..b3af79c1 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Service.java @@ -174,7 +174,7 @@ public class Service extends AbstractJob { return new Service(this); } - public Builder addSkill(String skill) { + public Builder addRequiredSkill(String skill) { skillBuilder.addSkill(skill); return this; } diff --git a/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java b/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java index 91be88db..520a7682 100644 --- a/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java +++ b/jsprit-core/src/main/java/jsprit/core/problem/job/Shipment.java @@ -243,7 +243,7 @@ public class Shipment extends AbstractJob{ } - public Builder addSkill(String skill) { + public Builder addRequiredSkill(String skill) { skillBuilder.addSkill(skill); return this; } diff --git a/jsprit-core/src/main/resources/vrp_xml_schema.xsd b/jsprit-core/src/main/resources/vrp_xml_schema.xsd index ce1f187f..2eeefe9f 100644 --- a/jsprit-core/src/main/resources/vrp_xml_schema.xsd +++ b/jsprit-core/src/main/resources/vrp_xml_schema.xsd @@ -65,6 +65,7 @@ + @@ -146,8 +147,8 @@ - + @@ -211,6 +212,7 @@ + diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/SolomonSkills_IT.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/SolomonSkills_IT.java index 9ca77534..d67b0094 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/SolomonSkills_IT.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/SolomonSkills_IT.java @@ -53,8 +53,8 @@ public class SolomonSkills_IT { Service.Builder skillServiceBuilder = Service.Builder.newInstance(service.getId()).setServiceTime(service.getServiceDuration()) .setCoord(service.getCoord()).setLocationId(service.getLocationId()).setTimeWindow(service.getTimeWindow()) .addSizeDimension(0,service.getSize().get(0)); - if(service.getCoord().getY()<50) skillServiceBuilder.addSkill("skill2"); - else skillServiceBuilder.addSkill("skill1"); + if(service.getCoord().getY()<50) skillServiceBuilder.addRequiredSkill("skill2"); + else skillServiceBuilder.addRequiredSkill("skill1"); skillProblemBuilder.addJob(skillServiceBuilder.build()); } skillProblemBuilder.addPenaltyVehicles(3.); diff --git a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java index 76357a71..43242ac7 100644 --- a/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java +++ b/jsprit-core/src/test/java/jsprit/core/algorithm/state/UpdateRequiredSkillsTest.java @@ -29,9 +29,9 @@ public class UpdateRequiredSkillsTest { public void doBefore(){ VehicleType type = VehicleTypeImpl.Builder.newInstance("t").build(); VehicleImpl vehicle = VehicleImpl.Builder.newInstance("v").setStartLocationId("start").setType(type).build(); - Service service = Service.Builder.newInstance("s").setLocationId("loc").addSkill("skill1").build(); - Service service2 = Service.Builder.newInstance("s2").setLocationId("loc").addSkill("skill1").addSkill("skill2").addSkill("skill3").build(); - Service service3 = Service.Builder.newInstance("s3").setLocationId("loc").addSkill("skill4").addSkill("skill5").build(); + Service service = Service.Builder.newInstance("s").setLocationId("loc").addRequiredSkill("skill1").build(); + Service service2 = Service.Builder.newInstance("s2").setLocationId("loc").addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3").build(); + Service service3 = Service.Builder.newInstance("s3").setLocationId("loc").addRequiredSkill("skill4").addRequiredSkill("skill5").build(); VehicleRoutingProblem vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle).addJob(service) .addJob(service2).addJob(service3).build(); route = VehicleRoute.Builder.newInstance(vehicle).setJobActivityFactory(vrp.getJobActivityFactory()).addService(service).addService(service2).addService(service3).build(); diff --git a/jsprit-core/src/test/java/jsprit/core/problem/constraint/SkillConstraintTest.java b/jsprit-core/src/test/java/jsprit/core/problem/constraint/SkillConstraintTest.java index eb3e795d..3c13d41a 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/constraint/SkillConstraintTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/constraint/SkillConstraintTest.java @@ -35,11 +35,11 @@ public class SkillConstraintTest { vehicle = VehicleImpl.Builder.newInstance("v").addSkill("skill1").addSkill("skill2").addSkill("skill3").addSkill("skill4").setStartLocationId("start").setType(type).build(); vehicle2 = VehicleImpl.Builder.newInstance("v").addSkill("skill4").addSkill("skill5").setStartLocationId("start").setType(type).build(); - Service service = Service.Builder.newInstance("s").setLocationId("loc").addSkill("skill1").build(); - Service service2 = Service.Builder.newInstance("s2").setLocationId("loc").addSkill("skill1").addSkill("skill2").addSkill("skill3").build(); + Service service = Service.Builder.newInstance("s").setLocationId("loc").addRequiredSkill("skill1").build(); + Service service2 = Service.Builder.newInstance("s2").setLocationId("loc").addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3").build(); - Service service3 = Service.Builder.newInstance("s3").setLocationId("loc").addSkill("skill4").addSkill("skill5").build(); - Service service4 = Service.Builder.newInstance("s4").setLocationId("loc").addSkill("skill1").build(); + Service service3 = Service.Builder.newInstance("s3").setLocationId("loc").addRequiredSkill("skill4").addRequiredSkill("skill5").build(); + Service service4 = Service.Builder.newInstance("s4").setLocationId("loc").addRequiredSkill("skill1").build(); vrp = VehicleRoutingProblem.Builder.newInstance().addVehicle(vehicle).addVehicle(vehicle2).addJob(service) .addJob(service2).addJob(service3).addJob(service4).build(); diff --git a/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLReaderTest.java b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLReaderTest.java index 0a01b6c8..67bd1266 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLReaderTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLReaderTest.java @@ -16,26 +16,22 @@ ******************************************************************************/ package jsprit.core.problem.io; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.VehicleRoutingProblem.FleetSize; import jsprit.core.problem.job.Job; import jsprit.core.problem.job.Service; import jsprit.core.problem.job.Shipment; import jsprit.core.problem.vehicle.Vehicle; - import org.junit.Before; import org.junit.Test; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import static org.junit.Assert.*; + public class VrpXMLReaderTest { @@ -77,6 +73,42 @@ public class VrpXMLReaderTest { assertEquals("vehType", v1.getType().getTypeId()); assertEquals(1000.0,v1.getLatestArrival(),0.01); } + + @Test + public void whenReadingVehicles_skill1ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Vehicle v1 = getVehicle("v1",vrp.getVehicles()); + assertTrue(v1.getSkills().containsSkill("skill1")); + } + + @Test + public void whenReadingVehicles_skill2ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Vehicle v1 = getVehicle("v1",vrp.getVehicles()); + assertTrue(v1.getSkills().containsSkill("skill2")); + } + + @Test + public void whenReadingVehicles_nuSkillsShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Vehicle v1 = getVehicle("v1",vrp.getVehicles()); + assertEquals(2, v1.getSkills().values().size()); + } + + @Test + public void whenReadingVehicles_nuSkillsOfV2ShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Vehicle v = getVehicle("v2",vrp.getVehicles()); + assertEquals(0, v.getSkills().values().size()); + } private Vehicle getVehicle(String string, Collection vehicles) { for(Vehicle v : vehicles) if(string.equals(v.getId())) return v; @@ -126,6 +158,42 @@ public class VrpXMLReaderTest { } assertEquals(2,servCounter); } + + @Test + public void whenReadingService1_skill1ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Service s = (Service) vrp.getJobs().get("1"); + assertTrue(s.getRequiredSkills().containsSkill("skill1")); + } + + @Test + public void whenReadingService1_skill2ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Service s = (Service) vrp.getJobs().get("1"); + assertTrue(s.getRequiredSkills().containsSkill("skill2")); + } + + @Test + public void whenReadingService1_nuSkillsShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Service s = (Service) vrp.getJobs().get("1"); + assertEquals(2,s.getRequiredSkills().values().size()); + } + + @Test + public void whenReadingService2_nuSkillsOfV2ShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Service s = (Service) vrp.getJobs().get("2"); + assertEquals(0,s.getRequiredSkills().values().size()); + } @Test public void whenReadingShipments_itReadsThemCorrectly(){ @@ -138,6 +206,42 @@ public class VrpXMLReaderTest { } assertEquals(2,shipCounter); } + + @Test + public void whenReadingShipment3_skill1ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Shipment s = (Shipment) vrp.getJobs().get("3"); + assertTrue(s.getRequiredSkills().containsSkill("skill1")); + } + + @Test + public void whenReadingShipment3_skill2ShouldBeAssigned(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Shipment s = (Shipment) vrp.getJobs().get("3"); + assertTrue(s.getRequiredSkills().containsSkill("skill2")); + } + + @Test + public void whenReadingShipment3_nuSkillsShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Shipment s = (Shipment) vrp.getJobs().get("3"); + assertEquals(2,s.getRequiredSkills().values().size()); + } + + @Test + public void whenReadingShipment4_nuSkillsOfV2ShouldBeCorrect(){ + VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(builder, null).read(inFileName); + VehicleRoutingProblem vrp = builder.build(); + Shipment s = (Shipment) vrp.getJobs().get("4"); + assertEquals(0,s.getRequiredSkills().values().size()); + } @Test public void whenReadingServices_capOfService1IsReadCorrectly(){ @@ -465,4 +569,6 @@ public class VrpXMLReaderTest { VehicleRoutingProblem vrp = builder.build(); assertEquals(2,vrp.getInitialVehicleRoutes().iterator().next().getActivities().size()); } + + } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLWriterTest.java b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLWriterTest.java index cbd2f5c2..7f8be992 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLWriterTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/io/VrpXMLWriterTest.java @@ -16,11 +16,6 @@ ******************************************************************************/ package jsprit.core.problem.io; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import java.util.Collection; - import jsprit.core.problem.VehicleRoutingProblem; import jsprit.core.problem.VehicleRoutingProblem.Builder; import jsprit.core.problem.VehicleRoutingProblem.FleetSize; @@ -31,10 +26,13 @@ import jsprit.core.problem.vehicle.Vehicle; import jsprit.core.problem.vehicle.VehicleImpl; import jsprit.core.problem.vehicle.VehicleTypeImpl; import jsprit.core.util.Coordinate; - import org.junit.Before; import org.junit.Test; +import java.util.Collection; + +import static org.junit.Assert.*; + public class VrpXMLWriterTest { private String infileName; @@ -50,7 +48,7 @@ public class VrpXMLWriterTest { VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); builder.setFleetSize(FleetSize.INFINITE); VehicleTypeImpl type = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); - Vehicle vehicle = VehicleImpl.Builder.newInstance("myVehicle").setStartLocationId("loc").setType(type).build(); + VehicleImpl vehicle = VehicleImpl.Builder.newInstance("myVehicle").setStartLocationId("loc").setType(type).build(); builder.addVehicle(vehicle); VehicleRoutingProblem vrp = builder.build(); new VrpXMLWriter(vrp, null).write(infileName); @@ -62,8 +60,8 @@ public class VrpXMLWriterTest { builder.setFleetSize(FleetSize.FINITE); VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); VehicleRoutingProblem vrp = builder.build(); @@ -76,8 +74,8 @@ public class VrpXMLWriterTest { builder.setFleetSize(FleetSize.FINITE); VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); VehicleRoutingProblem vrp = builder.build(); @@ -93,8 +91,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -150,8 +148,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -181,8 +179,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -213,8 +211,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -244,8 +242,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -275,8 +273,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -297,15 +295,184 @@ public class VrpXMLWriterTest { assertEquals("[x=1.0][y=2.0]",((Shipment)readVrp.getJobs().get("1")).getPickupLocation()); } - - @Test + + @Test + public void whenWritingVehicles_vehShouldHave2Skills(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); + VehicleImpl v = VehicleImpl.Builder.newInstance("v1").addSkill("SKILL5").addSkill("skill1").addSkill("Skill2").setStartLocationId("loc").setType(type1).build(); + builder.addVehicle(v); + + VehicleRoutingProblem vrp = builder.build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + Vehicle veh1 = getVehicle("v1",readVrp); + + assertEquals(3,veh1.getSkills().values().size()); + } + + @Test + public void whenWritingVehicles_vehShouldContain_skill5(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); + VehicleImpl v = VehicleImpl.Builder.newInstance("v1").addSkill("SKILL5").addSkill("skill1").addSkill("Skill2").setStartLocationId("loc").setType(type1).build(); + builder.addVehicle(v); + + VehicleRoutingProblem vrp = builder.build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + Vehicle veh1 = getVehicle("v1",readVrp); + + assertTrue(veh1.getSkills().containsSkill("skill5")); + } + + @Test + public void whenWritingVehicles_vehShouldContain_skill1(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); + VehicleImpl v = VehicleImpl.Builder.newInstance("v1").addSkill("SKILL5").addSkill("skill1").addSkill("Skill2").setStartLocationId("loc").setType(type1).build(); + builder.addVehicle(v); + + VehicleRoutingProblem vrp = builder.build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + Vehicle veh1 = getVehicle("v1",readVrp); + + assertTrue(veh1.getSkills().containsSkill("skill1")); + } + + @Test + public void whenWritingVehicles_vehShouldContain_skill2(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); + VehicleImpl v = VehicleImpl.Builder.newInstance("v1").addSkill("SKILL5").addSkill("skill1").addSkill("Skill2").setStartLocationId("loc").setType(type1).build(); + builder.addVehicle(v); + + VehicleRoutingProblem vrp = builder.build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + Vehicle veh1 = getVehicle("v1",readVrp); + + assertTrue(veh1.getSkills().containsSkill("skill2")); + } + + @Test + public void whenWritingVehicles_vehShouldHave0Skills(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); + VehicleImpl v = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + builder.addVehicle(v); + + VehicleRoutingProblem vrp = builder.build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + Vehicle veh = getVehicle("v1",readVrp); + + assertEquals(0,veh.getSkills().values().size()); + } + + private Vehicle getVehicle(String v1, VehicleRoutingProblem readVrp) { + for(Vehicle v : readVrp.getVehicles()){ + if(v.getId().equals(v1)) return v; + } + return null; + } + + @Test + public void whenWritingShipments_shipmentShouldHaveCorrectNuSkills(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Shipment s = Shipment.Builder.newInstance("1").addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3") + .addSizeDimension(0, 10).setPickupCoord(Coordinate.newInstance(1, 2)).setDeliveryCoord(Coordinate.newInstance(5, 6)).setDeliveryLocation("delLoc").setPickupTimeWindow(TimeWindow.newInstance(1, 2)) + .setDeliveryTimeWindow(TimeWindow.newInstance(3, 4)).setPickupServiceTime(100).setDeliveryServiceTime(50).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertEquals(3,readVrp.getJobs().get("1").getRequiredSkills().values().size()); + } + + @Test + public void whenWritingShipments_shipmentShouldContain_skill1(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Shipment s = Shipment.Builder.newInstance("1").addRequiredSkill("skill1").addRequiredSkill("skill2").addRequiredSkill("skill3") + .addSizeDimension(0, 10).setPickupCoord(Coordinate.newInstance(1, 2)).setDeliveryCoord(Coordinate.newInstance(5, 6)).setDeliveryLocation("delLoc").setPickupTimeWindow(TimeWindow.newInstance(1, 2)) + .setDeliveryTimeWindow(TimeWindow.newInstance(3, 4)).setPickupServiceTime(100).setDeliveryServiceTime(50).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertTrue(readVrp.getJobs().get("1").getRequiredSkills().containsSkill("skill1")); + } + + @Test + public void whenWritingShipments_shipmentShouldContain_skill2(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Shipment s = Shipment.Builder.newInstance("1").addRequiredSkill("skill1").addRequiredSkill("Skill2").addRequiredSkill("skill3") + .addSizeDimension(0, 10).setPickupCoord(Coordinate.newInstance(1, 2)).setDeliveryCoord(Coordinate.newInstance(5, 6)).setDeliveryLocation("delLoc").setPickupTimeWindow(TimeWindow.newInstance(1, 2)) + .setDeliveryTimeWindow(TimeWindow.newInstance(3, 4)).setPickupServiceTime(100).setDeliveryServiceTime(50).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertTrue(readVrp.getJobs().get("1").getRequiredSkills().containsSkill("skill2")); + } + + @Test + public void whenWritingShipments_shipmentShouldContain_skill3(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Shipment s = Shipment.Builder.newInstance("1").addRequiredSkill("skill1").addRequiredSkill("Skill2").addRequiredSkill("skill3") + .addSizeDimension(0, 10).setPickupCoord(Coordinate.newInstance(1, 2)).setDeliveryCoord(Coordinate.newInstance(5, 6)).setDeliveryLocation("delLoc").setPickupTimeWindow(TimeWindow.newInstance(1, 2)) + .setDeliveryTimeWindow(TimeWindow.newInstance(3, 4)).setPickupServiceTime(100).setDeliveryServiceTime(50).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertTrue(readVrp.getJobs().get("1").getRequiredSkills().containsSkill("skill3")); + } + + @Test public void whenWritingShipments_readingThemAgainMustReturnTheWrittenLocationCoordOfS1(){ Builder builder = VehicleRoutingProblem.Builder.newInstance(); VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -352,13 +519,13 @@ public class VrpXMLWriterTest { new VrpXMLReader(vrpToReadBuilder, null).read(infileName); VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); - assertEquals(3,((Shipment)readVrp.getJobs().get("1")).getSize().getNuOfDimensions()); - assertEquals(10,((Shipment)readVrp.getJobs().get("1")).getSize().get(0)); - assertEquals(0,((Shipment)readVrp.getJobs().get("1")).getSize().get(1)); - assertEquals(100,((Shipment)readVrp.getJobs().get("1")).getSize().get(2)); + assertEquals(3,(readVrp.getJobs().get("1")).getSize().getNuOfDimensions()); + assertEquals(10, (readVrp.getJobs().get("1")).getSize().get(0)); + assertEquals(0,(readVrp.getJobs().get("1")).getSize().get(1)); + assertEquals(100,(readVrp.getJobs().get("1")).getSize().get(2)); - assertEquals(1,((Shipment)readVrp.getJobs().get("2")).getSize().getNuOfDimensions()); - assertEquals(20,((Shipment)readVrp.getJobs().get("2")).getSize().get(0)); + assertEquals(1,(readVrp.getJobs().get("2")).getSize().getNuOfDimensions()); + assertEquals(20,(readVrp.getJobs().get("2")).getSize().get(0)); } @Test @@ -367,8 +534,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -382,12 +549,60 @@ public class VrpXMLWriterTest { VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); new VrpXMLReader(vrpToReadBuilder, null).read(infileName); VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); - + Vehicle v = getVehicle("v1",readVrp.getVehicles()); assertEquals("loc",v.getStartLocationId()); assertEquals("loc",v.getEndLocationId()); } + + @Test + public void whenWritingService_itShouldHaveTheCorrectNuSkills(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Service s = Service.Builder.newInstance("1").addRequiredSkill("sKill1").addRequiredSkill("skill2").addSizeDimension(0, 1).setLocationId("loc").setServiceTime(2.0).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertEquals(2,readVrp.getJobs().get("1").getRequiredSkills().values().size()); + } + + @Test + public void whenWritingService_itShouldContain_skill1(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Service s = Service.Builder.newInstance("1").addRequiredSkill("sKill1").addRequiredSkill("skill2").addSizeDimension(0, 1).setLocationId("loc").setServiceTime(2.0).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertTrue(readVrp.getJobs().get("1").getRequiredSkills().containsSkill("skill1")); + } + + @Test + public void whenWritingService_itShouldContain_skill2(){ + Builder builder = VehicleRoutingProblem.Builder.newInstance(); + + Service s = Service.Builder.newInstance("1").addRequiredSkill("sKill1").addRequiredSkill("skill2").addSizeDimension(0, 1).setLocationId("loc").setServiceTime(2.0).build(); + + VehicleRoutingProblem vrp = builder.addJob(s).build(); + new VrpXMLWriter(vrp, null).write(infileName); + + VehicleRoutingProblem.Builder vrpToReadBuilder = VehicleRoutingProblem.Builder.newInstance(); + new VrpXMLReader(vrpToReadBuilder, null).read(infileName); + VehicleRoutingProblem readVrp = vrpToReadBuilder.build(); + + assertTrue(readVrp.getJobs().get("1").getRequiredSkills().containsSkill("skill2")); + } @Test public void whenWritingVehicleV1_itDoesNotReturnToDepotMustBeWrittenCorrectly(){ @@ -395,8 +610,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -421,8 +636,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -447,8 +662,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("loc").setType(type2).build(); builder.addVehicle(v1); builder.addVehicle(v2); @@ -475,8 +690,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) .setEndLocationId("endLoc").setEndLocationCoordinate(Coordinate.newInstance(4, 5)).setType(type2).build(); builder.addVehicle(v1); @@ -503,8 +718,8 @@ public class VrpXMLWriterTest { VehicleTypeImpl type1 = VehicleTypeImpl.Builder.newInstance("vehType").addCapacityDimension(0, 20).build(); VehicleTypeImpl type2 = VehicleTypeImpl.Builder.newInstance("vehType2").addCapacityDimension(0, 200).build(); - Vehicle v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); - Vehicle v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) + VehicleImpl v1 = VehicleImpl.Builder.newInstance("v1").setReturnToDepot(false).setStartLocationId("loc").setType(type1).build(); + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v2").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) .setEndLocationId("endLoc").setEndLocationCoordinate(Coordinate.newInstance(4, 5)).setType(type2).build(); builder.addVehicle(v1); @@ -537,8 +752,8 @@ public class VrpXMLWriterTest { .addCapacityDimension(1, 1000) .addCapacityDimension(2, 10000) .build(); - - Vehicle v2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) + + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) .setEndLocationId("endLoc").setEndLocationCoordinate(Coordinate.newInstance(4, 5)).setType(type2).build(); builder.addVehicle(v2); @@ -565,8 +780,8 @@ public class VrpXMLWriterTest { .addCapacityDimension(1, 1000) .addCapacityDimension(10, 10000) .build(); - - Vehicle v2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) + + VehicleImpl v2 = VehicleImpl.Builder.newInstance("v").setStartLocationId("startLoc").setStartLocationCoordinate(Coordinate.newInstance(1, 2)) .setEndLocationId("endLoc").setEndLocationCoordinate(Coordinate.newInstance(4, 5)).setType(type2).build(); builder.addVehicle(v2); diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java index cda3c74e..a136435c 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/DeliveryTest.java @@ -60,7 +60,7 @@ public class DeliveryTest { @Test public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") - .addSkill("drill").addSkill("screwdriver").build(); + .addRequiredSkill("drill").addRequiredSkill("screwdriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); } @@ -68,7 +68,7 @@ public class DeliveryTest { @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") - .addSkill("DriLl").addSkill("screwDriver").build(); + .addRequiredSkill("DriLl").addRequiredSkill("screwDriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drilL")); } @@ -76,7 +76,7 @@ public class DeliveryTest { @Test public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") - .addSkill("screwDriver").build(); + .addRequiredSkill("screwDriver").build(); assertFalse(s.getRequiredSkills().containsSkill("drill")); assertFalse(s.getRequiredSkills().containsSkill("drilL")); } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java index 590a0770..0a386bf6 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/PickupTest.java @@ -60,7 +60,7 @@ public class PickupTest { @Test public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") - .addSkill("drill").addSkill("screwdriver").build(); + .addRequiredSkill("drill").addRequiredSkill("screwdriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); @@ -69,7 +69,7 @@ public class PickupTest { @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") - .addSkill("DriLl").addSkill("screwDriver").build(); + .addRequiredSkill("DriLl").addRequiredSkill("screwDriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drilL")); } @@ -77,7 +77,7 @@ public class PickupTest { @Test public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ Pickup s = (Pickup) Pickup.Builder.newInstance("s").setLocationId("loc") - .addSkill("screwDriver").build(); + .addRequiredSkill("screwDriver").build(); assertFalse(s.getRequiredSkills().containsSkill("drill")); assertFalse(s.getRequiredSkills().containsSkill("drilL")); } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java index 3aa8b85b..716f64ac 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ServiceTest.java @@ -145,7 +145,7 @@ public class ServiceTest { @Test public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Service s = Service.Builder.newInstance("s").setLocationId("loc") - .addSkill("drill").addSkill("screwdriver").build(); + .addRequiredSkill("drill").addRequiredSkill("screwdriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); @@ -154,7 +154,7 @@ public class ServiceTest { @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Service s = Service.Builder.newInstance("s").setLocationId("loc") - .addSkill("DriLl").addSkill("screwDriver").build(); + .addRequiredSkill("DriLl").addRequiredSkill("screwDriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drilL")); } @@ -162,7 +162,7 @@ public class ServiceTest { @Test public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ Service s = Service.Builder.newInstance("s").setLocationId("loc") - .addSkill("screwDriver").build(); + .addRequiredSkill("screwDriver").build(); assertFalse(s.getRequiredSkills().containsSkill("drill")); assertFalse(s.getRequiredSkills().containsSkill("drilL")); } diff --git a/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java index 348e88e1..10040926 100644 --- a/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java +++ b/jsprit-core/src/test/java/jsprit/core/problem/job/ShipmentTest.java @@ -251,7 +251,7 @@ public class ShipmentTest { @Test public void whenAddingSkills_theyShouldBeAddedCorrectly(){ Shipment s = Shipment.Builder.newInstance("s").setPickupLocation("loc").setDeliveryLocation("delLoc") - .addSkill("drill").addSkill("screwdriver").build(); + .addRequiredSkill("drill").addRequiredSkill("screwdriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("ScrewDriver")); @@ -260,7 +260,7 @@ public class ShipmentTest { @Test public void whenAddingSkillsCaseSens_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") - .addSkill("DriLl").addSkill("screwDriver").build(); + .addRequiredSkill("DriLl").addRequiredSkill("screwDriver").build(); assertTrue(s.getRequiredSkills().containsSkill("drill")); assertTrue(s.getRequiredSkills().containsSkill("drilL")); } @@ -268,7 +268,7 @@ public class ShipmentTest { @Test public void whenAddingSkillsCaseSensV2_theyShouldBeAddedCorrectly(){ Delivery s = (Delivery) Delivery.Builder.newInstance("s").setLocationId("loc") - .addSkill("screwDriver").build(); + .addRequiredSkill("screwDriver").build(); assertFalse(s.getRequiredSkills().containsSkill("drill")); assertFalse(s.getRequiredSkills().containsSkill("drilL")); } diff --git a/jsprit-core/src/test/resources/finiteVrpForReaderTest.xml b/jsprit-core/src/test/resources/finiteVrpForReaderTest.xml index ddb11896..5974c8c9 100644 --- a/jsprit-core/src/test/resources/finiteVrpForReaderTest.xml +++ b/jsprit-core/src/test/resources/finiteVrpForReaderTest.xml @@ -39,6 +39,7 @@ 0.0 1000.0 + skill1; SKill2 v2 @@ -153,6 +154,7 @@ 4000.0 + skill1, Skill2 @@ -197,6 +199,7 @@ 10 + skill1, Skill2 diff --git a/jsprit-examples/src/main/java/jsprit/examples/SimpleExampleWithSkills.java b/jsprit-examples/src/main/java/jsprit/examples/SimpleExampleWithSkills.java index b7524a3c..ae69f519 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/SimpleExampleWithSkills.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SimpleExampleWithSkills.java @@ -84,7 +84,7 @@ public class SimpleExampleWithSkills { Service service3 = Service.Builder.newInstance("3").addSizeDimension(WEIGHT_INDEX, 1).setCoord(Coordinate.newInstance(15, 7)).build(); - Service service4 = Service.Builder.newInstance("4").addSizeDimension(WEIGHT_INDEX, 1).addSkill("drill").setCoord(Coordinate.newInstance(15, 13)).build(); + Service service4 = Service.Builder.newInstance("4").addSizeDimension(WEIGHT_INDEX, 1).addRequiredSkill("drill").setCoord(Coordinate.newInstance(15, 13)).build(); VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); diff --git a/jsprit-examples/src/main/java/jsprit/examples/SolomonWithSkillsExample.java b/jsprit-examples/src/main/java/jsprit/examples/SolomonWithSkillsExample.java index 1b2f4af1..85d1b3ec 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/SolomonWithSkillsExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/SolomonWithSkillsExample.java @@ -49,13 +49,13 @@ public class SolomonWithSkillsExample { skillServiceBuilder = Service.Builder.newInstance(service.getId()+"_skill2").setServiceTime(service.getServiceDuration()) .setCoord(service.getCoord()).setLocationId(service.getLocationId()).setTimeWindow(service.getTimeWindow()) .addSizeDimension(0,service.getSize().get(0)); - skillServiceBuilder.addSkill("skill2"); + skillServiceBuilder.addRequiredSkill("skill2"); } else { skillServiceBuilder = Service.Builder.newInstance(service.getId()+"_skill1").setServiceTime(service.getServiceDuration()) .setCoord(service.getCoord()).setLocationId(service.getLocationId()).setTimeWindow(service.getTimeWindow()) .addSizeDimension(0,service.getSize().get(0)); - skillServiceBuilder.addSkill("skill1"); + skillServiceBuilder.addRequiredSkill("skill1"); } skillProblemBuilder.addJob(skillServiceBuilder.build()); }