private void writeInitialRoutes(XMLConf xmlConfig) { if (vrp.getInitialVehicleRoutes().isEmpty()) return; String path = "initialRoutes.route"; int routeCounter = 0; for (VehicleRoute route : vrp.getInitialVehicleRoutes()) { xmlConfig.setProperty(path + "(" + routeCounter + ").driverId", route.getDriver().getId()); xmlConfig.setProperty(path + "(" + routeCounter + ").vehicleId", route.getVehicle().getId()); xmlConfig.setProperty(path + "(" + routeCounter + ").start", route.getStart().getEndTime()); int actCounter = 0; for (TourActivity act : route.getTourActivities().getActivities()) { xmlConfig.setProperty( path + "(" + routeCounter + ").act(" + actCounter + ")[@type]", act.getName()); if (act instanceof JobActivity) { Job job = ((JobActivity) act).getJob(); if (job instanceof Service) { xmlConfig.setProperty( path + "(" + routeCounter + ").act(" + actCounter + ").serviceId", job.getId()); } else if (job instanceof Shipment) { xmlConfig.setProperty( path + "(" + routeCounter + ").act(" + actCounter + ").shipmentId", job.getId()); } else { throw new IllegalStateException( "cannot write solution correctly since job-type is not know. make sure you use either service or shipment, or another writer"); } } xmlConfig.setProperty( path + "(" + routeCounter + ").act(" + actCounter + ").arrTime", act.getArrTime()); xmlConfig.setProperty( path + "(" + routeCounter + ").act(" + actCounter + ").endTime", act.getEndTime()); actCounter++; } xmlConfig.setProperty(path + "(" + routeCounter + ").end", route.getEnd().getArrTime()); routeCounter++; } }
public void write(String filename) { if (!filename.endsWith(".xml")) filename += ".xml"; log.info("write vrp: " + filename); XMLConf xmlConfig = new XMLConf(); xmlConfig.setFileName(filename); xmlConfig.setRootElementName("problem"); xmlConfig.setAttributeSplittingDisabled(true); xmlConfig.setDelimiterParsingDisabled(true); writeProblemType(xmlConfig); writeVehiclesAndTheirTypes(xmlConfig); // might be sorted? List<Job> jobs = new ArrayList<Job>(); jobs.addAll(vrp.getJobs().values()); for (VehicleRoute r : vrp.getInitialVehicleRoutes()) { jobs.addAll(r.getTourActivities().getJobs()); } writeServices(xmlConfig, jobs); writeShipments(xmlConfig, jobs); writeInitialRoutes(xmlConfig); writeSolutions(xmlConfig); OutputFormat format = new OutputFormat(); format.setIndenting(true); format.setIndent(5); try { Document document = xmlConfig.createDoc(); Element element = document.getDocumentElement(); element.setAttribute("xmlns", "http://www.w3schools.com"); element.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); element.setAttribute("xsi:schemaLocation", "http://www.w3schools.com vrp_xml_schema.xsd"); } catch (ConfigurationException e) { logger.error("Exception:", e); e.printStackTrace(); System.exit(1); } try { Writer out = new FileWriter(filename); XMLSerializer serializer = new XMLSerializer(out, format); serializer.serialize(xmlConfig.getDocument()); out.close(); } catch (IOException e) { logger.error("Exception:", e); e.printStackTrace(); System.exit(1); } }
private void writeShipments(XMLConf xmlConfig, List<Job> jobs) { String shipmentPathString = "shipments.shipment"; int counter = 0; for (Job j : jobs) { if (!(j instanceof Shipment)) continue; Shipment shipment = (Shipment) j; xmlConfig.setProperty(shipmentPathString + "(" + counter + ")[@id]", shipment.getId()); // xmlConfig.setProperty(shipmentPathString + "("+counter+")[@type]", service.getType()); if (shipment.getPickupLocation().getId() != null) xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.location.id", shipment.getPickupLocation().getId()); if (shipment.getPickupLocation().getCoordinate() != null) { xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.location.coord[@x]", shipment.getPickupLocation().getCoordinate().getX()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.location.coord[@y]", shipment.getPickupLocation().getCoordinate().getY()); } if (shipment.getPickupLocation().getIndex() != Location.NO_INDEX) { xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.location.index", shipment.getPickupLocation().getIndex()); } xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.duration", shipment.getPickupServiceTime()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.timeWindows.timeWindow(0).start", shipment.getPickupTimeWindow().getStart()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").pickup.timeWindows.timeWindow(0).end", shipment.getPickupTimeWindow().getEnd()); if (shipment.getDeliveryLocation().getId() != null) xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.location.id", shipment.getDeliveryLocation().getId()); if (shipment.getDeliveryLocation().getCoordinate() != null) { xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.location.coord[@x]", shipment.getDeliveryLocation().getCoordinate().getX()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.location.coord[@y]", shipment.getDeliveryLocation().getCoordinate().getY()); } if (shipment.getDeliveryLocation().getIndex() != Location.NO_INDEX) { xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.location.index", shipment.getDeliveryLocation().getIndex()); } xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.duration", shipment.getDeliveryServiceTime()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.timeWindows.timeWindow(0).start", shipment.getDeliveryTimeWindow().getStart()); xmlConfig.setProperty( shipmentPathString + "(" + counter + ").delivery.timeWindows.timeWindow(0).end", shipment.getDeliveryTimeWindow().getEnd()); for (int i = 0; i < shipment.getSize().getNuOfDimensions(); i++) { 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); // name if (shipment.getName() != null) { if (!shipment.getName().equals("no-name")) { xmlConfig.setProperty(shipmentPathString + "(" + counter + ").name", shipment.getName()); } } counter++; } }
private void writeSolutions(XMLConf xmlConfig) { if (solutions == null) return; String solutionPath = "solutions.solution"; int counter = 0; for (VehicleRoutingProblemSolution solution : solutions) { xmlConfig.setProperty(solutionPath + "(" + counter + ").cost", solution.getCost()); int routeCounter = 0; for (VehicleRoute route : solution.getRoutes()) { // xmlConfig.setProperty(solutionPath + "(" + counter + ").routes.route(" + routeCounter // + ").cost", route.getCost()); xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").driverId", route.getDriver().getId()); xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").vehicleId", route.getVehicle().getId()); xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").start", route.getStart().getEndTime()); int actCounter = 0; for (TourActivity act : route.getTourActivities().getActivities()) { xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").act(" + actCounter + ")[@type]", act.getName()); if (act instanceof JobActivity) { Job job = ((JobActivity) act).getJob(); if (job instanceof Service) { xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").act(" + actCounter + ").serviceId", job.getId()); } else if (job instanceof Shipment) { xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").act(" + actCounter + ").shipmentId", job.getId()); } else { throw new IllegalStateException( "cannot write solution correctly since job-type is not know. make sure you use either service or shipment, or another writer"); } } xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").act(" + actCounter + ").arrTime", act.getArrTime()); xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").act(" + actCounter + ").endTime", act.getEndTime()); actCounter++; } xmlConfig.setProperty( solutionPath + "(" + counter + ").routes.route(" + routeCounter + ").end", route.getEnd().getArrTime()); routeCounter++; } int unassignedJobCounter = 0; for (Job unassignedJob : solution.getUnassignedJobs()) { xmlConfig.setProperty( solutionPath + "(" + counter + ").unassignedJobs.job(" + unassignedJobCounter + ")[@id]", unassignedJob.getId()); unassignedJobCounter++; } counter++; } }