From 66df42ac2ee805f0f5b76d2c0b8528c8354f0056 Mon Sep 17 00:00:00 2001 From: oblonski <4sschroeder@gmail.com> Date: Wed, 15 Jan 2014 07:13:14 -0500 Subject: [PATCH] modify goldenReader to accomodate the various FSM and HVRP problems --- .../main/java/jsprit/examples/VFMExample.java | 109 ++++++++++++++++++ .../instance/reader/VrphGoldenReader.java | 47 +++++--- .../instance/reader/GoldenReaderTest.java | 40 +++---- 3 files changed, 158 insertions(+), 38 deletions(-) diff --git a/jsprit-examples/src/main/java/jsprit/examples/VFMExample.java b/jsprit-examples/src/main/java/jsprit/examples/VFMExample.java index 025897fc..f304fd03 100644 --- a/jsprit-examples/src/main/java/jsprit/examples/VFMExample.java +++ b/jsprit-examples/src/main/java/jsprit/examples/VFMExample.java @@ -1,5 +1,114 @@ package jsprit.examples; +import java.util.Collection; + +import jsprit.analysis.toolbox.GraphStreamViewer; +import jsprit.analysis.toolbox.SolutionPrinter; +import jsprit.analysis.toolbox.SolutionPrinter.Print; +import jsprit.core.algorithm.VehicleRoutingAlgorithm; +import jsprit.core.algorithm.io.VehicleRoutingAlgorithms; +import jsprit.core.problem.VehicleRoutingProblem; +import jsprit.core.problem.VehicleRoutingProblem.FleetSize; +import jsprit.core.problem.job.Service; +import jsprit.core.problem.solution.VehicleRoutingProblemSolution; +import jsprit.core.problem.vehicle.VehicleImpl; +import jsprit.core.problem.vehicle.VehicleType; +import jsprit.core.problem.vehicle.VehicleTypeImpl; +import jsprit.core.util.Coordinate; +import jsprit.core.util.Solutions; + +/** + * customers (id,x,y,demand) + * 1 22 22 18 + * 2 36 26 26 + * 3 21 45 11 + * 4 45 35 30 + * 5 55 20 21 + * 6 33 34 19 + * 7 50 50 15 + * 8 55 45 16 + * 9 26 59 29 + * 10 40 66 26 + * 11 55 65 37 + * 12 35 51 16 + * 13 62 35 12 + * 14 62 57 31 + * 15 62 24 8 + * 16 21 36 19 + * 17 33 44 20 + * 18 9 56 13 + * 19 62 48 15 + * 20 66 14 22 + * + * vehicles (id,cap,fixed costs, perDistance, #vehicles) at location (40,40) + * 1 120 1000 1.0 2 + * 2 160 1500 1.1 1 + * 3 300 3500 1.4 1 + * + * @author schroeder + * + */ public class VFMExample { + + + public static void main(String[] args) { + + VehicleRoutingProblem.Builder vrpBuilder = VehicleRoutingProblem.Builder.newInstance(); + + //add customers + vrpBuilder.addJob(Service.Builder.newInstance("1", 18).setCoord(Coordinate.newInstance(22, 22)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("2", 26).setCoord(Coordinate.newInstance(36, 26)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("3", 11).setCoord(Coordinate.newInstance(21, 45)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("4", 30).setCoord(Coordinate.newInstance(45, 35)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("5", 21).setCoord(Coordinate.newInstance(55, 20)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("6", 19).setCoord(Coordinate.newInstance(33, 34)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("7", 15).setCoord(Coordinate.newInstance(50, 50)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("8", 16).setCoord(Coordinate.newInstance(55, 45)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("9", 29).setCoord(Coordinate.newInstance(26, 59)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("10", 26).setCoord(Coordinate.newInstance(40, 66)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("11", 37).setCoord(Coordinate.newInstance(55, 56)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("12", 16).setCoord(Coordinate.newInstance(35, 51)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("13", 12).setCoord(Coordinate.newInstance(62, 35)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("14", 31).setCoord(Coordinate.newInstance(62, 57)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("15", 8).setCoord(Coordinate.newInstance(62, 24)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("16", 19).setCoord(Coordinate.newInstance(21, 36)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("17", 20).setCoord(Coordinate.newInstance(33, 44)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("18", 13).setCoord(Coordinate.newInstance(9, 56)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("19", 15).setCoord(Coordinate.newInstance(62, 48)).build()); + vrpBuilder.addJob(Service.Builder.newInstance("20", 22).setCoord(Coordinate.newInstance(66, 14)).build()); + + + //add vehicle - finite fleet + //fixed costs only (and equal variable costs) + //vehicle type1 + VehicleType type1 = VehicleTypeImpl.Builder.newInstance("type_1", 120).setCostPerDistance(1.0).setFixedCost(1000).build(); + VehicleImpl vehicle1 = VehicleImpl.Builder.newInstance("1_1").setLocationCoord(Coordinate.newInstance(40, 40)).setType(type1).build(); + vrpBuilder.addVehicle(vehicle1); + //vehicle type2 + VehicleType type2 = VehicleTypeImpl.Builder.newInstance("type_2", 160).setCostPerDistance(1.0).setFixedCost(1500).build(); + VehicleImpl vehicle2 = VehicleImpl.Builder.newInstance("2_1").setLocationCoord(Coordinate.newInstance(40, 40)).setType(type2).build(); + vrpBuilder.addVehicle(vehicle2); + //vehicle type3 + VehicleType type3 = VehicleTypeImpl.Builder.newInstance("type_3", 300).setCostPerDistance(1.0).setFixedCost(3500).build(); + VehicleImpl vehicle3 = VehicleImpl.Builder.newInstance("3_1").setLocationCoord(Coordinate.newInstance(40, 40)).setType(type3).build(); + vrpBuilder.addVehicle(vehicle3); + + //set fleetsize finite - which actually the default value, thus it does not need to be set + vrpBuilder.setFleetSize(FleetSize.INFINITE); + + //build problem + VehicleRoutingProblem vrp = vrpBuilder.build(); + + VehicleRoutingAlgorithm vra = VehicleRoutingAlgorithms.readAndCreateAlgorithm(vrp, "input/algorithmConfigWithSchrimpfAcceptance.xml"); + Collection solutions = vra.searchSolutions(); + + VehicleRoutingProblemSolution best = Solutions.bestOf(solutions); + + SolutionPrinter.print(vrp, best, Print.VERBOSE); + + new GraphStreamViewer(vrp, best).setRenderDelay(100).display(); + + } } + diff --git a/jsprit-instances/src/main/java/jsprit/instance/reader/VrphGoldenReader.java b/jsprit-instances/src/main/java/jsprit/instance/reader/VrphGoldenReader.java index 48f572a8..d4e793c8 100644 --- a/jsprit-instances/src/main/java/jsprit/instance/reader/VrphGoldenReader.java +++ b/jsprit-instances/src/main/java/jsprit/instance/reader/VrphGoldenReader.java @@ -18,15 +18,12 @@ import jsprit.core.util.Coordinate; /** * Reads modified files from Taillard's website - * http://mistic.heig-vd.ch/taillard/problemes.dir/vrp.dir/vrp.html + * http://mistic.heig-vd.ch/taillard/problemes.dir/vrp.dir/vrp.html. You can find the modified version here: + * jsprit-instances/instances/vrph. * - *

diff. options of VrphType yields to different problem types for - * - vrphe with infinite fleet, i.e. different types with different variable costs and infinite number of vehicles of each type - * - vrphe with finite fleet, i.e. different types with different variable costs and finite number of vehicles of each type - * - vfm, different types with different fixed costs - * - vfmvrc different types with different fixed costs and variable costs + *

See {@link VrphType} what kind of problems can be generated * - *

cxxx3-cxxx6 do not have variable costs and nuVehicle, thus they can only be used for vfm. + *

Note that c20_3-c20_6 do not have variable costs and a limited nuVehicle, thus they can only be used for FSMF. * * @author schroeder * @@ -35,16 +32,21 @@ public class VrphGoldenReader { /** * - * VRPHE_INFINITE - different types with different variable costs and infinite number of vehicles of each type - *

VRPHE_FINITE - different types with different variable costs and finite number of vehicles of each type - *

VFM - different types with different fixed costs - *

VFMVRC - different types with different fixed costs and variable costs - * + * FSMD - Fleet Size and Mix with Dependent costs + *

FSMF - Fleet Size and Mix with Fixed costs + *

FSMFD - Fleet Size and Mix with Fixed and Dependent costs + *

HVRPD - Heterogeneous Vehicle Routing Problem with Dependent costs and finite (limited) fleet + *

HVRPFD - Heterogeneous Vehicle Routing Problem with Fixed and Dependent costs and finite (limited) fleet + * * @author schroeder * */ public enum VrphType { - VRPH_INFINITE, VRPH_FINITE, VFM, VFMVRC + FSMD, + HVRPD, + FSMF, + FSMFD, + HVRPFD } private final VehicleRoutingProblem.Builder vrpBuilder; @@ -87,23 +89,23 @@ public class VrphGoldenReader { else if(trimedLine.startsWith("v")){ VehicleTypeImpl.Builder typeBuilder = VehicleTypeImpl.Builder.newInstance("type_"+tokens[1], Integer.parseInt(tokens[2])); int nuOfVehicles = 1; - if(vrphType.equals(VrphType.VFM)){ + if(vrphType.equals(VrphType.FSMF)){ typeBuilder.setFixedCost(Double.parseDouble(tokens[3])); } - else if(vrphType.equals(VrphType.VFMVRC)){ + else if(vrphType.equals(VrphType.FSMFD)){ typeBuilder.setFixedCost(Double.parseDouble(tokens[3])); if(tokens.length > 4){ typeBuilder.setCostPerDistance(Double.parseDouble(tokens[4])); } else throw new IllegalStateException("option " + vrphType + " cannot be applied with this instance"); } - else if(vrphType.equals(VrphType.VRPH_INFINITE)){ + else if(vrphType.equals(VrphType.FSMD)){ if(tokens.length > 4){ typeBuilder.setCostPerDistance(Double.parseDouble(tokens[4])); } else throw new IllegalStateException("option " + vrphType + " cannot be applied with this instance"); } - else { //VrphType.VRPH_FINITE + else if(vrphType.equals(VrphType.HVRPD)){ if(tokens.length > 4){ typeBuilder.setCostPerDistance(Double.parseDouble(tokens[4])); nuOfVehicles = Integer.parseInt(tokens[5]); @@ -111,6 +113,15 @@ public class VrphGoldenReader { } else throw new IllegalStateException("option " + vrphType + " cannot be applied with this instance"); } + else if (vrphType.equals(VrphType.HVRPFD)){ + if(tokens.length > 4){ + typeBuilder.setFixedCost(Double.parseDouble(tokens[3])); + typeBuilder.setCostPerDistance(Double.parseDouble(tokens[4])); + nuOfVehicles = Integer.parseInt(tokens[5]); + vrpBuilder.setFleetSize(FleetSize.FINITE); + } + else throw new IllegalStateException("option " + vrphType + " cannot be applied with this instance"); + } for(int i=0;i