package vroom.common.modeling.dataModel;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
/**
* <code>ListRoute</code> is an extension of {@link RouteBase} that use a {@link List} to store the sequence of
* {@link INodeVisit}.
*
* @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 #created 15-Feb-2010 11:29:49 a.m.
*/
public abstract class ListRoute extends RouteBase {
/** The m visits. */
final List<INodeVisit> mNodes;
/**
* Creates a new <code>ArrayListRoute</code> associated with the given <code>parentSolution</code> and
* <code>vehicle</code>.
*
* @param parentSolution
* the {@link Solution} that contains this route
* @param vehicle
* the {@link Vehicle} associated wiht this solution
* @see RouteBase#RouteBase(Solution, Vehicle)
*/
public ListRoute(IVRPSolution<?> parentSolution, Vehicle vehicle) {
super(parentSolution, vehicle);
mNodes = newList();
}
abstract List<INodeVisit> newList();
/*
* (non-Javadoc)
*
* @see
* vroom.common.modeling.dataModel.RouteBase#appendNodeImplem(vroom.modelling
* .VroomModelling.dataModel.INodeVisit)
*/
@Override
protected synchronized boolean appendNodeImplem(INodeVisit node) {
return mNodes.add(node);
}
/*
* (non-Javadoc)
*
* @see
* vroom.common.modeling.dataModel.RouteBase#appendImplem(java.util.List)
*/
@Override
protected boolean appendNodesImplem(List<? extends INodeVisit> nodes) {
return mNodes.addAll(nodes);
}
/*
* (non-Javadoc)
*
* @see
* vroom.common.modeling.dataModel.RouteBase#appendRouteImplem(vroom.modelling
* .VroomModelling.dataModel.IRoute)
*/
@Override
protected boolean appendRouteImplem(IRoute<? extends INodeVisit> appendedRoute) {
return mNodes.addAll(appendedRoute.getNodeSequence());
}
@Override
public boolean contains(INodeVisit node) {
return mNodes.contains(node);
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#extractNodeImplem(int)
*/
@Override
protected synchronized INodeVisit[] extractNodeImplem(int index) {
INodeVisit[] r = new INodeVisit[] { index > 0 ? getNodeAt(index - 1) : null, null,
index < length() - 1 ? getNodeAt(index + 1) : null };
r[1] = mNodes.remove(index);
return r;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#extractSubrouteImplem(int,
* int)
*/
@Override
protected synchronized Object[] extractNodesImplem(int start, int end) {
Object[] r = new Object[] { start > 0 ? getNodeAt(start - 1) : null, null,
end < length() - 1 ? getNodeAt(end + 1) : null };
// Creates a copy of the sublist
r[1] = new ArrayList<INodeVisit>(mNodes.subList(start, end + 1));
// Remove the range
mNodes.subList(start, end + 1).clear();
return r;
}
@Override
public INodeVisit getFirstNode() {
return length() > 0 ? getNodeAt(0) : null;
}
@Override
public INodeVisit getLastNode() {
return length() > 0 ? getNodeAt(length() - 1) : null;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#getNodeAtImplem(int)
*/
@Override
protected synchronized INodeVisit getNodeAtImplem(int index) {
return mNodes.get(index);
}
@Override
public int getNodePosition(INodeVisit node) {
return mNodes.indexOf(node);
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#getNodeSequence()
*/
@Override
public List<INodeVisit> getNodeSequence() {
return new ArrayList<INodeVisit>(mNodes);
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#insertNodeImplem(int,
* vroom.common.modeling.dataModel.INodeVisit)
*/
@Override
protected synchronized INodeVisit[] insertNodeImplem(int index, INodeVisit node) {
INodeVisit[] r = new INodeVisit[] { index > 0 ? getNodeAt(index - 1) : null,
index < length() ? getNodeAt(index) : null };
mNodes.add(index, node);
return r;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#insertSubrouteImplem(int,
* java.util.List)
*/
@Override
protected synchronized INodeVisit[] insertNodesImplem(int index,
List<? extends INodeVisit> subroute) {
INodeVisit[] r = new INodeVisit[] { index > 0 ? getNodeAt(index - 1) : null,
index < length() ? getNodeAt(index) : null };
mNodes.addAll(index, subroute);
return r;
}
/*
* (non-Javadoc)
*
* @see java.lang.Iterable#iterator()
*/
@Override
public synchronized ListIterator<INodeVisit> iterator() {
return mNodes.listIterator();
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#length()
*/
@Override
public synchronized int length() {
return mNodes.size();
}
@Override
protected synchronized INodeVisit[] removeImplem(INodeVisit node) {
int idx = mNodes.indexOf(node);
if (idx == -1) {
return null;
}
INodeVisit[] neigh = new INodeVisit[2];
neigh[0] = idx > 0 ? getNodeAt(idx - 1) : null;
neigh[1] = idx < length() - 1 ? getNodeAt(idx + 1) : null;
mNodes.remove(idx);
return neigh;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#revertSubRouteImplem(int,
* int)
*/
@Override
protected synchronized INodeVisit[] reverseSubrouteImplem(int start, int end) {
INodeVisit[] r = new INodeVisit[] { start > 0 ? getNodeAt(start - 1) : null,
getNodeAt(start), getNodeAt(end), end < length() - 1 ? getNodeAt(end + 1) : null };
Collections.reverse(mNodes.subList(start, end + 1));
return r;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#setNodeAtImplem(int,
* vroom.common.modeling.dataModel.INodeVisit)
*/
@Override
protected synchronized INodeVisit[] setNodeAtImplem(int index, INodeVisit node) {
INodeVisit[] r = new INodeVisit[] { index > 0 ? getNodeAt(index - 1) : null, null,
index < length() - 1 ? getNodeAt(index + 1) : null };
r[1] = mNodes.set(index, node);
return r;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#subrouteImplem(int, int)
*/
@Override
protected synchronized List<INodeVisit> subrouteImplem(int start, int end) {
return new ArrayList<INodeVisit>(mNodes.subList(start, end + 1));
}
/**
* The class <code>ArrayListRoute</code> is an extension of {@link ListRoute} that relies on an instance of
* {@link ArrayList} to store the list of node visits.
* <p>
* Creation date: Apr 30, 2013 - 1:14:11 PM
*
* @author vpillac, <a href="http://www.nicta.com.au">National ICT Australia</a>
* @version 1.0
*/
public static class ArrayListRoute extends ListRoute {
@Override
List<INodeVisit> newList() {
return new ArrayList<INodeVisit>();
}
public ArrayListRoute(IVRPSolution<?> parentSolution, Vehicle vehicle) {
super(parentSolution, vehicle);
}
@Override
public ArrayListRoute clone() {
ArrayListRoute clone = new ArrayListRoute(getParentSolution(), getVehicle());
clone.appendRoute(this);
return clone;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#extractSubRoute(int,
* int)
*/
@SuppressWarnings("unchecked")
@Override
protected Object[] extractSubrouteImplem(int start, int end) {
ArrayListRoute result = new ArrayListRoute(getParentSolution(), getVehicle());
Object[] r = extractNodesImplem(start, end);
result.appendNodes((List<INodeVisit>) r[1]);
r[1] = result;
return r;
}
}
/**
* The class <code>LinkedListRoute</code> is an extension of {@link ListRoute} that relies on an instance of
* {@link LinkedList} to store the list of node visits.
* <p>
* Creation date: Apr 30, 2013 - 1:15:43 PM
*
* @author vpillac, <a href="http://www.nicta.com.au">National ICT Australia</a>
* @version 1.0
*/
public static class LinkedListRoute extends ListRoute {
@Override
List<INodeVisit> newList() {
return new LinkedList<>();
}
public LinkedListRoute(IVRPSolution<?> parentSolution, Vehicle vehicle) {
super(parentSolution, vehicle);
}
@Override
public LinkedListRoute clone() {
LinkedListRoute clone = new LinkedListRoute(getParentSolution(), getVehicle());
clone.appendRoute(this);
return clone;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#extractSubRoute(int,
* int)
*/
@SuppressWarnings("unchecked")
@Override
protected Object[] extractSubrouteImplem(int start, int end) {
LinkedListRoute result = new LinkedListRoute(getParentSolution(), getVehicle());
Object[] r = extractNodesImplem(start, end);
result.appendNodes((List<INodeVisit>) r[1]);
r[1] = result;
return r;
}
/*
* (non-Javadoc)
*
* @see vroom.common.modeling.dataModel.RouteBase#extractNodeImplem(int)
*/
@Override
protected synchronized INodeVisit[] extractNodeImplem(int index) {
if (index == 0) {
INodeVisit[] nodes = new INodeVisit[3];
nodes[1] = ((LinkedList<INodeVisit>) mNodes).removeFirst();
nodes[2] = mNodes.isEmpty() ? null : ((LinkedList<INodeVisit>) mNodes).getFirst();
return nodes;
} else if (index == length() - 1) {
INodeVisit[] nodes = new INodeVisit[3];
nodes[1] = ((LinkedList<INodeVisit>) mNodes).removeLast();
nodes[0] = mNodes.isEmpty() ? null : ((LinkedList<INodeVisit>) mNodes).getLast();
return nodes;
} else {
return super.extractNodeImplem(index);
}
}
}
}// end ArrayListRoute