/**
*
*/
package vroom.trsp.optimization.mpa;
import vroom.optimization.online.jmsa.IActualRequest;
import vroom.optimization.online.jmsa.IDistinguishedSolution;
import vroom.optimization.online.jmsa.ScenarioPool;
import vroom.optimization.online.jmsa.components.ComponentManager;
import vroom.optimization.online.jmsa.components.ISolutionBuilderParam;
import vroom.optimization.online.jmsa.components.SolutionBuilderBase;
import vroom.trsp.datamodel.TRSPInstance;
import vroom.trsp.datamodel.Technician;
/**
* <code>DTRSPSolutionBuilder</code>
* <p>
* Creation date: Feb 9, 2012 - 3:24:28 PM
*
* @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 DTRSPSolutionBuilder extends SolutionBuilderBase {
private final TRSPInstance mInstance;
/**
* Creates a new <code>DTRSPSolutionBuilder</code>
*
* @param componentManager
*/
public DTRSPSolutionBuilder(ComponentManager<?, ?> componentManager) {
super(componentManager);
mInstance = (TRSPInstance) getMSAProxy().getInstance();
}
@Override
public IDistinguishedSolution buildDistinguishedPlan(ISolutionBuilderParam param) {
@SuppressWarnings("unchecked")
final ScenarioPool<DTRSPSolution> pool = (ScenarioPool<DTRSPSolution>) getComponentManager()
.getParentMSAProxy().getScenarioPool();
double[] nodeEval = new double[mInstance.getMaxId()];
double bestScen = Double.POSITIVE_INFINITY;
for (DTRSPSolution scen : pool) {
if (bestScen > scen.getObjectiveValue())
bestScen = scen.getObjectiveValue();
}
// Evaluate all requests in all scenarios
for (DTRSPSolution scen : pool) {
if (scen.getUnservedCount() > 0)
continue;
for (Technician t : mInstance.getFleet()) {
IActualRequest first = scen.getFirstActualRequest(t.getID());
if (first != null)
// nodeEval[first.getID()] += 1; // A request receive a score of 1 each time it appears in first
// position
nodeEval[first.getID()] += bestScen / scen.getObjectiveValue(); // A request receive a score of
// proportional to the scenario
// relative cost each time it
// appears in first
// position
}
}
// Select the best scenario depending on the evaluation of its requests
DTRSPSolution best = null;
double bestScenEval = Double.NEGATIVE_INFINITY;
for (DTRSPSolution scen : pool) {
// if (scen.getUnservedCount() > 0)
// continue;
double scenEval = 0;
for (Technician t : mInstance.getFleet()) {
IActualRequest first = scen.getFirstActualRequest(t.getID());
if (first != null)
scenEval += nodeEval[first.getID()];
}
if (scenEval > bestScenEval) {
bestScenEval = scenEval;
best = scen;
}
}
return best;
}
}