/* * Copyright © 2010 by Ondrej Skalicka. All Rights Reserved */ package cz.cvut.felk.cig.jcop.problem.tsp; import cz.cvut.felk.cig.jcop.problem.BaseFitness; import cz.cvut.felk.cig.jcop.problem.Configuration; import cz.cvut.felk.cig.jcop.problem.Fitness; /** * Default fitness for TSP problem. * * @author Ondrej Skalicka */ public class TSPFitness extends BaseFitness implements Fitness { /** * TSP problem */ protected TSP problem; /** * Maximal theoretical distance of tour. (actually maximal is usually lower, but for sure cannot be higher) */ protected double maxDistance = 0; /** * Fitness requires Knapsack problem instance to be able to calculate * * @param problem reference to problem so to be able to calculate */ public TSPFitness(TSP problem) { this.problem = problem; /* BaseFitness */ for (City city : this.problem.cities) { double currentMaxDistance = 0; for (double distance : city.distances.values()) { currentMaxDistance = currentMaxDistance > distance ? currentMaxDistance : distance; } this.maxDistance += currentMaxDistance; } this.maxFitness = this.maxDistance; this.minFitness = -this.maxDistance; } /** * Default fitness for TSP algorithm. * <p/> * Returns positive number if configuration {@link TSP#isSolution(cz.cvut.felk.cig.jcop.problem.Configuration) is * solution}, number equals maxDistance-tourDistance. * <p/> * If configuration is not solution, returns negative tourDistance. * * @param configuration attributes to compute fitness * @return fitness of attributes */ public double getValue(Configuration configuration) { double cost = this.problem.pathLength(configuration); if (this.problem.isSolution(configuration)) return -cost; return Double.NEGATIVE_INFINITY; // if (this.problem.isSolution(configuration)) // return this.maxDistance - cost; // return -cost; } }