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 c17efe7d..0058e027 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 @@ -214,9 +214,61 @@ public class VrpXMLReader{ readShipments(xmlConfig); readServices(xmlConfig); + readInitialRoutes(xmlConfig); readSolutions(xmlConfig); } + private void readInitialRoutes(XMLConfiguration xmlConfig) { + List initialRouteConfigs = xmlConfig.configurationsAt("initialRoutes.route"); + for(HierarchicalConfiguration routeConfig : initialRouteConfigs){ + Driver driver = DriverImpl.noDriver(); + String vehicleId = routeConfig.getString("vehicleId"); + Vehicle vehicle = getVehicle(vehicleId); + if(vehicle == null) throw new IllegalStateException("vehicle is missing."); + String start = routeConfig.getString("start"); + if(start == null) throw new IllegalStateException("route start-time is missing."); + double departureTime = Double.parseDouble(start); + + VehicleRoute.Builder routeBuilder = VehicleRoute.Builder.newInstance(vehicle, driver); + routeBuilder.setDepartureTime(departureTime); + + List actConfigs = routeConfig.configurationsAt("act"); + for(HierarchicalConfiguration actConfig : actConfigs){ + String type = actConfig.getString("[@type]"); + if(type == null) throw new IllegalStateException("act[@type] is missing."); + double arrTime = 0.; + double endTime = 0.; + String arrTimeS = actConfig.getString("arrTime"); + if(arrTimeS!=null) arrTime=Double.parseDouble(arrTimeS); + String endTimeS = actConfig.getString("endTime"); + if(endTimeS!=null) endTime=Double.parseDouble(endTimeS); + + String serviceId = actConfig.getString("serviceId"); + if(serviceId != null) { + Service service = getService(serviceId); + //!!! + + routeBuilder.addService(service, arrTime, endTime); + } + else{ + String shipmentId = actConfig.getString("shipmentId"); + if(shipmentId == null) throw new IllegalStateException("either serviceId or shipmentId is missing"); + Shipment shipment = getShipment(shipmentId); + if(shipment == null) throw new IllegalStateException("shipment with id " + shipmentId + " does not exist."); + if(type.equals("pickupShipment")){ + routeBuilder.addPickup(shipment, arrTime, endTime); + } + else if(type.equals("deliverShipment")){ + routeBuilder.addDelivery(shipment, arrTime, endTime); + } + else throw new IllegalStateException("type " + type + " is not supported. Use 'pickupShipment' or 'deliverShipment' here"); + } + } + VehicleRoute route = routeBuilder.build(); + vrpBuilder.addInitialVehicleRoute(route); + } + + } private void readSolutions(XMLConfiguration vrpProblem) { if(solutions == null) return; List solutionConfigs = vrpProblem.configurationsAt("solutions.solution"); @@ -246,13 +298,13 @@ public class VrpXMLReader{ for(HierarchicalConfiguration actConfig : actConfigs){ String type = actConfig.getString("[@type]"); if(type == null) throw new IllegalStateException("act[@type] is missing."); - + double arrTime = 0.; + double endTime = 0.; String arrTimeS = actConfig.getString("arrTime"); - if(arrTimeS == null) throw new IllegalStateException("act.arrTime is missing."); + if(arrTimeS!=null) arrTime=Double.parseDouble(arrTimeS); String endTimeS = actConfig.getString("endTime"); - if(endTimeS == null) throw new IllegalStateException("act.endTime is missing."); - double arrTime = Double.parseDouble(arrTimeS); - double endTime = Double.parseDouble(endTimeS); + if(endTimeS!=null) endTime=Double.parseDouble(endTimeS); + String serviceId = actConfig.getString("serviceId"); if(serviceId != null) { Service service = getService(serviceId); @@ -270,8 +322,7 @@ public class VrpXMLReader{ routeBuilder.addDelivery(shipment, arrTime, endTime); } else throw new IllegalStateException("type " + type + " is not supported. Use 'pickupShipment' or 'deliverShipment' here"); - } - + } } routes.add(routeBuilder.build()); } @@ -399,7 +450,7 @@ public class VrpXMLReader{ Shipment shipment = builder.build(); vrpBuilder.addJob(shipment); - shipmentMap .put(shipment.getId(),shipment); + shipmentMap.put(shipment.getId(),shipment); } } diff --git a/jsprit-core/src/main/resources/vrp_xml_schema.xsd b/jsprit-core/src/main/resources/vrp_xml_schema.xsd index c687aa05..a4e126db 100644 --- a/jsprit-core/src/main/resources/vrp_xml_schema.xsd +++ b/jsprit-core/src/main/resources/vrp_xml_schema.xsd @@ -219,6 +219,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -272,16 +298,16 @@ - - + + - - + + 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 60099da9..d7a7010d 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 @@ -449,7 +449,7 @@ public class VrpXMLReaderTest { } @Test - public void whenReadingInitialRouteWithDepTime10_departureTimeOfRouteShouldBeReadCorrectly(){ //i.e. these jobs should not be part of the problem + public void whenReadingInitialRouteWithDepTime10_departureTimeOfRouteShouldBeReadCorrectly(){ VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); new VrpXMLReader(builder).read("src/test/resources/finiteVrpWithInitialSolutionForReaderTest.xml"); VehicleRoutingProblem vrp = builder.build(); @@ -457,7 +457,7 @@ public class VrpXMLReaderTest { } @Test - public void whenReadingInitialRoute_nuInitialRoutesShouldBeCorrect(){ //i.e. these jobs should not be part of the problem + public void whenReadingInitialRoute_nuInitialRoutesShouldBeCorrect(){ VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); new VrpXMLReader(builder, null).read("src/test/resources/finiteVrpWithInitialSolutionForReaderTest.xml"); VehicleRoutingProblem vrp = builder.build(); @@ -465,7 +465,7 @@ public class VrpXMLReaderTest { } @Test - public void whenReadingInitialRoute_nuActivitiesShouldBeCorrect(){ //i.e. these jobs should not be part of the problem + public void whenReadingInitialRoute_nuActivitiesShouldBeCorrect(){ VehicleRoutingProblem.Builder builder = VehicleRoutingProblem.Builder.newInstance(); new VrpXMLReader(builder, null).read("src/test/resources/finiteVrpWithInitialSolutionForReaderTest.xml"); VehicleRoutingProblem vrp = builder.build();