⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extrema.cpp

📁 Implementation of genetic algorithm, to search for desired extreme n-variable function.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//---------------------------------------------------------------------------
#include <Dialogs.hpp>
#pragma hdrstop
#include "extrema.h"

//---------------------------------------------------------------------------
#pragma package(smart_init)

//---------------------------------------------------------------------------
using std::random;
using namespace EXTR;

/////// TLOSOWANIE //////////////////////////////////////////////////////////
void __fastcall TGenerator::Generuj(TZakres register const* Zakres)
{
	register double Begin = Zakres->Begin;
	register double End   = Zakres->End;

	register int A = Begin * PRZEDZIAL;
	register int B = End * PRZEDZIAL;

	register double Value = (double)(random(B - A));
	Value /= PRZEDZIAL;
	Value += Begin;

	Znak = 1; if(Value < 0) Znak = -1;
	Value = sqrt(Value * Value);
	ValueC = (int) (Value);
	ValueU = (int) ((Value - ValueC) * PRZEDZIAL);
}

//---------------------------------------------------------------------------
int __fastcall TGenerator::Get_CzescC(void) {return ValueC;}

//---------------------------------------------------------------------------
int __fastcall TGenerator::Get_CzescU(void) {return ValueU;}

//---------------------------------------------------------------------------
int __fastcall TGenerator::Get_Znak(void) {return Znak;}

/////// TCHROMOSOM /////////////////////////////////////////////////////////
void __fastcall TChromosom::IntToBinary(register int Value, TBinary& Binary)
{
	Binary = "";
	while(Value / 2)
	{
		Binary.insert(0, IntToString(Value % 2));
		Value /= 2;
	}
	Binary.insert(0, IntToString(Value));
}

//---------------------------------------------------------------------------
int __fastcall TChromosom::BinaryToInt(register TBinary const& Binary)
{
	 register int Count = Binary.size();
	 register int Wartosc = 0;
	 register bool Zero = true;
	 for(register int i = 0; i < Count; i++)
	 {
		if(Binary[i] == '1')
		{
			Wartosc += pow(2, Count - i - 1);
			Zero = false;
		}
	 }
	 if(Zero) Wartosc = 0;
	 return Wartosc;
}

//---------------------------------------------------------------------------
double __fastcall TChromosom::BinaryToFenotyp(void)
{
	return IntToFenotyp(BinaryToInt(BinaryC), BinaryToInt(BinaryU));
}

//---------------------------------------------------------------------------
double __fastcall TChromosom::IntToFenotyp(register int CzescC, register int CzescU)
{
	return (Znak * (((double)CzescC) + ((double)CzescU) / PRZEDZIAL));
}

//---------------------------------------------------------------------------
__fastcall TChromosom::TChromosom(TZakres register const* Zakres)
{
	Geny = new TGeny();

	boost::scoped_ptr<TGenerator> Generator(new TGenerator());
	Generator->Generuj(Zakres);
	register int CzescC = Generator->Get_CzescC();
	register int CzescU = Generator->Get_CzescU();
	Znak = Generator->Get_Znak();
	Sign = Zakres->Sign;

	IntToBinary(CzescC, BinaryC);
	IntToBinary(CzescU, BinaryU);

	Fenotyp = IntToFenotyp(CzescC, CzescU);
}

//---------------------------------------------------------------------------
__fastcall TChromosom::TChromosom(TGeny register const* Geny_)
{
	Geny = new TGeny();

	BinaryC = Geny_->BinaryC;
	BinaryU = Geny_->BinaryU;
	Znak = Geny_->Znak;
	Sign = Geny_->Sign;

	Fenotyp = BinaryToFenotyp();
}

//---------------------------------------------------------------------------
__fastcall TChromosom::~TChromosom(void) { delete Geny;}

//---------------------------------------------------------------------------
char __fastcall TChromosom::Get_Sign(void) {return Sign;}

//---------------------------------------------------------------------------
double __fastcall TChromosom::Get_Fenotyp(void) {return Fenotyp;}

//---------------------------------------------------------------------------
TGeny* __fastcall TChromosom::Get_Geny(void)
{
	Geny->BinaryC = BinaryC;
	Geny->BinaryU = BinaryU;
	Geny->Znak    = Znak;
	Geny->Sign    = Sign;

	return Geny;
}

