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

📄 extrema.h

📁 Implementation of genetic algorithm, to search for desired extreme n-variable function.
💻 H
字号:
//---------------------------------------------------------------------------
#ifndef extremaH
#define extremaH

//---------------------------------------------------------------------------
#include <cstdlib>
#include <string>
#include <boost/scoped_ptr.hpp>
#include <boost/array.hpp>
#include <boost/lexical_cast.hpp>
#include "shared_list.h"
#include "sorted_list.h"
#include "tablica.h"
#include <vector>
#include <math.h>

// DEFINICJE POJEC ZWIAZANYCH Z ZASTOSOWANYM ALGORYTMEM GENETYCZNYM
// CHROMOSOM - lancuch, ciag uporzadkowany genow, tutaj dwa ciagi
// binarne w postaci stringu oraz liczba 'int' okreslajaca znak (+1 lub -1)
// GEN - pojedynczy element chromosomu, tutaj znak "0" lub "1"
// LOCUS - pozycja genu w chromosomie
// GENOTYP - zespol chromosomow, tutaj dwa lancuchy genow i znak +1 lub -1
// FENOTYP - punkt przestrzeni poszukiwan, ktorego zakodowana postacia jest genotyp,
//           tutaj liczba rzeczywista okreslajaca wartosc wspolrzednej
// POPULACJA - zespol genotypow
// FUNKCJA OCENY (PRZYSTOSOWANIA) - przystosowanie genotypu, wartosc fitnes,
// tutaj wynik funkcji

//---------------------------------------------------------------------------
namespace EXTR { // okreslamy wlasna przestrzen nazw

//---------------------------------------------------------------------------
using std::string;
// nowy typ do przechowywania ciagu znakow binarnych, np. "1001101001..",
// czyli czesci rzeczywistej i ulamkowej liczby w zapisie dwojkowym,
// ta postac upraszcza operacje mutacji i krzyzowania
typedef string TBinary;

//---------------------------------------------------------------------------
const int PRZEDZIAL = 1e6;  // max. dokladnosc generowanego fenotypu po przecinku

/////// TWSPOLRZEDNA ////////////////////////////////////////////////////////
// wspolrzedna przestrzeni poszukiwan
typedef struct TW
{
	char Sign; // 'A' ... 'Z'
	double Value; // wartosc liczbowa wspolrzednej
     // konstruktory
	TW(void) {}
	TW(char Sign_, double Value_) : Sign(Sign_), Value(Value_) {}
} TWspolrzedna;
//---------------------------------------------------------------------------
// nowy typ do przechowywania wskaznikow do obiektow 'TWspolrzedna'
typedef TSharedList<TWspolrzedna> TWektorOfWsp;
// definicja typu wskaznika do funkcji przystosowania
typedef double __fastcall (*TPFuncOceny)(TWektorOfWsp* WektorOfWsp);

/////// TZAKRES /////////////////////////////////////////////////////////////
typedef struct TZ
{
	char Sign; // os wsp. 'A' ... 'Z'
	double Begin, End;  // np. [X1;X2] - przedzial
     // konstruktor
	TZ(char Sign_, double Begin_, double End_)
		:
		Sign(Sign_), Begin(Begin_), End(End_) {}

} TZakres;

// typ
typedef TSharedList<TZakres> TWektorZakresow;

/////// TGENY ///////////////////////////////////////////////////////////////
typedef struct TG
{
	TBinary BinaryC;  // zapis binarny czesci calkowitej np. "101110110"
	TBinary BinaryU;  // zapis binarny czesci ulamkowej np. "0101100...011"
	int Znak;        // -1 lub 1
	char Sign;       // oznaczenie osi, wspolrzdenej
	//-----------------------------------------------------------------
	// konstruktory
	TG(){}
	TG(TG const* Geny)
	{ BinaryC = Geny->BinaryC; BinaryU = Geny->BinaryU; Znak = Geny->Znak; Sign = Geny->Sign;}
	TG(TBinary const& BinaryC_, TBinary const& BinaryU_, int Znak_, char Sign_)
	:
	BinaryC(BinaryC_), BinaryU(BinaryU_), Znak(Znak_), Sign(Sign_) {}
} TGeny;

// typ kontenera do przechowywania wskaznikow do tworzonych typow 'TGeny'
typedef TSharedList<TGeny> TWektorGenow;

/////// TGENERATOR //////////////////////////////////////////////////////////
class TGenerator
{
  private:
	int ValueC;    // wygenerowana czesc calkowita
	int ValueU;    // wygenerowana czesc ulamkowa
	int   Znak;    // ustalony znak (1 lub -1)

