package vroom.optimization.online.jmsa.vrp;
import vroom.common.modeling.dataModel.NodeInsertion;
import vroom.optimization.online.jmsa.IActualRequest;
import vroom.optimization.online.jmsa.IMSARequest;
import vroom.optimization.online.jmsa.IScenario;
import vroom.optimization.online.jmsa.components.ComponentManager;
import vroom.optimization.online.jmsa.components.ScenarioUpdaterBase;
import vroom.optimization.online.jmsa.utils.MSALogging;
/**
* Creation date: 18-Feb-2010 10:51:14 a.m.<br/>
* <code>VRPRequestInserterBase</code> is a basic implementation of
* {@link ScenarioUpdaterBase} that insert a request in the best position.
*
* @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, only supports single node Requests (no pickup and delivery)
*/
public class VRPScenarioUpdaterBase extends ScenarioUpdaterBase {
/**
* Creates a new component
*
* @param componentManager
* the parent component manager
*/
public VRPScenarioUpdaterBase(ComponentManager<?, ?> componentManager) {
super(componentManager);
}
protected MSAVRPInstance getInstance() {
return (MSAVRPInstance) getComponentManager().getParentMSAProxy()
.getInstance();
}
@Override
public boolean insertRequest(IScenario scenario, IMSARequest request) {
scenario.acquireLock();
VRPScenario s = (VRPScenario) scenario;
VRPRequest r = (VRPRequest) request;
NodeInsertion ins = s.getBestInsertion(r);
boolean b;
// Insert the node in the best position
if (ins != null) {
MSALogging
.getComponentsLogger()
.lowDebug(
"VRPRequestInserterBase.insertRequest: Inserting request %s in position %s of route %s of scenario %s",
request, ins.getPosition(), ins.getRoute(),
scenario);
b = ((VRPScenarioRoute) ins.getRoute()).insertNode(ins, r);
if (r instanceof VRPActualRequest) {
s.actualRequestAdded((VRPScenarioRoute) ins.getRoute(),
(VRPActualRequest) r);
}
} else {
b = false;
}
scenario.releaseLock();
return b;
}
@Override
public boolean endOfServiceUpdate(IScenario scenario, int resourceId,
IActualRequest servedRequest) {
boolean r = false;
VRPScenario s = (VRPScenario) scenario;
s.acquireLock();
// Check that the last fixed request is the good one
if (s.getLastFixedRequest(resourceId) == null
// Newly generated scenarios are assumed to be coherent with the system
// state
|| s.getLastFixedRequest(resourceId).getID() == servedRequest
.getID()) {
// Mark the last request as served
s.markLastVisitAsServed(resourceId);
r = true;
}
s.releaseLock();
return r;
}
@Override
public boolean startServicingUpdate(IScenario scenario, int resourceId) {
if (scenario instanceof VRPScenario
&& resourceId < ((VRPScenario) scenario).getRouteCount()) {
scenario.acquireLock();
if (((VRPScenario) scenario).getRoute(resourceId).getFirstNode()
.isDepot()) {
// Fix the first request (depot)
((VRPScenario) scenario).fixFirstActualRequest(resourceId);
// Mark the first request as served as the vehicle left the
// depot
((VRPScenario) scenario).markLastVisitAsServed(resourceId);
scenario.releaseLock();
return true;
}
}
scenario.releaseLock();
return false;
}
@Override
public boolean stopServicingUpdate(IScenario scenario, int resourceId) {
if (scenario instanceof VRPScenario) {
scenario.acquireLock();
boolean b = ((VRPScenario) scenario).getRoute(resourceId).length() == 0
|| ((VRPScenario) scenario).getRoute(resourceId).length() == 1
&& ((VRPScenario) scenario).getRoute(resourceId)
.getFirstNode().isDepot();
scenario.releaseLock();
return b;
} else {
return false;
}
}
@Override
public boolean enforceDecision(IScenario scenario, IActualRequest request,
int resourceId) {
boolean b = false;
scenario.acquireLock();
if (scenario.getFirstActualRequest(resourceId) == null) {
if (request == null) {
return true;
} else {
return false;
}
}
if (scenario.getFirstActualRequest(resourceId).getID() == request
.getID()) {
scenario.fixFirstActualRequest(resourceId);
b = true;
}
scenario.releaseLock();
return b;
}
@Override
public boolean startOfServiceUpdate(IScenario scenario, int resourceId,
IActualRequest request) {
return true;
}
}// end VRPRequestInserterBase