/* * */ package vroom.optimization.online.jmsa.vrp; import vroom.optimization.online.jmsa.DistinguishedSolutionBase; import vroom.optimization.online.jmsa.IActualRequest; import vroom.optimization.online.jmsa.IDistinguishedSolution; import vroom.optimization.online.jmsa.components.ComponentManager; import vroom.optimization.online.jmsa.components.ConsensusSolutionBuilder; import vroom.optimization.online.jmsa.components.ISolutionBuilderParam; /** * <code>VRPConsensusSolutionBuilder</code> is a base implementation of the * Consensus algorithm introduced by Bent and Van Hentenryck (2004) for VRP * problems. * <p> * Creation date: Sep 9, 2010 - 11:29:50 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 VRPConsensusSolutionBuilder extends ConsensusSolutionBuilder { /** * Creates a new <code>VRPConsensusSolutionBuilder</code> * * @param componentManager */ public VRPConsensusSolutionBuilder(ComponentManager<?, ?> componentManager) { super(componentManager); } @Override public IDistinguishedSolution buildDistinguishedPlan( ISolutionBuilderParam param) { IDistinguishedSolution s = super.buildDistinguishedPlan(param); // No suitable request was found, force return to the first depot if (s.getNextRequest() == null) { s = new DistinguishedSolutionBase(new VRPActualRequest( getInstance().getDepotsVisits().iterator().next())); } return s; } @Override protected boolean isRequestFeasible(IActualRequest req) { boolean feasible = true; VRPActualRequest r = (VRPActualRequest) req; for (int p = 0; p < getInstance().getFleet().getVehicle() .getCompartmentCount(); p++) { if (r.getDemand(p) + getInstance().getCurrentLoad(0, p) > getInstance() .getFleet().getVehicle().getCapacity(p)) { feasible = false; break; } } return super.isRequestFeasible(req) && feasible; } protected MSAVRPInstance getInstance() { return (MSAVRPInstance) getComponentManager().getParentMSAProxy() .getInstance(); } }