/**
 *
 * \brief Trida obsahujici funkce pro vypocet hodnot fitness
 * @author Jan Nemec
 *
 */

public class Fitness {
	
	/**
	 * Funkce pro vypocet fitness hodnoty chromozomu pro TSP.
	 * Scita vzdalenosti mezi jednotlivymi mesty, tak
	 * jak cestu reprezentuje
	 * chromozom.
	 * @param chromozome Vstupni chromozom.
	 * @param table	Tabulka reprezentujici vzdalenosti mezi mesty.
	 * @return Metoda vraci ciselnou hodnotu fitness.
	 */
	public static double tspFitness(Chromozome chromozome, double[][] table){
		
		double fitness=0.0;
		
		fitness+=table[0][chromozome.getValueOfGene(0)-1];
		
		for(int i=0, j=1; j<chromozome.getChromozomeSize(); i++, j++){
			//System.out.println(chromozome.getChromozomeSize());
			//System.out.println("bla");
			//System.out.println(i);
			//System.out.println(j);
			//System.out.println(table[i][j]);
			fitness+=table[chromozome.getValueOfGene(i)-1][chromozome.getValueOfGene(j)-1];
		}
		
		fitness+=table[0][chromozome.getChromozomeSize()-1];
		
		//System.out.println(fitness);
		
		return fitness;
	}
	/**
	 * Funkce pro vypocet fitness hodnoty chromozomu pro reseni textoveho problemu. Funkce scita rozdily v textu na jednotlivych
	 *  pozicich oproti zadanemu cili.
	 * @param chromozomeHW Vstupni chromozom
	 * @param target Cilovy text
	 * @return
	 */
	public static int hwFitness(ChromozomeHW chromozomeHW, char[] target){
		
		int fitness=0;
		
		for(int i=0; i<target.length; i++){
			fitness+=Math.abs(((int)chromozomeHW.getGenes()[i]-target[i]));
		}
		
		//System.out.println(fitness);
		
		return fitness;
	}
	

}
