/** * */ package vroom.trsp.optimization.mpa; import vroom.common.utilities.optimization.IParameters; import vroom.common.utilities.optimization.IParameters.LSStrategy; import vroom.common.utilities.optimization.SimpleParameters; import vroom.optimization.online.jmsa.IActualRequest; import vroom.optimization.online.jmsa.IScenario; import vroom.optimization.online.jmsa.components.ComponentManager; import vroom.optimization.online.jmsa.components.RequestValidatorBase; import vroom.trsp.MPASolver; import vroom.trsp.datamodel.TRSPInstance; import vroom.trsp.datamodel.TRSPRequest; import vroom.trsp.optimization.InsertionMove; import vroom.trsp.optimization.alns.DestroyRelated; import vroom.trsp.optimization.alns.DestroyStaticRelated; import vroom.trsp.optimization.alns.RepairRegret; import vroom.trsp.util.TRSPLogging; /** * <code>DTRSPRequestValidator</code> * <p> * Creation date: Feb 7, 2012 - 11:37:22 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 DTRSPRequestValidator extends RequestValidatorBase { private final MPASolver mSolver; private final DestroyRelated mDestroy; private final RepairRegret mRepair; private final IParameters mParams; public DTRSPRequestValidator(ComponentManager<?, ?> componentManager) { super(componentManager); mSolver = getMSAProxy().getParameters().get(MPASolver.TRSP_MPA_SOLVER); mDestroy = new DestroyStaticRelated(1, 1, 1, 1); mDestroy.initialize(mSolver.getInstance()); mRepair = new RepairRegret(mSolver.getParams(), mSolver.getTourCtrHandler(), 3, false); mParams = new SimpleParameters(LSStrategy.DET_BEST_IMPROVEMENT, Long.MAX_VALUE, Integer.MAX_VALUE, mSolver.getParams().getRandomStream()); } /* * (non-Javadoc) * @see * vroom.optimization.online.jmsa.components.RequestValidatorBase#isScenarioCompatible(vroom.optimization.online * .jmsa.IScenario, vroom.optimization.online.jmsa.IActualRequest) */ @Override public boolean isScenarioCompatible(IScenario scenario, IActualRequest request) { DTRSPSolution scen = (DTRSPSolution) scenario; TRSPRequest req = (TRSPRequest) request; // FIXME [12/07/03] check if why this seems to reject too many requests // The scenario serves all its current request, try to insert the new request directly if (scen.getUnservedCount() == 0) { InsertionMove mve = InsertionMove.findInsertion(req.getID(), scen, scen.getCostDelegate(), mSolver.getTourCtrHandler(), true, false); if (mve != null && mve.isFeasible()) { return true; } } // [12/06/14] Put more effort on checking whether the scenario is compatible or not // Idea: use related destroy to remove requests then regret repair DTRSPSolution clone = scen.clone(); clone.markAsUnserved(request.getID()); mRepair.repair(clone, mDestroy.destroy(clone, mParams, 0.2), mParams); return clone.getUnservedCount() == 0; } @Override public void requestAccepted(IActualRequest request) { super.requestAccepted(request); TRSPLogging.getSimulationLogger().info( "DTRSPRequestValidator.requestAccepted: accepted request %s", request); getMSAProxy().getInstance().requestReleased(request); // Nothing to do } @Override public void requestRejected(IActualRequest request) { super.requestRejected(request); TRSPLogging.getSimulationLogger().info( "DTRSPRequestValidator.requestRejected: rejected request %s", request); getMSAProxy().getInstance().requestReleased(request); ((TRSPInstance) getMSAProxy().getInstance()).getSimulator().markAsRejected(request.getID()); } }