/*
*
*/
package vroom.common.heuristics.vrp;
import java.util.LinkedList;
import java.util.List;
import umontreal.iro.lecuyer.rng.MRG32k3a;
import vroom.common.heuristics.ConstraintHandler;
import vroom.common.heuristics.cw.CWParameters;
import vroom.common.heuristics.cw.algorithms.RandomizedSavingsHeuristic;
import vroom.common.heuristics.cw.kernel.ClarkeAndWrightHeuristic;
import vroom.common.heuristics.vns.VNSParameters;
import vroom.common.heuristics.vns.VariableNeighborhoodSearch;
import vroom.common.heuristics.vns.VariableNeighborhoodSearch.VNSVariant;
import vroom.common.heuristics.vrp.constraints.CapacityConstraint;
import vroom.common.heuristics.vrp.constraints.FixedNodesConstraint;
import vroom.common.modeling.dataModel.ListRoute.ArrayListRoute;
import vroom.common.modeling.dataModel.Fleet;
import vroom.common.modeling.dataModel.IVRPInstance;
import vroom.common.modeling.dataModel.Node;
import vroom.common.modeling.dataModel.Solution;
import vroom.common.modeling.dataModel.Vehicle;
import vroom.common.modeling.util.CircularInstanceGenerator;
import vroom.common.modeling.util.DefaultSolutionFactory;
import vroom.common.modeling.visualization.VRPVisualizationUtilities;
import vroom.common.utilities.logging.LoggerHelper;
import vroom.common.utilities.optimization.INeighborhood;
import vroom.common.utilities.optimization.OptimizationSense;
/**
* <code>VNSNeighborhoodTest</code>
* <p>
* Creation date: Aug 26, 2010 - 3:51:55 PM
*
* @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 VNSNeighborhoodTest {
public static void main(String[] args) {
LoggerHelper.setupRootLogger(LoggerHelper.LEVEL_WARN,
LoggerHelper.LEVEL_DEBUG, true);
CWParameters cwParams = new CWParameters();
ConstraintHandler<Solution<ArrayListRoute>> constraintHandler = new ConstraintHandler<Solution<ArrayListRoute>>();
constraintHandler
.addConstraint(new CapacityConstraint<Solution<ArrayListRoute>>());
constraintHandler
.addConstraint(new FixedNodesConstraint<Solution<ArrayListRoute>>());
cwParams.set(CWParameters.SOLUTION_FACTORY_CLASS,
DefaultSolutionFactory.class);
ClarkeAndWrightHeuristic<Solution<ArrayListRoute>> cw = new ClarkeAndWrightHeuristic<Solution<ArrayListRoute>>(
cwParams, RandomizedSavingsHeuristic.class,
constraintHandler);
List<INeighborhood<Solution<ArrayListRoute>, ?>> neighborhoods = new LinkedList<INeighborhood<Solution<ArrayListRoute>, ?>>();
neighborhoods.add(new SwapNeighborhood<Solution<ArrayListRoute>>(
constraintHandler));
neighborhoods.add(new TwoOptNeighborhood<Solution<ArrayListRoute>>(
constraintHandler));
neighborhoods.add(new OrOptNeighborhood<Solution<ArrayListRoute>>(
constraintHandler));
neighborhoods
.add(new StringExchangeNeighborhood<Solution<ArrayListRoute>>(
constraintHandler));
VNSParameters vnsParams = new VNSParameters(10000, 50000, false, 1000,
100, null, null);
VariableNeighborhoodSearch<Solution<ArrayListRoute>> vns = VariableNeighborhoodSearch
.newVNS(VNSVariant.VND, OptimizationSense.MINIMIZATION, null,
new MRG32k3a(), neighborhoods);
for (int i = 1; i < 4; i += 2) {
int size = 30 * i;
int radius = i;
List<Node> nodes = new LinkedList<Node>();
IVRPInstance instance = CircularInstanceGenerator
.newCircularInstance(size, nodes, radius);
instance.setFleet(Fleet.newUnlimitedFleet(new Vehicle(0, "v", 10)));
cw.initialize(instance);
cw.run();
Solution<ArrayListRoute> sol = cw.getSolution();
VRPVisualizationUtilities.showVisualizationFrame(sol).setTitle(
String.format("Size: %s CW", size));
sol = vns.localSearch(instance, sol, vnsParams);
VRPVisualizationUtilities.showVisualizationFrame(sol).setTitle(
String.format("Size: %s CW + VNS", size));
System.out.printf(
"Circular instance of size %s, radius:%s, opt:%s \n", size,
radius, (2 * Math.PI + 2 * (size / 10)) * radius);
System.out.println(sol);
for (ArrayListRoute r : sol) {
if (!r.getFirstNode().isDepot()) {
System.err.println("Route does not start with a depot");
}
if (!r.getLastNode().isDepot()) {
System.err.println("Route does not end with a depot");
}
}
System.out.println();
}
}
}