package opt.test;
import java.util.Arrays;
import java.util.Random;
import dist.DiscreteDependencyTree;
import dist.DiscretePermutationDistribution;
import dist.DiscreteUniformDistribution;
import dist.Distribution;
import opt.SwapNeighbor;
import opt.GenericHillClimbingProblem;
import opt.HillClimbingProblem;
import opt.NeighborFunction;
import opt.RandomizedHillClimbing;
import opt.SimulatedAnnealing;
import opt.example.*;
import opt.ga.CrossoverFunction;
import opt.ga.SwapMutation;
import opt.ga.GenericGeneticAlgorithmProblem;
import opt.ga.GeneticAlgorithmProblem;
import opt.ga.MutationFunction;
import opt.ga.StandardGeneticAlgorithm;
import opt.prob.GenericProbabilisticOptimizationProblem;
import opt.prob.MIMIC;
import opt.prob.ProbabilisticOptimizationProblem;
import shared.FixedIterationTrainer;
/**
*
* @author Andrew Guillory gtg008g@mail.gatech.edu
* @version 1.0
*/
public class TravelingSalesmanTest {
/** The n value */
private static final int N = 50;
/**
* The test main
* @param args ignored
*/
public static void main(String[] args) {
Random random = new Random();
// create the random points
double[][] points = new double[N][2];
for (int i = 0; i < points.length; i++) {
points[i][0] = random.nextDouble();
points[i][1] = random.nextDouble();
}
// for rhc, sa, and ga we use a permutation based encoding
TravelingSalesmanEvaluationFunction ef = new TravelingSalesmanRouteEvaluationFunction(points);
Distribution odd = new DiscretePermutationDistribution(N);
NeighborFunction nf = new SwapNeighbor();
MutationFunction mf = new SwapMutation();
CrossoverFunction cf = new TravelingSalesmanCrossOver(ef);
HillClimbingProblem hcp = new GenericHillClimbingProblem(ef, odd, nf);
GeneticAlgorithmProblem gap = new GenericGeneticAlgorithmProblem(ef, odd, mf, cf);
RandomizedHillClimbing rhc = new RandomizedHillClimbing(hcp);
FixedIterationTrainer fit = new FixedIterationTrainer(rhc, 200000);
fit.train();
System.out.println(ef.value(rhc.getOptimal()));
SimulatedAnnealing sa = new SimulatedAnnealing(1E12, .95, hcp);
fit = new FixedIterationTrainer(sa, 200000);
fit.train();
System.out.println(ef.value(sa.getOptimal()));
StandardGeneticAlgorithm ga = new StandardGeneticAlgorithm(200, 150, 20, gap);
fit = new FixedIterationTrainer(ga, 1000);
fit.train();
System.out.println(ef.value(ga.getOptimal()));
// for mimic we use a sort encoding
ef = new TravelingSalesmanSortEvaluationFunction(points);
int[] ranges = new int[N];
Arrays.fill(ranges, N);
odd = new DiscreteUniformDistribution(ranges);
Distribution df = new DiscreteDependencyTree(.1, ranges);
ProbabilisticOptimizationProblem pop = new GenericProbabilisticOptimizationProblem(ef, odd, df);
MIMIC mimic = new MIMIC(200, 100, pop);
fit = new FixedIterationTrainer(mimic, 1000);
fit.train();
System.out.println(ef.value(mimic.getOptimal()));
}
}