/** * */ package vroom.common.modeling.util; import java.util.Collections; import java.util.List; import vroom.common.modeling.dataModel.Depot; import vroom.common.modeling.dataModel.DynamicInstance; import vroom.common.modeling.dataModel.Fleet; import vroom.common.modeling.dataModel.IRoute; import vroom.common.modeling.dataModel.IVRPInstance; import vroom.common.modeling.dataModel.IVRPRequest; import vroom.common.modeling.dataModel.ListRoute.ArrayListRoute; import vroom.common.modeling.dataModel.Node; import vroom.common.modeling.dataModel.NodeVisit; import vroom.common.modeling.dataModel.Request; import vroom.common.modeling.dataModel.Solution; import vroom.common.modeling.dataModel.StaticInstance; import vroom.common.modeling.dataModel.Vehicle; import vroom.common.modeling.dataModel.VehicleRoutingProblemDefinition; import vroom.common.modeling.dataModel.attributes.PointLocation; /** * <code>CircularInstanceGenerator</code> is a utility class that can be use to generate simple circular instances * <p> * Creation date: Apr 30, 2010 - 11:39:43 AM * * @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a>-<a * href="http://copa.uniandes.edu.co">Copa</a> <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a * href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a> * @version 1.0 */ public class CircularInstanceGenerator { public static IVRPInstance newCircularInstance(int numNodes, List<Node> nodes) { return newCircularInstance(numNodes, nodes, 10); } public static IVRPInstance newCircularInstance(int numNodes, List<Node> nodes, int radius) { Depot depot = new Depot(0, new PointLocation(0, 0)); Vehicle v = new Vehicle(0, "TestTruc", numNodes); CostCalculationDelegate costHelper = new EuclidianDistance(); ArrayListRoute route = new ArrayListRoute(new Solution<IRoute<?>>(new StaticInstance( "TestInstance", 0, Fleet.newHomogenousFleet(1, v), Collections.singletonList(depot), null, costHelper)), v); IVRPInstance instance = new DynamicInstance("CircualInstance", 0, Fleet.newUnlimitedFleet(v), Collections.singletonList(depot), VehicleRoutingProblemDefinition.VRP, costHelper); nodes.add(depot); route.appendNode(new NodeVisit(depot)); for (int n = 1; n <= numNodes; n++) { double x = radius * Math.cos(2 * Math.PI * n / (numNodes + 1)); double y = radius * Math.sin(2 * Math.PI * n / (numNodes + 1)); Node node = new Node(n, new PointLocation(x, y)); nodes.add(node); IVRPRequest req = new Request(n, node); req.setDemands(1); instance.addRequest(req); for (NodeVisit nv : NodeVisit.createNodeVisits(new Request(n, node))) { route.appendNode(nv); } } nodes.add(depot); route.appendNode(new NodeVisit(depot)); return instance; } }