/**
*
*/
package vroom.trsp.optimization.rch;
import java.awt.Dimension;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
import javax.swing.JFrame;
import vroom.common.modeling.visualization.DefaultInstanceViewer;
import vroom.common.modeling.visualization.VisualizationFrame;
import vroom.common.utilities.logging.LoggerHelper;
import vroom.trsp.RCHSCSolver;
import vroom.trsp.datamodel.ITRSPTour;
import vroom.trsp.datamodel.TRSPInstance;
import vroom.trsp.datamodel.TRSPRequest;
import vroom.trsp.datamodel.TRSPSolutionChecker;
import vroom.trsp.instances.RndInstanceGenerator;
import vroom.trsp.optimization.split.SplitTourArcBuilder;
import vroom.trsp.optimization.split.TRSPSplit;
import vroom.trsp.util.TRSPGlobalParameters;
import vroom.trsp.util.TRSPLogging;
import vroom.trsp.visualization.TRSPInstanceGraph;
/**
* <code>TRSPSplitVisualization</code>
* <p>
* Creation date: Oct 4, 2011 - 12:57:56 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 TRSPSplitVisualization {
/**
* JAVADOC
*
* @param args
*/
public static void main(String[] args) {
LoggerHelper.setupRootLogger(LoggerHelper.LEVEL_DEBUG, LoggerHelper.LEVEL_DEBUG, false);
// TRSPTestRCHSC.setupGlobalParameters();
TRSPGlobalParameters params = null;
// TRSPInstance instance = TRSPTestRCHSC.readInstance();
TRSPInstance instance = RndInstanceGenerator.generateCircularVRPInstance("circ-10", 10, 3);
params.set(TRSPGlobalParameters.RUN_CVRPTW, true);
RCHSCSolver solver = new RCHSCSolver(instance, params);
// Iterator<IConstraint<ITRSPTour>> it = solver.getCtrHandler().iterator();
// while (it.hasNext()) {
// if (HomeConstraint.class.isAssignableFrom(it.next().getClass()))
// it.remove();
// }
System.out.println(solver.getTourCtrHandler());
testSplit(instance, params, solver);
// testFeasibleTour(instance, params, solver);
}
public static void testSplit(TRSPInstance instance, TRSPGlobalParameters params,
RCHSCSolver solver) {
ArrayList<TRSPRndConstructiveHeuristic> heuristics = new ArrayList<TRSPRndConstructiveHeuristic>(
3);
int kMax = 10;
// RNN
// heuristics
// .add(new RndNearestNeighbor(instance, params, solver.getCtrHandler(), solver.getCostDelegate(), kMax));
//
// // RFI
// heuristics.add(new RndNearestFurthestIns(instance, params, solver.getCtrHandler(), solver.getCostDelegate(),
// kMax, true));
//
// // RNI
// heuristics.add(new RndNearestFurthestIns(instance, params, solver.getCtrHandler(), solver.getCostDelegate(),
// kMax, false));
// RBI
// heuristics.add(new RndBestIns(instance, params, solver.getCtrHandler(), solver.getCostDelegate(), kMax));
heuristics.add(new RndClarkeWright(instance, params, solver.getTourCtrHandler(), solver
.getCostDelegate(), kMax));
TRSPSplit split = new TRSPSplit(new SplitTourArcBuilder(solver.getTourCtrHandler(),
solver.getCostDelegate(), params));
for (TRSPRndConstructiveHeuristic heur : heuristics) {
TRSPLogging.getBaseLogger().info(
"TRSPSplitVisualization.testSplit: First Call -----------------");
heur.generateGiantTour(instance.getTechnician(0));
TRSPLogging.getBaseLogger().info(
"TRSPSplitVisualization.testSplit: Second Call -----------------");
heur.generateGiantTour(instance.getTechnician(0));
TRSPLogging.getBaseLogger().info(
"TRSPSplitVisualization.testSplit: Third Call -----------------");
heur.generateGiantTour(instance.getTechnician(0));
TRSPLogging.getBaseLogger().info(
"TRSPSplitVisualization.testSplit: Fourth Call -----------------");
heur.generateGiantTour(instance.getTechnician(0));
TRSPLogging.getBaseLogger().info(
"TRSPSplitVisualization.testSplit: Fifth Call -----------------");
Collection<ITRSPTour> giantTours = heur.generateGiantTour(instance.getTechnician(0));
Collection<ITRSPTour> tours = new LinkedList<ITRSPTour>();
for (ITRSPTour giantTour : giantTours) {
tours.addAll(split.splitTour(giantTour));
}
display(instance, giantTours, tours, heur.toString(), false);
}
}
public static void testFeasibleTour(TRSPInstance instance, TRSPGlobalParameters params,
RCHSCSolver solver) {
RndNearestNeighbor rnn = new RndNearestNeighbor(instance, params,
solver.getTourCtrHandler(), solver.getCostDelegate(), 6);
Collection<ITRSPTour> tours = new LinkedList<ITRSPTour>();
tours.add(rnn.generateFeasibleTour(instance.getFleet().getVehicle()));
tours.add(rnn.generateFeasibleTour(instance.getFleet().getVehicle()));
tours.add(rnn.generateFeasibleTour(instance.getFleet().getVehicle()));
tours.add(rnn.generateFeasibleTour(instance.getFleet().getVehicle()));
display(instance, null, tours, "", true);
}
public static void display(TRSPInstance instance, Collection<ITRSPTour> giantTours,
Collection<ITRSPTour> tours, String comment, boolean allTours) {
HashSet<Integer> reqs = new HashSet<Integer>();
for (TRSPRequest r : instance.getRequests()) {
reqs.add(r.getID());
}
TRSPInstanceGraph graph = new TRSPInstanceGraph(instance);
if (giantTours != null) {
for (ITRSPTour giantTour : giantTours) {
for (Integer r : giantTour)
reqs.remove(r);
graph.addTour(giantTour);
System.out.println("Giant tour: " + giantTour);
}
}
double cost = 0;
for (ITRSPTour tour : tours) {
if (allTours)
graph.addTour(tour);
System.out.println(" " + tour + " - " + TRSPSolutionChecker.INSTANCE.checkTour(tour));
cost += tour.getTotalCost();
}
System.out.println("Unserved requests: " + reqs);
System.out.println("Total cost: " + cost);
DefaultInstanceViewer view = new DefaultInstanceViewer(graph);
VisualizationFrame frame = new VisualizationFrame(String.format("%s (%s) uns:%s cost:%.2f",
comment, instance.getName(), reqs, cost), view);
frame.setPreferredSize(new Dimension(400, 400));
frame.pack();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}