  public:
	// klasa bez jawnego konstruktora
	// po utworzeniu nalezy wywolac funkcje 'Generuj'
	void __fastcall Generuj(TZakres const* Zakres);
	int  __fastcall Get_CzescC(void);
	int  __fastcall Get_CzescU(void);
	int  __fastcall Get_Znak(void);
};

/////// TCHROMOSOM /////////////////////////////////////////////////////////
class TChromosom
{
  private:
	char Sign; // oznaczenie wlasciwej osi wsp.,  'A' ... 'Z'
	//--------------------------------------------------------
	TBinary BinaryC;  // zapis binarny czesci calkowitej
	TBinary BinaryU;  // zapis binarny czesci ulamkowej
	int Znak;        // znak -1 lub 1
	double Fenotyp;  // postac rzeczywista, chromosom w formie nie zakodowanej
	//--------------------------------------------------------

	TGeny* Geny;      // tworzony obiekt pomocniczy

	void __fastcall IntToBinary(int Value, TBinary& Binary);
	int    __fastcall BinaryToInt(string const& Binary);
	double __fastcall BinaryToFenotyp(void);
	double __fastcall IntToFenotyp(int CzescC, int CzescU);
	string __fastcall IntToString(int Value)
	{return boost::lexical_cast<string>(Value);}
	int StringToInt(string Value)
	{return boost::lexical_cast<int>(Value);}
  public:
	// konstruktory
	explicit __fastcall TChromosom(TZakres const* Zakres);
	explicit __fastcall TChromosom(TGeny const* Geny);
	// destruktor
	__fastcall ~TChromosom(void);

	char __fastcall Get_Sign(void);
	double __fastcall Get_Fenotyp(void);
	TGeny* __fastcall Get_Geny(void);
	// polecenie mutacji, w rezultacie zwraca geny do budowy
	// nowego osobnika, parametr pozycja okresla locus od ktorego
	// losowany jest gen do mutacji po przecinku, domyslnie zero
	TGeny* __fastcall Mutacja(int Pozycja = 0);
};

// definicja typu kontenera do przechowywania wskaznikow do tworzonych
// typow 'TChromosom'
typedef TSharedList<TChromosom> TArrayOfCh;

/////// TGENOTYP ////////////////////////////////////////////////////////////
enum TPRECYZJA{P0, P1, P2, P3, P4, P5, P6}; // cyfra - liczba miejsc po przecinku
//---------------------------------------------------------------------------
class TGenotyp
{
  private:
	// wektor chromosomow, czyli np. dla trzech zmiennych trzy chromosomy,
	// jeden dla kazdej osi, tworzony dynamicznie w konstruktorze
	boost::shared_ptr<TArrayOfCh> ArrayOfCh;

	// wynik oceny genotypu, przystosowanie
	double Fitnes;
     TPRECYZJA PRECYZJA;
	// tworzony obiekt pomocniczy
	boost::shared_ptr<TWektorGenow> WektorGenow;

     //-------------------------------------------------------------
     void __fastcall Formatuj(double& Value);

  public:
	// konstruktor, jako argumenty przyjmuje wektor obiektow
	// 'TZakres' w ilosci takiej ile jest zmiennych, oraz wskaznik do
	// funkcji przystosowania
	explicit __fastcall TGenotyp(TWektorZakresow const* WektorZakresow,
                                  TPFuncOceny PFuncOceny, TPRECYZJA PREC);
	// konstruktor, jako argumenty przyjmuje wskaznik do funkcji i geny do budowy
	// chromosomow
	explicit __fastcall TGenotyp(TPFuncOceny PFuncOceny,
                                  TWektorGenow const* WektorGenow, TPRECYZJA PREC);
	__fastcall ~TGenotyp(void);

	// zwraca strukture 'TGeny'
	TWektorGenow const* __fastcall Get_Geny(void);
	// metoda zwraca wartosc fenotypu danego chromosomu
	double __fastcall Get_Fenotyp(int Index) const;
	// metoda zwraca wartosc oceny przystosowania
	double __fastcall Get_Fitnes(void) const;
	// metoda mutacji, zwraca geny do budowy nowego genotypu,
	// mutowany jest chromosom o podanej sygnaturze 'Sign'
	TWektorGenow const* __fastcall Mutacja(char Sign, unsigned Pozycja = 0);
};

// operatory porownania, niezbedne w celu sortowania listy genotypow
bool operator<(TGenotyp const& G1, TGenotyp const& G2)
{return G1.Get_Fitnes() < G2.Get_Fitnes();}
bool operator>(TGenotyp const& G1, TGenotyp const& G2)
{return G1.Get_Fitnes() > G2.Get_Fitnes();}

/////// TPOPULACJA //////////////////////////////////////////////////////////
// typy
typedef TSortedList<TGenotyp, true> TArrayOfGenotyp;
enum TEXTREMUM{MAXIMUM, MINIMUM};  // poszukiwane maksimum badz minimum

//---------------------------------------------------------------------------
class TPopulacja
{
  private:  public:
	// wskazniki
	// wskaznik do wektora genotypow, wektor tworzony dynamicznie
	boost::shared_ptr<TArrayOfGenotyp> ArrayOfGenotyp;
	boost::shared_ptr<TArrayOfGenotyp> GenotypyPoczatkowe;

