/**
*
*/
package vroom.trsp.datamodel.costDelegates;
import static org.junit.Assert.assertEquals;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.ListIterator;
import java.util.Random;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import vroom.common.utilities.Constants;
import vroom.trsp.bench.TRSPRunBase;
import vroom.trsp.datamodel.TRSPInstance;
import vroom.trsp.datamodel.TRSPRequest;
import vroom.trsp.datamodel.TRSPSolution;
import vroom.trsp.datamodel.TRSPSolutionCheckerBase;
import vroom.trsp.datamodel.TRSPTour;
import vroom.trsp.optimization.InsertionMove;
import vroom.trsp.optimization.constraints.HomeConstraint;
import vroom.trsp.optimization.constraints.SparePartsConstraint;
import vroom.trsp.optimization.constraints.TWConstraint;
import vroom.trsp.optimization.constraints.ToolsConstraint;
import vroom.trsp.optimization.constraints.TourConstraintHandler;
/**
* <code>TRSPWorkingTimeTest</code> is a test case for {@link TRSPWorkingTime}
* <p>
* Creation date: Mar 9, 2012 - 12:58:37 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 TRSPWorkingTimeTest {
private static TRSPRunBase sRun;
private static TRSPInstance sInstance;
private static TRSPWorkingTime sWT;
private static TourConstraintHandler sCtr;
private TRSPSolution mSolution;
private TRSPTour mTour;
private final int sRep = 500;
private final int sRep2 = 5;
private Random mRnd;
@BeforeClass
public static void setUpBeforeClass() {
sRun = TRSPRunBase.newTRSPRunTest("RC201.100_25-5-5-5.txt", TRSPRunBase.CFG_TRSP, 10);
sInstance = sRun.getInstance();
sCtr = new TourConstraintHandler(new HomeConstraint(), new TWConstraint(),
new ToolsConstraint(), new SparePartsConstraint());
sWT = new TRSPWorkingTime();
}
@Before
public void setUp() {
mSolution = new TRSPSolution(sInstance, sWT);
mTour = mSolution.getTour(0);
mTour.initialize();
}
InsertionMove insertRequest(boolean execute) {
InsertionMove mve = null;
ArrayList<Integer> unserved = new ArrayList<>(mSolution.getUnservedRequests());
Collections.shuffle(unserved, mRnd);
ListIterator<Integer> it = unserved.listIterator(unserved.size() - 1);
while (mve == null && it.hasPrevious()) {
// Pick a request
int r = it.previous();
it.remove();
mSolution.markAsServed(r);
// Insert request
mve = InsertionMove.findInsertion(r, mTour, mTour.getCostDelegate(), sCtr, false, true);
if (mve != null && (execute && !InsertionMove.executeMove(mve))) {
mve = null;
}
}
return mve;
}
/**
* Test method for
* {@link vroom.trsp.datamodel.costDelegates.TRSPWorkingTime#evaluateGenericTour(vroom.trsp.datamodel.ITRSPTour)}.
*/
@Test
public void testEvaluateGenericTour() {
mRnd = new Random(0);
System.out.println("testEvaluateGenericTour");
for (int i = 0; i < sRep; i++) {
InsertionMove mve = insertRequest(true);
while (mve != null) {
double checkWT = TRSPSolutionCheckerBase.evaluateTotalDuration(mTour, -1);
double cdWT = mTour.getCostDelegate().evaluateTour(mTour, true);
// System.out.printf("check:%5.2f cd:%5.2f tour:%5.2f - %s\n", checkWT, cdWT, tourWT,
// mTour);
assertEquals(checkWT, cdWT, 1E-6);
mve = insertRequest(true);
}
}
}
/**
* Test method for
* {@link vroom.trsp.datamodel.costDelegates.TRSPWorkingTime#evaluateInsMove(vroom.trsp.optimization.InsertionMove)}
* .
*/
@Test
public void testEvaluateInsMove() {
mRnd = new Random(1);
System.out.println("testEvaluateInsMove");
for (int k = 0; k < sRep; k++) {
mTour.clear();
mTour.initialize();
for (TRSPRequest r : sInstance.getRequests())
mSolution.markAsUnserved(r.getID());
double costBefore = TRSPSolutionCheckerBase.evaluateTotalDuration(mTour, -1);
InsertionMove mve = insertRequest(true);
double costAfter = TRSPSolutionCheckerBase.evaluateTotalDuration(mTour, -1);
while (mve != null) {
assertEquals(mve.toString(), costAfter - costBefore, mve.getCost(),
Constants.getZeroTolerance());
costBefore = TRSPSolutionCheckerBase.evaluateTotalDuration(mTour, -1);
mve = insertRequest(true);
costAfter = TRSPSolutionCheckerBase.evaluateTotalDuration(mTour, -1);
}
if (mTour.length() <= 5)
continue;
// At this stage we have a complete tour
for (int kk = 0; kk < sRep2; kk++) {
System.out.println();
// Remove two requests randomly and reinsert them at the same position
int[] idx = new int[] { mRnd.nextInt(mTour.length() - 2),
mRnd.nextInt(mTour.length() - 2) };
while (idx[0] == idx[1])
idx = new int[] { mRnd.nextInt(mTour.length() - 2),
mRnd.nextInt(mTour.length() - 2) };
Arrays.sort(idx);
double old = mTour.getMinimalDuration();
int r = mTour.getNodeAt(idx[0] + 1);
int m = mTour.getPred(r), n = mTour.getSucc(r);
int q = mTour.getNodeAt(idx[1] + 1);
int i = mTour.getPred(q), j = mTour.getSucc(q);
// System.out.printf("(%s,%s,%s,...,%s,%s,%s) %s\n", m, r, n, i, q, j, mTour.getNodeSeqString());
mTour.removeNode(r);
mTour.removeNode(q);
double tmp = mTour.getMinimalDuration();
double eval = sWT.evaluateDetour(mTour, m, r, n, i, q, j, false);
mTour.insertAfter(m, r);
mTour.insertAfter(i, q);
// System.out.printf("old=%3.0f tmp=%3.0f new=%3.0f eval=%3.0f real=%3.0f\n", old,
// tmp, mTour.getMinimalDuration(), eval, old - tmp);
// System.out
// .printf("F0f'=%3.2f Di'=%3.2f Ar=%3.2f Aq=%3.2f An=%3.2f Wr=%3.2f W0q=%3.2f W0j'=%3.2f W0f'=%3.2f Aj'=%3.2f\n",
// mTour.getFwdSlackTime(mTour.getFirstNode()),
// mTour.getEarliestDepartureTime(i), mTour.getEarliestArrivalTime(r),
// mTour.getEarliestArrivalTime(q), mTour.getEarliestArrivalTime(n),
// mTour.getWaitingTime(r),
// mTour.getWaitingTime(mTour.getFirstNode(), q),
// mTour.getWaitingTime(mTour.getFirstNode(), j),
// mTour.getWaitingTime(mTour.getFirstNode(), mTour.getLastNode()),
// mTour.getEarliestArrivalTime(j));
// System.out.println(mTour.toDetailedString());
assertEquals(old - tmp, eval, Constants.getZeroTolerance());
}
}
}
void buildKnownTour(String tour) {
String[] nodes = tour.split(",");
for (String n : nodes) {
mTour.insertBefore(mTour.getLastNode(), Integer.valueOf(n));
}
}
public static void main(String[] args) {
TRSPWorkingTimeTest test = new TRSPWorkingTimeTest();
TRSPWorkingTimeTest.setUpBeforeClass();
test.setUp();
final TRSPTour t = test.mTour;
// test.testEvaluateGenericTour();
// test.setUp();
// test.testEvaluateInsMove();
test.buildKnownTour("70,30,152,87,107,94,27,63,96,78,104,33,28,81,75,57,79,60,85,102,95");
double old = t.getMinimalDuration();
System.out.println(t.getFwdSlackTime(t.getFirstNode()));
int m = 87, r = 107, n = 94, i = 94, q = 27, j = 63;
System.out.printf("(%s,%s,%s,...,%s,%s,%s) %s\n", m, r, n, i, q, j, t.getNodeSeqString());
t.removeNode(r);
t.removeNode(q);
double tmp = t.getMinimalDuration();
double eval = sWT.evaluateDetour(t, m, r, n, i, q, j, false);
t.insertAfter(m, r);
t.insertAfter(i, q);
System.out.printf("old=%3.2f tmp=%3.2f new=%3.2f eval=%3.2f real=%3.2f\n", old, tmp,
t.getMinimalDuration(), eval, old - tmp);
System.out.printf("Ar=%3.2f Aq=%3.2f An=%3.2f Wr=%3.2f W0q=%3.2f ",
t.getEarliestArrivalTime(r), t.getEarliestArrivalTime(q),
t.getEarliestArrivalTime(n), t.getWaitingTime(r),
t.getWaitingTime(t.getFirstNode(), q));
}
}