package vroom.trsp.optimization.localSearch; import vroom.common.heuristics.ConstraintHandler; import vroom.common.heuristics.Move; import vroom.common.heuristics.NeighborhoodBase; import vroom.common.utilities.optimization.IInstance; import vroom.common.utilities.optimization.IMove; import vroom.common.utilities.optimization.IParameters; import vroom.trsp.datamodel.ITRSPTour; import vroom.trsp.datamodel.TRSPSolution; import vroom.trsp.datamodel.TRSPTour; import vroom.trsp.optimization.localSearch.TRSPCompositeNeighborhood.CompositeMove; public class TRSPCompositeNeighborhood<M extends IMove, N extends TRSPTourNeighborhood<M>> extends NeighborhoodBase<TRSPSolution, CompositeMove<M>> { private final N mNeighborhood; /** * Creates a new <code>TRSPCompositeNeighborhood</code> * * @param constraintHandler * @param neighborhood */ public TRSPCompositeNeighborhood(ConstraintHandler<TRSPSolution> constraintHandler, N neighborhood) { super(constraintHandler); mNeighborhood = neighborhood; } @Override public boolean executeMove(TRSPSolution solution, IMove move) { @SuppressWarnings("unchecked") CompositeMove<M> mve = (CompositeMove<M>) move; return mNeighborhood.executeMove(mve.getTour(), mve.getMove()); } @Override public void pertub(IInstance instance, TRSPSolution solution, IParameters parameters) { int t = parameters.getRandomStream().nextInt(0, solution.getTourCount()); mNeighborhood.pertub(instance, solution.getTour(t), parameters); } @Override protected CompositeMove<M> randomNonImproving(TRSPSolution solution, IParameters params) { throw new UnsupportedOperationException("randomNonImproving is not implemented yet " + params); } @Override protected CompositeMove<M> randomFirstImprovement(TRSPSolution solution, IParameters params) { throw new UnsupportedOperationException("randomFirstImprovement is not implemented yet " + params); } @Override protected CompositeMove<M> deterministicBestImprovement(TRSPSolution solution, IParameters params) { CompositeMove<M> best = null; for (TRSPTour t : solution) { M mve = mNeighborhood.exploreNeighborhood(t, params); if (mve != null && (best == null || mve.compareTo(best) > 0)) best = new CompositeMove<M>(mve, t); } return best; } @Override protected CompositeMove<M> deterministicFirstImprovement(TRSPSolution solution, IParameters params) { for (TRSPTour t : solution) { M mve = mNeighborhood.exploreNeighborhood(t, params); if (mve != null && mve.isImproving()) return new CompositeMove<M>(mve, t); } return null; } @Override public String getShortName() { return "composite"; } /** * The class <code>CompositeMove</code> is a wrapper around a tour move * <p> * Creation date: Feb 8, 2012 - 4:15:47 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 * @param <MM> */ public static class CompositeMove<MM extends IMove> extends Move { private final MM mMove; /** * Getter for <code>move</code> * * @return the move */ public MM getMove() { return mMove; } private final ITRSPTour mTour; /** * Getter for <code>tour</code> * * @return the tour */ public ITRSPTour getTour() { return mTour; } /** * Creates a new <code>CompositeMove</code> * * @param move * @param tour */ public CompositeMove(MM move, ITRSPTour tour) { mMove = move; mTour = tour; } @Override public int compareTo(IMove o) { return getMove().compareTo(o); } @Override public double getImprovement() { return getMove().getImprovement(); } @Override public void setImprovement(double imp) { getMove().setImprovement(imp); } @Override public boolean isImproving() { return getMove().isImproving(); } @Override public String getMoveName() { return getMove().getMoveName(); } } }