package vroom.common.modeling.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import vroom.common.modeling.dataModel.Depot;
import vroom.common.modeling.dataModel.Fleet;
import vroom.common.modeling.dataModel.IVRPInstance;
import vroom.common.modeling.dataModel.Node;
import vroom.common.modeling.dataModel.Request;
import vroom.common.modeling.dataModel.StaticInstance;
import vroom.common.modeling.dataModel.Vehicle;
import vroom.common.modeling.dataModel.VehicleRoutingProblemDefinition;
import vroom.common.modeling.dataModel.attributes.Duration;
import vroom.common.modeling.dataModel.attributes.NodeAttributeKey;
import vroom.common.modeling.dataModel.attributes.PointLocation;
import vroom.common.modeling.dataModel.attributes.RequestAttributeKey;
import vroom.common.modeling.dataModel.attributes.SimpleTimeWindow;
import vroom.common.modeling.util.BufferedDistance;
import vroom.common.modeling.util.EuclidianDistance;
import vroom.common.utilities.dataModel.IDHelper;
/**
* The Class <code>ChristofidesPersistenceHelper</code>
* <p>
* Creation date: Aug 23, 2010 - 2:20:49 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 ChristofidesPersistenceHelper extends FlatFilePersistenceHelper {
private static final IDHelper sIdHelper = new IDHelper();
private IDHelper mNodeIdHelper;
private int mDropTime;
@Override
protected void finalizeInstance(IVRPInstance instance, Object... params) {
}
@Override
protected void parseLine(IVRPInstance instance, String line, int lineNumber, Object... params) {
String[] node = line.split("\\s");
int x = Integer.parseInt(node[0]);
int y = Integer.parseInt(node[1]);
int d = Integer.parseInt(node[2]);
int id = mNodeIdHelper.nextId();
Request req = new Request(id, new Node(id, new PointLocation(x, y)));
req.setDemands(d);
req.setAttribute(RequestAttributeKey.SERVICE_TIME, new Duration(mDropTime));
instance.addRequest(req);
}
@Override
public StaticInstance readInstance(File input, Object... params) throws IOException {
return (StaticInstance) super.readInstance(input, params);
}
@Override
protected StaticInstance initializeInstance(File input, BufferedReader reader, Object... params)
throws IOException {
mNodeIdHelper = new IDHelper();
String[] firstLine = reader.readLine().replaceFirst("\\s", "").split("\\s");
String[] secondLine = reader.readLine().replaceFirst("\\s", "").split("\\s");
// int size = Integer.parseInt(firstLine[0]);
int cap = Integer.parseInt(firstLine[1]);
int maxRouteTime = Integer.parseInt(firstLine[2]);
mDropTime = Integer.parseInt(firstLine[3]);
int dx = Integer.parseInt(secondLine[0]);
int dy = Integer.parseInt(secondLine[1]);
StaticInstance instance = new StaticInstance(input.getName().replace(".txt", ""),
sIdHelper.nextId(), VehicleRoutingProblemDefinition.VRP);
instance.setFleet(Fleet.newUnlimitedFleet(new Vehicle(0, "v", cap)));
Depot depot = new Depot(mNodeIdHelper.nextId(), "depot", new PointLocation(dx, dy));
if (maxRouteTime < 999999)
depot.setAttribute(NodeAttributeKey.TIME_WINDOW, new SimpleTimeWindow(0, maxRouteTime));
instance.setDepots(Collections.singletonList(depot));
instance.setCostHelper(new BufferedDistance(new EuclidianDistance()));
return instance;
}
}