/** * */ package vroom.trsp.optimization.alns; import java.util.Set; import vroom.common.heuristics.alns.IDestroy; import vroom.common.utilities.optimization.IInstance; import vroom.common.utilities.optimization.IParameters; import vroom.trsp.datamodel.TRSPInstance; import vroom.trsp.datamodel.TRSPSolution; import vroom.trsp.datamodel.TRSPTour; /** * <code>DestroyTimeRelated</code> is an implementation of {@link IDestroy} based on a measure of the relatedness * depending on the time of visit of requests. * <p> * Creation date: May 30, 2011 - 9:46:32 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 DestroyTimeRelated extends DestroyRelated { private Relatedness[][] mEvaluations; /** * Creates a new <code>DestroyRelated</code> * * @param randomization * the parameter <em>p</em> that control the level of randomization (p≥1, p=1 for no randomization) */ public DestroyTimeRelated(double randomization) { super(randomization); } /* (non-Javadoc) * @see vroom.common.heuristics.alns.IDestroy#initialize(vroom.common.utilities.optimization.IInstance) */ @Override public void initialize(IInstance instance) { TRSPInstance i = (TRSPInstance) instance; mEvaluations = new Relatedness[i.getMaxId()][i.getMaxId()]; } @Override protected void initialize(TRSPSolution solution, IParameters params, int remRequests, Set<Integer> candidates) { super.initialize(solution, params, remRequests, candidates); // Evaluate all candidates for (int i : candidates) { for (int j : candidates) { if (i >= j) continue; // Compatible technicians Set<Integer> Ki = solution.getInstance().getCompatibleTechnicians(i); Set<Integer> Kj = solution.getInstance().getCompatibleTechnicians(j); // At least one technician in common boolean compatible = false; for (int t : Ki) if (Kj.contains(t)) { compatible = true; break; } double rij = Double.POSITIVE_INFINITY; if (compatible) { TRSPTour ti = solution.getVisitingTour(i); TRSPTour tj = solution.getVisitingTour(j); rij = Math.abs(ti.getEarliestArrivalTime(i) - tj.getEarliestArrivalTime(j)); } mEvaluations[i][j] = new Relatedness(i, j, rij); mEvaluations[j][i] = new Relatedness(j, i, rij); } } } /* (non-Javadoc) * @see vroom.trsp.optimization.alns.DestroyRelated#evaluateRelatedRequests(int, vroom.trsp.datamodel.TRSPSolution, java.util.Set) */ @Override protected Relatedness[] evaluateRelatedRequests(int seed, TRSPSolution solution, Set<Integer> candidates) { return mEvaluations[seed]; } @Override public String getName() { return "rel-time"; }; @Override public void dispose() { mEvaluations = null; } @Override public DestroyTimeRelated clone() { DestroyTimeRelated clone = new DestroyTimeRelated(getRandomization()); clone.mEvaluations = new Relatedness[mEvaluations.length][mEvaluations.length]; return clone; } }