package com.company.genetic_algorithm_find_global_min_max;

import java.util.Random;

public class Individual {

	private int[] genes;
	private int fitness;
	private Random randomGenerator;
	
	public Individual() {
		this.genes = new int[Constants.CHROMOSOME_LENGTH];
		this.randomGenerator = new Random();
	}
	
	public void generateIndividual() {
		for(int i=0;i<Constants.CHROMOSOME_LENGTH;++i) {
			int gene = randomGenerator.nextInt(2);
			genes[i] = gene;
		}
	}
	
	public double f(double x) {
		return ((x-2)*(x-2))+3;
	}
	
	public double genesToDouble() {
		
		int base = 1;
		double geneInDouble = 0;
		
		for(int i=0;i<Constants.GENE_LENGTH;++i) {
			if( this.genes[i] == 1 )
				geneInDouble += base;
		
			base = base * 2;
		}
		
		// 2 pow 10 (gene_length) = 1024 -> this is how we transform it into the interval we are interested in
		// we have [0,10] interval so we divide by 10 to make the transformation
		geneInDouble = geneInDouble / 102.4f;
		
		return geneInDouble;
	}
	
	public double getFitness() {
		double geneInDouble = genesToDouble();
		return f(geneInDouble);
	}
	
	public int getGene(int index) {
		return this.genes[index];
	}
	
	public void setGene(int index, int value) {
		this.genes[index] = value;
		this.fitness = 0;
	}
	
	@Override
	public String toString() {
		String s = "";
		
		for(int i=0;i<Constants.CHROMOSOME_LENGTH;++i)
			s+=getGene(i);
	
		return s;
	}
}