import java.util.ArrayList;
import java.util.Collections;
/**
 * \brief Trida reprezentujici chromozom pro TSP
 * @author Jan Nemec
 * 
 */
public class Chromozome {
	
	private ArrayList<Integer> genes = new ArrayList<Integer>();
	private double fitness;
	private double specialFitness;
	/**
	 * Konstruktor, ktery vytvari kompletni chromozom a naplni jej hodnotami.
	 * @param numOfGenes Pocet genu v chromozomu
	 */
	public Chromozome(int numOfGenes){

		ArrayList<Integer> temp = new ArrayList<Integer>();
		
		for(int i=2;i<numOfGenes+1;i++){
			temp.add(i);
		}
		
		Collections.shuffle(temp);
		
		//this.genes.add(1);
		this.genes.addAll(temp);
		this.fitness=0;
		this.specialFitness=0;
		
	}
	/**
	 * Konstruktor, ktery vytvari chromozom naplneny libovolnymi hodnotami
	 * @param size Velikost chromozomu
	 * @param value Hodnota
	 */
	public Chromozome(int size, int value){
		
		for(int i=0; i<size; i++)
			this.genes.add(value);
	}
	/**
	 * Funkce slouzici k vytisteni chromozomu.
	 */
	public void printChromozome(){
		for(int i=0;i<genes.size();i++){
			System.out.print(genes.get(i)+" ");
		}
		System.out.println();
	}
	/**
	 * Funkce, ktera vraci velikost chromozomu.
	 * @return Velikost chromozomu
	 */
	public int getChromozomeSize(){
		return this.genes.size();
	}
	/**
	 * Funkce, ktera vraci hodnotu jednoho vybraneho genu v chromozomu.
	 * @param position Pozice genu
	 * @return Hodnota genu
	 */
	public int getValueOfGene(int position){
		return this.genes.get(position);
	}
	/**
	 * Funkce, ktera slouzi k nastaveni hodnoty fitness pro chromozom
	 * @param fitness Hodnota fitness
	 */
	public void setFitness(double fitness){
		this.fitness = fitness;
	}
	/**
	 * Funkce, ktera vraci hodnotu fitness pro dany chromozom.
	 * @return Hodnota fitness
	 */
	public double getFitness(){
		return this.fitness;
	}
	
	public double getSpecialFitness(){
		return this.specialFitness;
	}
	
	public void setSpecialFitness(double specialFitness){
		this.specialFitness=specialFitness;
	}
	/**
	 * Funkce, ktera nastavuje hodnotu genu na vybrane pozici v chormozomu.
	 * @param gene Hodnota genu
	 * @param pos Pozice genu
	 */
	public void setGene(int gene, int pos){
		this.genes.set(pos, gene);
	}
	/**
	 * Funkce, ktera vraci privatni promenou ArrayList, ktera slouzi k ukladani jednotlivych genu.
	 * @return Promena ArrayList
	 */
	public ArrayList<Integer> get(){
		return this.genes;
	}
	
}
