1
0
Fork 0
mirror of https://github.com/graphhopper/jsprit.git synced 2020-01-24 07:45:05 +01:00

added skill reader/writer

This commit is contained in:
oblonski 2014-07-29 20:04:47 +02:00
parent f56d735b83
commit 3786f8e977
18 changed files with 505 additions and 142 deletions

View file

@ -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+"]";

View file

@ -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<JobConfigReader> jobConfigReaders = new ArrayList<VrpXMLReader.JobConfigReader>();
@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);

View file

@ -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;
}
}

View file

@ -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;
}

View file

@ -243,7 +243,7 @@ public class Shipment extends AbstractJob{
}
public Builder addSkill(String skill) {
public Builder addRequiredSkill(String skill) {
skillBuilder.addSkill(skill);
return this;
}

View file

@ -65,6 +65,7 @@
<xs:element name="typeId" type="xs:string" minOccurs="1" maxOccurs="1"/>
<xs:element name="timeSchedule" type="timeWindowType"/>
<xs:element name="returnToDepot" type="xs:boolean" minOccurs="0" maxOccurs="1"/>
<xs:element name="skills" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:all>
<xs:attribute name="type" type="xs:string" use="optional" />
</xs:complexType>
@ -146,8 +147,8 @@
<xs:element name="timeWindow" type="timeWindowType" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="requiredSkills" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:all>
<xs:attribute name="id" type="xs:string" use="required" />
<xs:attribute name="type" type="xs:string"/>
@ -211,6 +212,7 @@
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="requiredSkills" type="xs:string" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
<xs:attribute name="id" type="xs:string" use="required" />
</xs:complexType>