Click here to Skip to main content
15,896,912 members
Articles / Desktop Programming / MFC

Genetic Algorithm Library

Rate me:
Please Sign up or sign in to vote.
4.93/5 (175 votes)
7 Apr 2012GPL358 min read 439.8K   34.7K   555  
A framework for genetic algorithms
/*
 * 
 * website: http://www.coolsoft-sd.com/
 * contact: support@coolsoft-sd.com
 *
 */

#include <iostream>

#include "../GeneticLibrary/source/Initialization.h"
#include "../GeneticLibrary/source/ChromosomeOperations.h"
#include "../GeneticLibrary/source/MultiValueChromosome.h"
#include "../GeneticLibrary/source/Population.h"
#include "../GeneticLibrary/source/StopCriterias.h"
#include "../GeneticLibrary/source/SimpleAlgorithm.h"

using namespace std;

using namespace Algorithm;
using namespace Algorithm::StopCriterias;
using namespace Algorithm::SimpleAlgorithms;

const char pattern[] = 
"        GGGGGGGGGGGGG               AAA               LLLLLLLLLLL             "
"     GGG::::::::::::G              A:::A              L:::::::::L             "
"   GG:::::::::::::::G             A:::::A             L:::::::::L             "
"  G:::::GGGGGGGG::::G            A:::::::A            LL:::::::LL             "
" G:::::G       GGGGGG           A:::::::::A             L:::::L               "
"G:::::G                        A:::::A:::::A            L:::::L               "
"G:::::G                       A:::::A A:::::A           L:::::L               "
"G:::::G    GGGGGGGGGG        A:::::A   A:::::A          L:::::L               "
"G:::::G    G::::::::G       A:::::A     A:::::A         L:::::L               "
"G:::::G    GGGGG::::G      A:::::AAAAAAAAA:::::A        L:::::L               "
"G:::::G        G::::G     A:::::::::::::::::::::A       L:::::L               "
" G:::::G       G::::G    A:::::AAAAAAAAAAAAA:::::A      L:::::L         LLLLLL"
"  G:::::GGGGGGGG::::G   A:::::A             A:::::A   LL:::::::LLLLLLLLL:::::L"
"   GG:::::::::::::::G  A:::::A               A:::::A  L::::::::::::::::::::::L"
"     GGG::::::GGG:::G A:::::A                 A:::::A L::::::::::::::::::::::L"
"        GGGGGG   GGGGAAAAAAA                   AAAAAAALLLLLLLLLLLLLLLLLLLLLLLL";

const int patternSize = sizeof( pattern ) - 1;

class pFitness : public GaFitnessOperation
{

public:

	virtual float GACALL operator ()(const GaChromosome* chromosome) const
	{
		const vector<char>& v = dynamic_cast<const GaMultiValueChromosome<char>*>( chromosome )->GetCode();

		int score = 0;
		for( int i = 0; i < patternSize; i++ )
		{
			if( v[ i ] == pattern[ i ] )
				score++;
		}

		return (float)score / patternSize * 100;
	}

	virtual GaParameters* GACALL MakeParameters() const { return NULL; }

	virtual bool GACALL CheckParameters(const GaParameters& parameters) const { return true; }
};

volatile bool stop = false;

class pObserver : public GaObserverAdapter
{
public:

	virtual void GACALL NewBestChromosome(const GaChromosome& newChromosome, const GaAlgorithm& algorithm)
	{
		static int a = 0;
		a++;
		//if(a%100==0)
		{
			const vector<char>& v = dynamic_cast<const GaMultiValueChromosome<char>&>( newChromosome ).GetCode();

			cout << "Generatiron: " << algorithm.GetAlgorithmStatistics().GetCurrentGeneration() << endl;
			cout << "Fitness: " << newChromosome.GetFitness();
			cout << "\n-------------------------\n";

			for( int i = 0; i < (int)v.size(); i++ )
			{
				if( i % 78 == 0 )
					cout << endl;

				cout << v[ i ];
			}

			cout << "\n-------------------------\n";
		}
	}

	virtual void GACALL EvolutionStateChanged(GaAlgorithmState newState, const GaAlgorithm& algorithm)
	{
		if( newState == GAS_CRITERIA_STOPPED )
			cout << " end.";
	}
};


int main()
{
	GaInitialize();

	GaChromosomeParams chromosomeParams( 0.1F, 10, true, 0.8F, 2 );

	GaMultiValueSet<char> valueSet( false );
	valueSet.Add( "GAL: ", "     ", 5 );

	pFitness fitnessOperation;
	GaChromosomeDomainBlock<char> configBlock( &valueSet,
		GaCrossoverCatalogue::Instance().GetEntryData( "GaMultiValueCrossover" ),
		GaMutationCatalogue::Instance().GetEntryData( "GaFlipMutation" ),
		&fitnessOperation, GaFitnessComparatorCatalogue::Instance().GetEntryData( "GaMaxFitnessComparator" ),
		&chromosomeParams );

	GaMultiValueChromosome<char> prototype( patternSize, &configBlock );

	GaPopulationConfiguration populationConfig;
	GaPopulationParameters populationParams( 30, true, true, false, 0, 0 );

	populationConfig.SetParameters( populationParams );
	populationConfig.SetSortComparator( &configBlock.GetFitnessComparator() );
	populationConfig.Selection().GetParameters().SetSelectionSize( 6 );
	
	GaPopulation population( &prototype, &populationConfig );

	GaSimpleAlgorithmParams algorithmParams( 10, 2 );
	GaSimpleAlgorithm algorithm( &population, algorithmParams );

	GaFitnessCriteriaParams criteriaParams( 100, GFC_EQUALS_TO, GSV_BEST_FITNESS );
	algorithm.SetStopCriteria( GaStopCriteriaCatalogue::Instance().GetEntryData( "GaFitnessCriteria" ), 
		&criteriaParams );

	pObserver observer;
	algorithm.SubscribeObserver( &observer );

	algorithm.StartSolving( false );

	algorithm.WaitForThreads();

	GaFinalize();

	return 0;
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The GNU General Public License (GPLv3)


Written By
Software Developer
Serbia Serbia
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions