package vroom.trsp.visualization; import java.util.HashMap; import java.util.List; import java.util.Map; import vroom.common.modeling.dataModel.Arc; import vroom.common.modeling.dataModel.Depot; import vroom.common.modeling.dataModel.IArc; import vroom.common.modeling.dataModel.INodeVisit; import vroom.common.modeling.dataModel.IVRPRequest; import vroom.common.modeling.dataModel.Node; import vroom.common.modeling.dataModel.NodeVisit; import vroom.common.modeling.dataModel.attributes.ITimeWindow; import vroom.common.utilities.IObservable; import vroom.common.utilities.IObserver; import vroom.common.utilities.ObserverManager; import vroom.common.utilities.Update; import vroom.trsp.datamodel.ITRSPTour; import vroom.trsp.datamodel.ITourIterator; import vroom.trsp.datamodel.TRSPInstance; import vroom.trsp.datamodel.TRSPRequest; import vroom.trsp.datamodel.TRSPSolution; import vroom.trsp.datamodel.TRSPTour; import edu.uci.ics.jung.graph.DirectedSparseGraph; /** * The Class <code>TRSPInstanceGraph</code> is a specialization of * {@link DirectedSparseGraph} which can be used to represent an * {@link TRSPInstance} graphically by using the Jung library. * <p> * Creation date: March 23, 2011 - 1:45:52 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 TRSPInstanceGraph extends DirectedSparseGraph<INodeVisit, IArc> implements IObserver, IObservable { /** The Constant serialVersionUID. */ private static final long serialVersionUID = 1L; /** The Obs handler. */ private final ObserverManager mObsHandler; /** The Instance. */ private TRSPInstance mInstance; private Map<Integer, INodeVisit> mNodeVisits; /** * Creates a new <code>TRSPInstanceGraph</code>. * * @param instance * the instance to be represented */ public TRSPInstanceGraph(TRSPInstance instance) { super(); mInstance = instance; mObsHandler = new ObserverManager(this); mNodeVisits = new HashMap<Integer, INodeVisit>(); // Add all nodes and depots for (Depot n : getInstance().getDepots()) { INodeVisit v = new NodeVisit(n); mNodeVisits.put(n.getID(), v); mNodeVisits.put(getInstance().getHomeDuplicate(n.getID()), v); addVertex(v); } for (TRSPRequest n : getInstance().getRequests()) { final TRSPRequest r = n; INodeVisit v = new INodeVisit() { @Override public int getID() { return r.getID(); } @Override public int compareTo(INodeVisit o) { return o.getID() - getID(); } @Override public boolean isPickup() { return false; } @Override public boolean isFixed() { return false; } @Override public boolean isDepot() { return false; } @Override public List<INodeVisit> getSuccessors() { return null; } @Override public List<INodeVisit> getPredecesors() { return null; } @Override public IVRPRequest getParentRequest() { return null; } @Override public Node getNode() { return r.getNode(); } @Override public double getDemand() { return getDemand(0); } @Override public double getDemand(int product) { return r.getSparePartRequirement(product); } @Override public void free() { } @Override public void fix() { } @Override public INodeVisit clone() { throw new UnsupportedOperationException(); } @Override public double getServiceTime() { throw new UnsupportedOperationException(); } @Override public ITimeWindow getTimeWindow() { throw new UnsupportedOperationException(); } }; mNodeVisits.put(n.getID(), v); addVertex(v); } } /** * Add the arcs from a tour to this graph. * * @param tour * the tour which arcs will be added */ public void addTour(ITRSPTour tour) { ITourIterator it = tour.iterator(); int pred = it.next(), succ = -1; while (it.hasNext()) { succ = it.next(); addEdge(new Arc(getNodeVisit(pred), getNodeVisit(succ), getInstance().getCostDelegate().getDistance(pred, succ), true), getNodeVisit(pred), getNodeVisit(succ)); pred = succ; } } /** * Add the arcs from a solution to this graph. * * @param solution * the solution which arcs will be added */ public void addSolution(TRSPSolution solution) { for (TRSPTour tour : solution) addTour(tour); } private INodeVisit getNodeVisit(int id) { return mNodeVisits.get(id); } /** * Gets the single instance of DynamicInstanceGraph. * * @return single instance of DynamicInstanceGraph */ public TRSPInstance getInstance() { return mInstance; } /* * (non-Javadoc) * * @see * vroom.common.utilities.IObserver#update(vroom.common.utilities.IObservable * , vroom.common.utilities.Update) */ @Override public void update(IObservable source, Update update) { notifyObservers(null); } /* * (non-Javadoc) * * @see * vroom.common.utilities.IObservable#addObserver(vroom.common.utilities * .IObserver) */ @Override public void addObserver(IObserver o) { mObsHandler.addObserver(o); } /* * (non-Javadoc) * * @see * vroom.common.utilities.IObservable#removeObserver(vroom.common.utilities * .IObserver) */ @Override public void removeObserver(IObserver o) { mObsHandler.removeObserver(o); } /* * (non-Javadoc) * * @see vroom.common.utilities.IObservable#removeAllObservers() */ @Override public void removeAllObservers() { mObsHandler.removeAllObservers(); } /** * Notify observers. * * @param update * the update */ protected void notifyObservers(Update update) { mObsHandler.notifyObservers(update); } public void detach() { mInstance = null; } }