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:
parent
f56d735b83
commit
3786f8e977
18 changed files with 505 additions and 142 deletions
|
|
@ -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+"]";
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -243,7 +243,7 @@ public class Shipment extends AbstractJob{
|
|||
}
|
||||
|
||||
|
||||
public Builder addSkill(String skill) {
|
||||
public Builder addRequiredSkill(String skill) {
|
||||
skillBuilder.addSkill(skill);
|
||||
return this;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue