/**
*
*/
package vroom.common.heuristics.vls;
import static vroom.common.heuristics.vls.VLSGlobalParameters.INITIALIZATION_CLASS;
import static vroom.common.heuristics.vls.VLSGlobalParameters.LOCAL_SEARCH_CLASS;
import static vroom.common.heuristics.vls.VLSGlobalParameters.NC;
import static vroom.common.heuristics.vls.VLSGlobalParameters.NI;
import static vroom.common.heuristics.vls.VLSGlobalParameters.NS;
import static vroom.common.heuristics.vls.VLSGlobalParameters.OPTIMIZATION_DIRECTION;
import static vroom.common.heuristics.vls.VLSGlobalParameters.PERTUBATION_CLASS;
import static vroom.common.heuristics.vls.VLSPhase.ELS;
import static vroom.common.heuristics.vls.VLSPhase.GRASP;
import static vroom.common.heuristics.vls.VLSPhase.ILS;
import java.util.Random;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.Lock;
import org.junit.Before;
import org.junit.Test;
import vroom.common.heuristics.IInitialization;
import vroom.common.utilities.callbacks.CallbackEventBase;
import vroom.common.utilities.callbacks.ICallback;
import vroom.common.utilities.callbacks.ICallbackEvent;
import vroom.common.utilities.optimization.IInstance;
import vroom.common.utilities.optimization.ILocalSearch;
import vroom.common.utilities.optimization.IParameters;
import vroom.common.utilities.optimization.ISolution;
/**
* <code>VersatileLocalSearchTest</code> is a JUnit4 test case for {@link VersatileLocalSearch}
* <p>
* Creation date: Apr 26, 2010 - 1:33:59 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 VersatileLocalSearchSimpleTest {
protected VLSGlobalParameters mParameters;
protected VersatileLocalSearch<ISolution> mVLS;
@Before
public void setUp() throws Exception {
mParameters = new VLSGlobalParameters();
mParameters.set(INITIALIZATION_CLASS, TestInitialization.class);
mParameters.set(LOCAL_SEARCH_CLASS, TestLocalSearch.class);
mParameters.set(PERTUBATION_CLASS, TestPertubation.class);
// mParameters.setParameter(STATE_CLASS, TestState.class);
mParameters.set(OPTIMIZATION_DIRECTION, 1);
mParameters.set(NS, 10);
mParameters.set(NI, 10);
mParameters.set(NC, 10);
mVLS = new VersatileLocalSearch<ISolution>(mParameters);
TestCallback callback = new TestCallback();
mVLS.registerCallback(VLSCallbackEvents.SOLUTION_ACCEPTED, callback);
mVLS.registerCallback(VLSCallbackEvents.SOLUTION_REJECTED, callback);
}
/**
* Test method for {@link vroom.common.heuristics.vls.VersatileLocalSearch#run()}.
*/
@Test
public void testRun() {
mVLS.run();
}
public static class TestSolution implements ISolution {
private double fitness = 0;
/**
* Creates a new <code>TestSolution</code>
*/
public TestSolution() {
this(0);
}
/**
* Creates a new <code>TestSolution</code>
*
* @param fitness
*/
public TestSolution(double fitness) {
this.fitness = fitness;
}
@Override
public Comparable<?> getObjective() {
return fitness;
}
/*
* (non-Javadoc)
*
* @see
* vroom.common.utilities.optimization.ISolution#getObjectiveValue()
*/
@Override
public double getObjectiveValue() {
return fitness;
}
@Override
public String toString() {
return "[" + getObjective() + "]";
}
@Override
public ISolution clone() {
return new TestSolution(fitness);
}
/*
* (non-Javadoc)
*
* @see vroom.common.utilities.ILockable#acquireLock()
*/
@Override
public void acquireLock() {
}
/*
* (non-Javadoc)
*
* @see vroom.common.utilities.ILockable#getLockInstance()
*/
@Override
public Lock getLockInstance() {
return null;
}
/*
* (non-Javadoc)
*
* @see vroom.common.utilities.ILockable#isLockOwnedByCurrentThread()
*/
@Override
public boolean isLockOwnedByCurrentThread() {
return false;
}
@Override
public boolean tryLock(long timeout) {
try {
return getLockInstance().tryLock(timeout, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
return false;
}
}
/*
* (non-Javadoc)
*
* @see vroom.common.utilities.ILockable#releaseLock()
*/
@Override
public void releaseLock() {
}
@Override
public int hashSolution() {
return hashCode();
}
}
public static class TestInitialization implements IInitialization<ISolution> {
public TestInitialization(VLSGlobalParameters params) {
}
@Override
public ISolution newSolution(IVLSState<ISolution> state, IInstance instance,
IParameters params) {
return new TestSolution();
}
}
public static class TestLocalSearch implements ILocalSearch<ISolution> {
private static Random r = new Random(1);
public TestLocalSearch(VLSGlobalParameters params) {
}
@Override
public ISolution localSearch(IInstance instance, ISolution solution, IParameters param) {
((TestSolution) solution).fitness = ((TestSolution) solution).fitness + r.nextInt(5);
return solution;
}
@Override
public void dispose() {
// Do nothing
}
}
public static class TestPertubation implements IVLSPertubation<ISolution> {
private static Random r = new Random(0);
public TestPertubation(VLSGlobalParameters params) {
}
@Override
public void pertub(IVLSState<ISolution> state, IInstance instance, ISolution solution,
IParameters params) {
((TestSolution) solution).fitness += r.nextInt(10) - 5;
}
}
public static class TestState extends VLSStateBase<ISolution> {
/**
* Creates a new <code>TestState</code>
*
* @param parentVLS
*/
public TestState(VersatileLocalSearch<ISolution> parentVLS) {
super(parentVLS);
}
@Override
public void solutionAccepted(ISolution solution, VLSPhase phase) {
super.solutionAccepted(solution, phase);
System.out.println(String.format("State %s> mSolution accepted: %s - %s", phase,
solution, toString()));
}
@Override
public void solutionRejected(ISolution solution, VLSPhase phase) {
super.solutionRejected(solution, phase);
System.out.println(String.format("State %s> mSolution rejected: %s - %s", phase,
solution, toString()));
}
@Override
public String toString() {
return String.format("(bELS %s,bILS %s,bGRASP %s)", getBestSolution(ELS),
getBestSolution(ILS), getBestSolution(GRASP));
}
}
public static class TestCallback implements
ICallback<VersatileLocalSearch<ISolution>, VLSCallbackEvents> {
@Override
public void execute(ICallbackEvent<VersatileLocalSearch<ISolution>, VLSCallbackEvents> event) {
System.out.println(String.format("CALLBACK %s %s> %s: %s \t- %s",
CallbackEventBase.getTimeStampString(event.getTimeStamp()),
event.getParams()[1], event.getDescription(), event.getParams()[0],
event.getParams()[2]));
}
@Override
public int getPriority() {
return 0;
}
@Override
public boolean isExecutedSynchronously() {
return true;
}
@Override
public int compareTo(ICallback<?, ?> o) {
return o.getPriority() - getPriority();
}
}
public static void main(String[] args) {
VersatileLocalSearchSimpleTest test = new VersatileLocalSearchSimpleTest();
try {
test.setUp();
} catch (Exception e) {
e.printStackTrace();
}
test.testRun();
}
}