//---------------------------------------------------------------------------
TGeny* __fastcall TChromosom::Mutacja(register int Pozycja)
{
	register TBinary BinaryBisC = BinaryC;
	register TBinary BinaryBisU = BinaryU;
	register int    ZnakBis    = Znak;

	register int Numer;
	if(Pozycja) Numer = 3;
	else
	{
		Numer = random(10) + 1;
		if(Numer > 3) Numer = 3;
	}

	register int Locus;
	switch(Numer)
	{
		case 1:
		{
			if(ZnakBis == -1) ZnakBis = 1;
			else              ZnakBis = -1;
		} break;
		case 2:
		{
			Locus = random(BinaryBisC.size());
			if(BinaryBisC[Locus] == '0') BinaryBisC[Locus] = '1';
			else                         BinaryBisC[Locus] = '0';
		} break;
		case 3:
		{
			if(Pozycja)
			{
				switch(Pozycja)
				{
					case 1: Locus = 4; break;
					case 2: Locus = 8; break;
					case 3: Locus = 12; break;
					case 4: Locus = 16; break;
					case 5: Locus = 20; break;
					case 6: Locus = 24; break;
					default: Locus = 24;
				}
			}
			else
				Locus = random(BinaryBisU.size());

			if(BinaryBisU[Locus] == '0') BinaryBisU[Locus] = '1';
			else                         BinaryBisU[Locus] = '0';

		} break;
	}

	Geny->BinaryC = BinaryBisC;
	Geny->BinaryU = BinaryBisU;
	Geny->Znak    = ZnakBis;
	Geny->Sign    = Sign;

	return Geny;
}

/////// TGENOTYP ////////////////////////////////////////////////////////////
void __fastcall TGenotyp::Formatuj(double& Value)
{
     double Temp = pow(10, (int)PRECYZJA);
     Value = (double)(((int)(Value * Temp + 0.5)) / Temp);
}

//---------------------------------------------------------------------------
__fastcall TGenotyp::TGenotyp(TWektorZakresow register const* WektorZakresow,
                              register TPFuncOceny PFuncOceny, TPRECYZJA PREC)
						:
                        PRECYZJA(PREC),
						ArrayOfCh(new TArrayOfCh()),
						WektorGenow(new TWektorGenow())
{
	boost::scoped_ptr<TWektorOfWsp> WektorOfWsp(new TWektorOfWsp());

	register int Count = WektorZakresow->count();
	for(register int i = 0; i < Count; i++)
	{
		ArrayOfCh->add(new TChromosom(WektorZakresow->item(i)));

		TWspolrzedna* Wsp = new TWspolrzedna(ArrayOfCh->item(i)->Get_Sign(),
								  ArrayOfCh->item(i)->Get_Fenotyp());
		WektorOfWsp->add(Wsp);
	}

	if(Count)
     {
		Fitnes = PFuncOceny(WektorOfWsp.get());
          Formatuj(Fitnes);
     }
}

//---------------------------------------------------------------------------
__fastcall TGenotyp::TGenotyp(TPFuncOceny register PFuncOceny,
                              TWektorGenow register const* WektorGenow_, TPRECYZJA PREC)
						:
                              PRECYZJA(PREC),
						ArrayOfCh(new TArrayOfCh()),
						WektorGenow(new TWektorGenow())
{
	boost::scoped_ptr<TWektorOfWsp> WektorOfWsp(new TWektorOfWsp());

	register int Count = WektorGenow_->count();
	for(register int i = 0; i < Count; i++)
	{
		ArrayOfCh->add(new TChromosom(WektorGenow_->item(i)));

		TWspolrzedna* Wsp = new TWspolrzedna(ArrayOfCh->item(i)->Get_Sign(),
								  ArrayOfCh->item(i)->Get_Fenotyp());
		WektorOfWsp->add(Wsp);
	}

	if(Count)
     {
		Fitnes = PFuncOceny(WektorOfWsp.get());
          Formatuj(Fitnes);
     }
}

//---------------------------------------------------------------------------
__fastcall TGenotyp::~TGenotyp(void) {}

//---------------------------------------------------------------------------
TWektorGenow const* __fastcall TGenotyp::Get_Geny(void)
{
	register int LiczbaGenow = ArrayOfCh->count();
	WektorGenow->clear();
	for(register int i = 0; i < LiczbaGenow; i++)
		WektorGenow->add(new TGeny(ArrayOfCh->item(i)->Get_Geny()));

	return WektorGenow.get();
}

//---------------------------------------------------------------------------
double __fastcall TGenotyp::Get_Fenotyp(register int Index) const
{
	return ArrayOfCh->item(Index)->Get_Fenotyp();
}

//---------------------------------------------------------------------------
double __fastcall TGenotyp::Get_Fitnes(void) const {return Fitnes;}


//---------------------------------------------------------------------------
TWektorGenow const* __fastcall TGenotyp::Mutacja(register char Sign, register unsigned Pozycja)
{
	WektorGenow->clear();

	register int Count = ArrayOfCh->count();
	for(register int i = 0; i < Count; i++)
	{
		if(Sign == ArrayOfCh->item(i)->Get_Sign())
			WektorGenow->add(new TGeny(ArrayOfCh->item(i)->Mutacja(Pozycja)));
		else
			WektorGenow->add(new TGeny(ArrayOfCh->item(i)->Get_Geny()));
	}

	return WektorGenow.get();
}

/////// TPOPULACJA //////////////////////////////////////////////////////////
void __fastcall TPopulacja::Algorytm(void)
{
     UtworzPopulacje();

     int LiczbaCykli = (int) (Precyzja);
     for(int i = 0; i < LiczbaCykli; i++)
     {
          WykonajCykle();
          Wysegreguj();
          PozycjaLocus = i;
     }
     Selekcja();
}

//--------------------------------------------------------------------------
void __fastcall TPopulacja::UtworzPopulacje(void)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -