/** * */ package vroom.trsp.optimization.constraints; import vroom.common.utilities.optimization.IMove; import vroom.trsp.datamodel.ITRSPTour; import vroom.trsp.datamodel.ITourIterator; import vroom.trsp.datamodel.TRSPTour; import vroom.trsp.datamodel.TRSPTour.TRSPTourIterator; import vroom.trsp.optimization.InsertionMove; import vroom.trsp.optimization.localSearch.TRSPShift.TRSPShiftMove; import vroom.trsp.optimization.localSearch.TRSPTwoOpt.TRSPTwoOptMove; import vroom.trsp.sim.TRSPSimulator; /** * <code>ServicedRequestsConstraint</code> is used to model the fact that already serviced requests cannot be moved * within a solution. * <p> * Creation date: Nov 10, 2011 - 9:32:18 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 ServicedRequestsConstraint extends TourConstraintBase { /** * Creates a new <code>ServicedRequestsConstraint</code> * * @param simulator */ public ServicedRequestsConstraint() { } @Override public int firstInfeasibleNode(ITRSPTour tour) { return checkFeasibility(tour).getInfeasibleNode(); } @Override protected FeasibilityState checkFeasibility(ITRSPTour tour) { TRSPSimulator sim = tour.getInstance().getSimulator(); if (sim != null) { TRSPTour refTour = sim.getCurrentSolution().getTour(tour.getTechnicianId()); if (tour.length() < refTour.length()) return new FeasibilityState(tour.getLastNode(), "Tour is shorter than reference tour (tour:%s ref:%s)", tour, refTour); ITourIterator it = tour.iterator(); TRSPTourIterator refIt = refTour.iterator(); while (refIt.hasNext()) { int ref = refIt.next(); int n = it.next(); if (ref != n) { return new FeasibilityState(n, "Found %s when expecting %s (tour:%s ref:%s)", n, ref, tour, refTour); } } } return new FeasibilityState(); } @Override protected boolean isTwoOptFeasible(ITRSPTour tour, TRSPTwoOptMove move) { TRSPSimulator sim = tour.getSolution().getInstance().getSimulator(); return sim == null || !sim.isServedOrAssigned(move.getFirst()) && !sim.isServedOrAssigned(move.getSecond()); } @Override protected boolean isShiftFeasible(ITRSPTour tour, TRSPShiftMove move) { TRSPSimulator sim = tour.getSolution().getInstance().getSimulator(); return sim == null || !sim.isServedOrAssigned(move.getNode()) && !sim.isServedOrAssigned(move.getNewSucc()); } @Override protected boolean isInsFeasible(ITRSPTour tour, InsertionMove move) { TRSPSimulator sim = tour.getSolution().getInstance().getSimulator(); return sim == null || sim.isStaticSetting() || (!sim.isServedOrAssigned(move.getInsertionSucc()) && !sim.isServedOrAssigned(move.getNodeId()) && (!move.isDepotTrip() || !sim .isServedOrAssigned(move.getDepotSucc()))); } @Override public int checkFeasibility(ITRSPTour tour, IMove move) { return isFeasible(tour, move) ? 3 : 2; } }