#ifndef __DIF_EVOL_H__
#define __DIF_EVOL_H__
#include "stdafx.h"
#include <iostream>
#include <stdexcept>
#include <math.h>

	class Diferencialni
	{
	protected:
		double F; 
		double CR;
		int D; //počet parametrů fitness funkce
		int NP; //velikost jedné generace
		bool changed;
		double **data;
		void init();
		double *Zkusebni;
		double **Meze;
		

	public:

		//--------------------------------Konstruktory------------------------
		inline Diferencialni();
		inline Diferencialni(int A);
		
		//-----------------------------Destruktor-----------------------
		~Diferencialni();

		//----------------------------Přístup k parametrům-------------------------- 
		inline double GetF();
		inline double GetCR();
		inline int GetD();
		inline int GetNP();

		//---------------------------Přenastavení parametrů---------------------------
		inline void SetF(float A);
		inline void SetCR(float A);
		void SetD(int A);
		void SetNP(int A);
		inline void SetMez(int A,int B,double C);
		inline double GetMez(int A, int B);

		//----------------------------Reprodukční algoritmus-----------------------------
		void Reprodukce();
		virtual double Fitness(double* A);
		void Elita(double* A);
		void Start_Evoluce();
		double HodnotaElita();
		double StandartDeviation();
		
	};

	//------------------------------Těla inline fukncí---------------------------
	Diferencialni::Diferencialni() : F(0.8) , CR(0.85) , D(2) , NP (10) , data (nullptr) 
	{init(); changed = true;}
	
	Diferencialni::Diferencialni(int A) : F(0.8) , CR(0.85) , D(A) , NP(A*10) , data(nullptr) 
	{init(); changed = true;}

	double Diferencialni::GetF() {return F;}

	double Diferencialni::GetCR() {return CR;}

	int Diferencialni::GetD() {return D;}

	int Diferencialni::GetNP() {return NP;}

	void Diferencialni::SetF(float A) {F = A;}

	void Diferencialni::SetCR(float A) {CR = A;}

	double Diferencialni::GetMez(int A, int B) {return Meze[A][B];}

	void Diferencialni::SetMez(int A,int B,double C) {Meze[A][B]=C; changed = true;}
//}






#endif