/**
*
*/
package vroom.common.modeling.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.math.RoundingMode;
import java.util.LinkedList;
import java.util.List;
import vroom.common.modeling.dataModel.Depot;
import vroom.common.modeling.dataModel.DistanceMatrix;
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.DeterministicDemand;
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.EuclidianDistance;
import vroom.common.utilities.dataModel.IDHelper;
/**
* <code>SolomonPersistenceHelper</code> is an extension of {@link FlatFilePersistenceHelper} for the parsing of the
* Solomon instances in the format used in <a href="http://www2.imm.dtu.dk/~jla/solomon.html">http://www2
* .imm.dtu.dk/~jla/solomon.html</a>
* <p>
* Creation date: Jun 28, 2010 - 4:13:26 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 SolomonPersistenceHelper extends FlatFilePersistenceHelper {
private int mSize;
private final static IDHelper ID_HELPER = new IDHelper();
private final int mPrecision;
/**
* Creates a new <code>SolomonPersistenceHelper</code>
*
* @param precision
* the precision used for distance truncation, default is 1, a negative value means no truncating
*/
public SolomonPersistenceHelper(int precision) {
mPrecision = precision;
}
/**
* Creates a new <code>SolomonPersistenceHelper</code>
*/
public SolomonPersistenceHelper() {
this(-1);
}
/**
* Loading of an instance.
*
* @param input
* the input file
* @param params
* (Integer) the size of the desired instance (will truncate the instance to the <code>size</code> first
* customers)
* @return the loaded instance
*/
@Override
public IVRPInstance readInstance(File input, Object... params) throws IOException {
if (params.length > 0 && params[0] instanceof Integer) {
mSize = (Integer) params[0];
if (mSize < 1 || mSize > 100) {
throw new IllegalArgumentException("Size must be between 1 and 100");
}
} else if (mSize == 0) {
mSize = 100;
}
return super.readInstance(input, params);
}
/*
* (non-Javadoc)
* @see vroom.common.modeling.io.FlatFilePersistenceHelper#finalizeInstance(
* vroom.common.modeling.dataModel.IVRPInstance, java.lang.Object)
*/
@Override
protected void finalizeInstance(IVRPInstance instance, Object... params) {
DistanceMatrix ch = new DistanceMatrix(instance);
// Truncate distances
if (mPrecision >= 0)
ch.setPrecision(mPrecision, RoundingMode.FLOOR);
instance.setCostHelper(ch);
}
/*
* (non-Javadoc)
* @see vroom.common.modeling.io.FlatFilePersistenceHelper#initializeInstance (java.io.File,
* java.io.BufferedReader, java.lang.Object)
*/
@Override
protected IVRPInstance initializeInstance(File input, BufferedReader reader, Object... params)
throws IOException {
// Name in first line
String name = reader.readLine();
// Blank line
reader.readLine();
// VEHICLE line
reader.readLine();
// Header line
reader.readLine();
// Number Capacity
String[] fleetDef = reader.readLine().split("\\s+");
int fleetSize = Integer.valueOf(fleetDef[1]);
double capacity = Double.valueOf(fleetDef[2]);
// Blank line
reader.readLine();
// CUSTOMER line
reader.readLine();
// Header line
reader.readLine();
// Blank line
reader.readLine();
// Depot
String[] depotDef = reader.readLine().split("\\s+");
Depot depot = new Depot(0, new PointLocation(Double.valueOf(depotDef[2]),
Double.valueOf(depotDef[3])));
depot.setAttribute(NodeAttributeKey.TIME_WINDOW,
new SimpleTimeWindow(Long.valueOf(depotDef[5]), Long.valueOf(depotDef[6]), false,
false));
// DataSection
IVRPInstance instance = new StaticInstance(name, ID_HELPER.nextId(),
VehicleRoutingProblemDefinition.CVRPTW);
instance.setFleet(Fleet.newHomogenousFleet(fleetSize, new Vehicle(0, "Vehicle", capacity)));
EuclidianDistance dh = new EuclidianDistance();
dh.setPrecision(mPrecision, RoundingMode.HALF_EVEN);
instance.setCostHelper(dh);
instance.setSymmetric(true);
List<Depot> depots = new LinkedList<Depot>();
depots.add(depot);
instance.setDepots(depots);
return instance;
}
/*
* (non-Javadoc)
* @see vroom.common.modeling.io.FlatFilePersistenceHelper#processLine(vroom
* .common.modelling.dataModel.IVRPInstance, java.lang.String, int, java.lang.Object)
*/
@Override
protected void parseLine(IVRPInstance instance, String line, int lineNumber, Object... params) {
if (line == null || line.length() == 0)
return;
String[] custDef = line.split("\\s+");
int id = Integer.valueOf(custDef[0]);
double x = Double.valueOf(custDef[1]);
double y = Double.valueOf(custDef[2]);
int d = Integer.valueOf(custDef[3]);
int ltw = Integer.valueOf(custDef[4]);
int utw = Integer.valueOf(custDef[5]);
int st = Integer.valueOf(custDef[6]);
Request r = new Request(id, new Node(id, new PointLocation(x, y)));
r.setAttribute(RequestAttributeKey.DEMAND, new DeterministicDemand(d));
r.setAttribute(RequestAttributeKey.TIME_WINDOW, new SimpleTimeWindow(ltw, utw));
r.setAttribute(RequestAttributeKey.SERVICE_TIME, new Duration(st));
instance.addRequest(r);
}
}