Lightweight genetic algorithm library wtitten in С# with ability to customize operators and define own
Fitness function higher values treated as better. Calculate fintess can return any values even negative. Except if you use RouletteWheelSelection, in that case values need to be more than zero.
classMyGene:IGene{publicintValue;publicMyGene(intvalue){Value=value;}}classMyChromosome:IChromosome{publicdouble?Fitness{get;set;}publicintLength{get;}publicint[]Values;publicMyChromosome(int[]values){Values=values;Length=Values.Length;}publicIChromosomeClone(){varchromosome=newMyChromosome(Values);chromosome.Fitness=Fitness;returnchromosome;}publicvoidSetGene(intindex,IGenegene){Values[index]=((MyGene)gene).Value;}publicIGeneGetGene(intindex){returnnewMyGene(Values[index]);}}classMyFitness:IFitness{publicdoubleCalculateFitness(IChromosomechromosome){varmyChromosome=(MyChromosome)chromosome;intcounter=0;// for example count how many neighbout numbers differ by only 1for(inti=0;i<myChromosome.Length-1;i++){if(Math.Abs(myChromosome.Values[i]-myChromosome.Values[i+1])==1){counter++;}}returncounter;}}classMyChromosomeValidator:IChromosomeValidator{publicboolValidate(IChromosomechromosome){varmyChromosome=(MyChromosome)chromosome;// some validation logic herereturntrue;}}It can be two separate classes or just one single class
classMyChromosomeFactory:IChromosomeFactory,IGeneFactory{privateintcount;privateintmaxValue;privateintminValue;privateRandomrandom;publicMyChromosomeFactory(intcount,intminValue,intmaxValue,Randomrandom){this.count=count;this.minValue=minValue;this.maxValue=maxValue;this.random=random;}privateintGenerateGene(intindex){returnrandom.Next(minValue,maxValue);}publicIGeneCreateGene(intindex){returnnewMyGene(GenerateGene(index));}publicIChromosomeCreateChromosome(){varvalues=newint[count];for(inti=0;i<count;i++){values[i]=GenerateGene(i);}returnnewMyChromosome(values);}}varchromosomeFactory=newMyChromosomeFactory(10,-5,5,newRandom());vargeneFactory=chromosomeFactory;varoptions=newGeneticAlgorithmOptions{// factory that will be used for creating new chromosomesChromosomeFactory=chromosomeFactory,// number of chromosomes in generationGenerationSize=20,// chance that selected parent will be crossed to create new chromosomesCrossoverProbability=0.8,// chance that chromosomes created by crossover will be mutatedMutationProbability=0.1,// how long continue to run algorithm if best chromosome fitness is not changing// [optional]// default value: 50TerminateUnchangedGenetarionsCount=50,// fitness functionFitness=newMyFitness(),// selection operatorSelection=newEliteSelection(),// Selection = new RouletteWheelSelection(new Random()),// Selection = new TournamentSelection(new Random(), roundSize: 3),// parent selection operatorParentSelection=newRandomParentSelection(newRandom()),// ParentSelection = new InbreedingParentSelection(new Random()),// crossover operatorCrossover=newSinglePointCrossover(chromosomeFactory,newRandom()),// Crossover = new MultiPointCrossover(chromosomeFactory, new Random(), pointsCount: 3),// mutation operatorMutation=newRandomMutation<MyGene>(geneFactory,newRandom()),// Mutation = new SwapMutation<MyGene>(new Random()),// Mutation = new ReverseMutation<MyGene>(new Random()),// [optional]// default value: EmptyValidatorValidator=newMyChromosomeValidator(),// delegate function (event) that will be executed after each algorithm iteration// [optional]OnAfterIteration=(generation)=>{// output generation chromosomes for example}};// creting genetic algorithmga=newGeneticAlgorithm(options);// alowed to set after iteration delegate from here alsoga.OnAfterIteration+=(generation)=>{// ...};// running algorithmga.Run();// getting resultintgenerationsCount=ga.GenerationsCount;varbestChromosome=(MyChromosome)ga.BestChromosome;...
Takes best chromosomes of generation determined by fintess function
Picks chromosomes from a wheel, where probability is proportional to fintess function, until number of chromosomes in new generation match required generation size
roundSize: Number of chromosomes participating in each tournament round
Takes winner chromosome (by fitness function) to new generation from each tournament round until new generation match required generation size. Participants are picked randomly (so same chromosome can be taken multiple times, though Clone method will guarantee unique chromosome instances in new generation)
...
...
factory: chromosome factory
...
factory: chromosome factory
pointsCount: number of chromosome split points
...
factory: gene factory
...
...
...
...