	// wskaznik pomocniczy do wektora zakresow
	boost::shared_ptr<TWektorZakresow> WektorZakresow;
	// wektor pomocniczy
	boost::shared_ptr<TWektorGenow> WektorGenow;

	// wskaznik pomocniczy do funkcji przystosowania
	TPFuncOceny PFuncOceny;

	// pozycja indeksu 'locus' - procedura krzyzowania
	unsigned PosLocus;
	// numer genu - procedura krzyzowania
	short NrGenu;

	// pomocniczy typ do przechowania wskaznikow genow
	typedef TTablica<TGeny const*, 10> TTab;
	// pomocniczy typ do chwilowego przechowania wskaznikow
	// do obiektow powyzszego typu
	typedef std::vector<TTab*> TWektorTablic;
	boost::shared_ptr<TWektorTablic> WektorTablic;

	// zmienne
	TEXTREMUM EXT;    // poszukiwane maksimum badz minimum

	//----------------------------------------------------------------
	// static constans
	static const unsigned CP_MUTACJI = 20;         // prawdopodobienstwo mutacji (%)
	static const unsigned CP_KRZYZOWANIA = 100;    // prawdopodobienstwo krzyzowania (%)
     static const unsigned CSIGMA = 20;
	static const unsigned CL_GENOTYPOW_POCZ = 5;   // poczatkowa liczba genotypow
	static const TPRECYZJA CPRECYZJA = 4;          // dokladnosc po przecinku - I warunek zatrzymania
	static const unsigned CL_CYKLI = 200;          // max. liczba cykli petli algorytmu - II warunek zatrzymania
     static const unsigned CL_GENOTYPOW_DOC = 100;  //  docelowa liczba genotypow

	// zmienne inicjalizowane wartoscia domyslna
	//----------------------------------------------------------------
     TPRECYZJA Precyzja;
	unsigned PMutacji;
	unsigned PKrzyzowania;
     unsigned Sigma;
	unsigned LGenotypow;
	unsigned LCykli;
     unsigned LGenotypowDoc; 
     unsigned PozycjaLocus;

	//----------------------------------------------------------------
	unsigned LiczbaWspolrzednych; // liczba osi (zmiennych)
	//double Value;     // wartosc extremum

	// metody prywatne
	//--------------------------
	void __fastcall Algorytm(void);
	void __fastcall UtworzPopulacje(void);

     //--------------------------
	void __fastcall Selekcja(void);
	void __fastcall Mutacja(void);
	void __fastcall Krzyzowanie(void);

     void __fastcall WykonajCykle(void);
     void __fastcall Wysegreguj(void);

	double __fastcall SzukajMaximum(void);
	double __fastcall SzukajMinimum(void);
	//--------------------------
	bool __fastcall SprawdzFenotypy(TGenotyp* Genotyp);

     //--------------------------

  public:
	// konstruktor i destruktor
	explicit __fastcall TPopulacja(std::vector<TZakres> const& WektorZakresow,
			 TPFuncOceny PFuncOceny, TEXTREMUM EXT);
	__fastcall ~TPopulacja(void);

	// metody dostepu
	//----------------------------------------
	void __fastcall Set_PMutacji(int PMutacji);           // w procentach
	void __fastcall Set_PKrzyzowania(int PKrzyzownaia);   // w procentach
     // liczebnosc populacji poczatkowej
	void __fastcall Set_LGenotypow(int LGenotypow);
     // parametr majacy wplyw na stopien selekcji
     void __fastcall Set_Sigma(int Value);
     // dokladnosc wyniku po przecinku
	void __fastcall Set_PRECYZJA(TPRECYZJA PRECYZJA);
     // liczba cykli petli selekcja-mutacja-krzyzowanie
	void __fastcall Set_LCykli(int LCykli);
     // liczebnosc populacji ograniczajaca
     void __fastcall Set_PopulacjaDocelowa(int Value);

	//----------------------------------------
	void __fastcall Execute(void);

	TArrayOfGenotyp* __fastcall Get_Array(void);
     TArrayOfGenotyp* __fastcall Get_GenotypyPoczatkowe(void);
};

//---------------------------------------------------------------------------
};    // end of namespace EXTR

//---------------------------------------------------------------------------
#endif   /* plik 'extrema.h' */

⌨️ 快捷键说明

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