Genetische algoritmen (GA's) zijn adaptieve heuristische zoekalgoritmen die tot het grootste deel van evolutionaire algoritmen behoren. Genetische algoritmen zijn gebaseerd op de ideeën van natuurlijke selectie en genetica. Dit zijn intelligente exploitatie van willekeurige zoekopdrachten voorzien van historische gegevens om de zoekopdracht te richten op de regio met betere prestaties in de oplossingsruimte. Ze worden vaak gebruikt om hoogwaardige oplossingen te genereren voor optimalisatieproblemen en zoekproblemen.
Genetische algoritmen simuleren het proces van natuurlijke selectie wat betekent dat soorten die zich kunnen aanpassen aan veranderingen in hun omgeving kunnen overleven, zich kunnen voortplanten en naar de volgende generatie kunnen gaan. In eenvoudige bewoordingen simuleren ze de survival of the fittest onder individuen van opeenvolgende generaties om een probleem op te lossen. Elke generatie bestaat uit een populatie van individuen en elk individu vertegenwoordigt een punt in de zoekruimte en mogelijke oplossing. Elk individu wordt weergegeven als een reeks tekens/geheel getal/float/bits. Deze string is analoog aan het chromosoom.
Stichting van genetische algoritmen
Genetische algoritmen zijn gebaseerd op een analogie met de genetische structuur en het gedrag van chromosomen van de bevolking. Hieronder volgt de basis van GA’s gebaseerd op deze analogie:
- Individuen in de bevolking strijden om hulpbronnen en paren
- De individuen die succesvol (sterkst) zijn, paren vervolgens om meer nakomelingen te creëren dan anderen
- Genen van de sterkste ouder planten zich door de generatie heen voort, dat wil zeggen dat ouders soms nakomelingen creëren die beter zijn dan beide ouders.
- Elke volgende generatie is dus beter geschikt voor hun omgeving.
Zoek ruimte
De populatie van individuen wordt binnen de zoekruimte bijgehouden. Elk individu vertegenwoordigt een oplossing in de zoekruimte voor een bepaald probleem. Elk individu wordt gecodeerd als een vector met eindige lengte (analoog aan het chromosoom) van componenten. Deze variabele componenten zijn analoog aan genen. Een chromosoom (individueel) is dus samengesteld uit verschillende genen (variabele componenten).
Fitnessscore
Aan elk individu wordt een fitnessscore gegeven toont het vermogen van een individu om te concurreren . Er wordt gezocht naar het individu met een optimale fitnessscore (of bijna optimaal).
De GA's houden de populatie van n individuen (chromosoom/oplossingen) bij, samen met hun fitnessscores. De individuen met betere fitnessscores krijgen meer kans om zich voort te planten dan anderen. De individuen met betere fitnessscores worden geselecteerd die paren en produceren betere nakomelingen door chromosomen van ouders te combineren. De populatiegrootte is statisch, dus er moet ruimte worden gecreëerd voor nieuwkomers. Sommige individuen sterven dus en worden vervangen door nieuwkomers, waardoor uiteindelijk een nieuwe generatie ontstaat wanneer alle paringsmogelijkheden van de oude bevolking zijn uitgeput. Er wordt gehoopt dat er in de loop van opeenvolgende generaties betere oplossingen zullen komen, terwijl de minst fitte mensen sterven.
Elke nieuwe generatie heeft gemiddeld meer betere genen dan het individu (oplossing) van voorgaande generaties. Zo heeft elke nieuwe generatie beter deeloplossingen dan voorgaande generaties. Zodra de geproduceerde nakomelingen geen significant verschil vertonen met de nakomelingen die door eerdere populaties zijn geproduceerd, wordt de populatie geconvergeerd. Er wordt gezegd dat het algoritme is geconvergeerd naar een reeks oplossingen voor het probleem.
Operators van genetische algoritmen
Zodra de eerste generatie is gemaakt, evolueert het algoritme de generatie met behulp van de volgende operatoren:
1) Selectieoperator: Het idee is om de voorkeur te geven aan individuen met goede fitnessscores en hen in staat te stellen hun genen door te geven aan opeenvolgende generaties.
2) Crossover-operator: Dit vertegenwoordigt paring tussen individuen. Er worden twee personen geselecteerd met behulp van een selectieoperator en crossover-sites worden willekeurig gekozen. Vervolgens worden de genen op deze kruisingsplaatsen uitgewisseld, waardoor een volledig nieuw individu (nakomeling) ontstaat. Bijvoorbeeld -
3) Mutatie-operator: Het belangrijkste idee is om willekeurige genen in nakomelingen in te brengen om de diversiteit in de populatie te behouden en voortijdige convergentie te voorkomen. Bijvoorbeeld -
interne werking van hashmap
Het hele algoritme kan worden samengevat als:
1) Randomly initialize populations p 2) Determine fitness of population 3) Until convergence repeat: a) Select parents from population b) Crossover and generate new population c) Perform mutation on new population d) Calculate fitness for new population>
Voorbeeldprobleem en oplossing met behulp van genetische algoritmen
Gegeven een doelreeks, is het doel om een doelreeks te produceren, beginnend bij een willekeurige reeks van dezelfde lengte. In de volgende implementatie worden de volgende analogieën gemaakt:
- Tekens A-Z, a-z, 0-9 en andere speciale symbolen worden als genen beschouwd
- Een string die door deze karakters wordt gegenereerd, wordt beschouwd als chromosoom/oplossing/individu
Fitnessscore is het aantal tekens dat verschilt van de tekens in de doelreeks bij een bepaalde index. Iemand met een lagere fitnesswaarde krijgt dus meer voorkeur.
wat is build-essential ubuntu
C++
// C++ program to create target string, starting from> // random string using Genetic Algorithm> > #include> using> namespace> std;> > // Number of individuals in each generation> #define POPULATION_SIZE 100> > // Valid Genes> const> string GENES => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP'> > 'QRSTUVWXYZ 1234567890, .-;:_!'#%&/()=?@${[]}'> ;> > // Target string to be generated> const> string TARGET => 'I love techcodeview.com'> ;> > // Function to generate random numbers in given range> int> random_num(> int> start,> int> end)> {> > int> range = (end-start)+1;> > int> random_int = start+(> rand> ()%range);> > return> random_int;> }> > // Create random genes for mutation> char> mutated_genes()> {> > int> len = GENES.size();> > int> r = random_num(0, len-1);> > return> GENES[r];> }> > // create chromosome or string of genes> string create_gnome()> {> > int> len = TARGET.size();> > string gnome => ''> ;> > for> (> int> i = 0;i gnome += mutated_genes(); return gnome; } // Class representing individual in population class Individual { public: string chromosome; int fitness; Individual(string chromosome); Individual mate(Individual parent2); int cal_fitness(); }; Individual::Individual(string chromosome) { this->chromosoom = chromosoom; geschiktheid = cal_fitness(); }; // Voer paring uit en produceer nieuwe nakomelingen Individual Individual::mate(Individual par2) { // chromosoom voor nakomelingenreeks child_chromosome = ''; int len = chromosoom.grootte(); for(int i = 0;i { // willekeurige waarschijnlijkheid float p = random_num(0, 100)/100; // als prob kleiner is dan 0,45, voeg gen in // van ouder 1 if(p<0.45) child_chromosome += chromosome[i]; // if prob is between 0.45 and 0.90, insert // gene from parent 2 else if(p <0.90) child_chromosome += par2.chromosome[i]; // otherwise insert random gene(mutate), // for maintaining diversity else child_chromosome += mutated_genes(); } // create new Individual(offspring) using // generated chromosome for offspring return Individual(child_chromosome); }; // Calculate fitness score, it is the number of // characters in string which differ from target // string. int Individual::cal_fitness() { int len = TARGET.size(); int fitness = 0; for(int i = 0;i { if(chromosome[i] != TARGET[i]) fitness++; } return fitness; }; // Overloading bool operator<(const Individual &ind1, const Individual &ind2) { return ind1.fitness } // Driver code int main() { srand((unsigned)(time(0))); // current generation int generation = 0; vector population; bool found = false; // create initial population for(int i = 0;i { string gnome = create_gnome(); population.push_back(Individual(gnome)); } while(! found) { // sort the population in increasing order of fitness score sort(population.begin(), population.end()); // if the individual having lowest fitness score ie. // 0 then we know that we have reached to the target // and break the loop if(population[0].fitness <= 0) { found = true; break; } // Otherwise generate new offsprings for new generation vector new_generation; // Perform Elitism, that mean 10% of fittest population // goes to the next generation int s = (10*POPULATION_SIZE)/100; for(int i = 0;i new_generation.push_back(population[i]); // From 50% of fittest population, Individuals // will mate to produce offspring s = (90*POPULATION_SIZE)/100; for(int i = 0;i { int len = population.size(); int r = random_num(0, 50); Individual parent1 = population[r]; r = random_num(0, 50); Individual parent2 = population[r]; Individual offspring = parent1.mate(parent2); new_generation.push_back(offspring); } population = new_generation; cout<< 'Generation: ' << generation << ' '; cout<< 'String: '<< population[0].chromosome <<' '; cout<< 'Fitness: '<< population[0].fitness << '
'; generation++; } cout<< 'Generation: ' << generation << ' '; cout<< 'String: '<< population[0].chromosome <<' '; cout<< 'Fitness: '<< population[0].fitness << '
'; }> |
>
>
Java
Hoe kom ik erachter hoe groot mijn monitor is?
import> java.util.ArrayList;> import> java.util.Collections;> import> java.util.List;> import> java.util.Random;> > public> class> GeneticAlgorithm {> > // Number of individuals in each generation> > private> static> final> int> POPULATION_SIZE => 100> ;> > > // Valid Genes> > private> static> final> String GENES => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 1234567890, .-;:_!'#%&/()=?@${[]}'> ;> > > // Target string to be generated> > private> static> final> String TARGET => 'I love techcodeview.com'> ;> > > // Function to generate random numbers in given range> > private> static> int> randomNum(> int> start,> int> end) {> > Random rand => new> Random();> > return> rand.nextInt(end - start +> 1> ) + start;> > }> > > // Create random genes for mutation> > private> static> char> mutatedGenes() {> > int> len = GENES.length();> > int> r = randomNum(> 0> , len -> 1> );> > return> GENES.charAt(r);> > }> > > // Create chromosome or string of genes> > private> static> String createGnome() {> > int> len = TARGET.length();> > StringBuilder gnome => new> StringBuilder();> > for> (> int> i => 0> ; i gnome.append(mutatedGenes()); return gnome.toString(); } // Class representing individual in population private static class Individual implements Comparable { String chromosome; int fitness; Individual(String chromosome) { this.chromosome = chromosome; fitness = calFitness(); } // Perform mating and produce new offspring Individual mate(Individual par2) { StringBuilder childChromosome = new StringBuilder(); int len = chromosome.length(); for (int i = 0; i // random probability float p = randomNum(0, 100) / 100f; // if prob is less than 0.45, insert gene from parent 1 if (p <0.45) childChromosome.append(chromosome.charAt(i)); // if prob is between 0.45 and 0.90, insert gene from parent 2 else if (p <0.90) childChromosome.append(par2.chromosome.charAt(i)); // otherwise insert random gene(mutate), for maintaining diversity else childChromosome.append(mutatedGenes()); } // create new Individual(offspring) using generated chromosome for offspring return new Individual(childChromosome.toString()); } // Calculate fitness score, it is the number of characters in string which differ from target string private int calFitness() { int len = TARGET.length(); int fitness = 0; for (int i = 0; i if (chromosome.charAt(i) != TARGET.charAt(i)) fitness++; } return fitness; } @Override public int compareTo(Individual o) { return Integer.compare(this.fitness, o.fitness); } } // Driver code public static void main(String[] args) { // current generation int generation = 0; List population = new ArrayList(); boolean found = false; // create initial population for (int i = 0; i String gnome = createGnome(); population.add(new Individual(gnome)); } while (!found) { // sort the population in increasing order of fitness score Collections.sort(population); // if the individual having lowest fitness score i.e. 0 then we know that we have reached to the target // and break the loop if (population.get(0).fitness <= 0) { found = true; break; } // Otherwise generate new offsprings for new generation List newGeneration = new ArrayList(); // Perform Elitism, that mean 10% of fittest population goes to the next generation int s = (10 * POPULATION_SIZE) / 100; for (int i = 0; i newGeneration.add(population.get(i)); // From 50% of fittest population, Individuals will mate to produce offspring s = (90 * POPULATION_SIZE) / 100; for (int i = 0; i int len = population.size(); int r = randomNum(0, 50); Individual parent1 = population.get(r); r = randomNum(0, 50); Individual parent2 = population.get(r); Individual offspring = parent1.mate(parent2); newGeneration.add(offspring); } population = newGeneration; System.out.print('Generation: ' + generation + ' '); System.out.print('String: ' + population.get(0).chromosome + ' '); System.out.println('Fitness: ' + population.get(0).fitness); generation++; } System.out.print('Generation: ' + generation + ' '); System.out.print('String: ' + population.get(0).chromosome + ' '); System.out.println('Fitness: ' + population.get(0).fitness); } }> |
>
>
Python3
# Python3 program to create target string, starting from> # random string using Genetic Algorithm> > import> random> > # Number of individuals in each generation> POPULATION_SIZE> => 100> > # Valid genes> GENES> => '''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP> QRSTUVWXYZ 1234567890, .-;:_!'#%&/()=?@${[]}'''> > # Target string to be generated> TARGET> => 'I love techcodeview.com'> > class> Individual(> object> ):> > '''> > Class representing individual in population> > '''> > def> __init__(> self> , chromosome):> > self> .chromosome> => chromosome> > self> .fitness> => self> .cal_fitness()> > > @classmethod> > def> mutated_genes(> self> ):> > '''> > create random genes for mutation> > '''> > global> GENES> > gene> => random.choice(GENES)> > return> gene> > > @classmethod> > def> create_gnome(> self> ):> > '''> > create chromosome or string of genes> > '''> > global> TARGET> > gnome_len> => len> (TARGET)> > return> [> self> .mutated_genes()> for> _> in> range> (gnome_len)]> > > def> mate(> self> , par2):> > '''> > Perform mating and produce new offspring> > '''> > > # chromosome for offspring> > child_chromosome> => []> > for> gp1, gp2> in> zip> (> self> .chromosome, par2.chromosome):> > > # random probability> > prob> => random.random()> > > # if prob is less than 0.45, insert gene> > # from parent 1> > if> prob <> 0.45> :> > child_chromosome.append(gp1)> > > # if prob is between 0.45 and 0.90, insert> > # gene from parent 2> > elif> prob <> 0.90> :> > child_chromosome.append(gp2)> > > # otherwise insert random gene(mutate),> > # for maintaining diversity> > else> :> > child_chromosome.append(> self> .mutated_genes())> > > # create new Individual(offspring) using> > # generated chromosome for offspring> > return> Individual(child_chromosome)> > > def> cal_fitness(> self> ):> > '''> > Calculate fitness score, it is the number of> > characters in string which differ from target> > string.> > '''> > global> TARGET> > fitness> => 0> > for> gs, gt> in> zip> (> self> .chromosome, TARGET):> > if> gs !> => gt: fitness> +> => 1> > return> fitness> > # Driver code> def> main():> > global> POPULATION_SIZE> > > #current generation> > generation> => 1> > > found> => False> > population> => []> > > # create initial population> > for> _> in> range> (POPULATION_SIZE):> > gnome> => Individual.create_gnome()> > population.append(Individual(gnome))> > > while> not> found:> > > # sort the population in increasing order of fitness score> > population> => sorted> (population, key> => lambda> x:x.fitness)> > > # if the individual having lowest fitness score ie.> > # 0 then we know that we have reached to the target> > # and break the loop> > if> population[> 0> ].fitness <> => 0> :> > found> => True> > break> > > # Otherwise generate new offsprings for new generation> > new_generation> => []> > > # Perform Elitism, that mean 10% of fittest population> > # goes to the next generation> > s> => int> ((> 10> *> POPULATION_SIZE)> /> 100> )> > new_generation.extend(population[:s])> > > # From 50% of fittest population, Individuals> > # will mate to produce offspring> > s> => int> ((> 90> *> POPULATION_SIZE)> /> 100> )> > for> _> in> range> (s):> > parent1> => random.choice(population[:> 50> ])> > parent2> => random.choice(population[:> 50> ])> > child> => parent1.mate(parent2)> > new_generation.append(child)> > > population> => new_generation> > > print> (> 'Generation: {} String: {} Fitness: {}'> .> > format> (generation,> > ''.join(population[> 0> ].chromosome),> > population[> 0> ].fitness))> > > generation> +> => 1> > > > print> (> 'Generation: {} String: {} Fitness: {}'> .> > format> (generation,> > ''.join(population[> 0> ].chromosome),> > population[> 0> ].fitness))> > if> __name__> => => '__main__'> :> > main()> |
>
fout: kon de hoofdklasse niet vinden of laden
>
C#
using> System;> using> System.Collections.Generic;> using> System.Linq;> > public> class> GeneticAlgorithm> {> > // Number of individuals in each generation> > private> const> int> POPULATION_SIZE = 100;> > > // Valid Genes> > private> const> string> GENES => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP'> +> > 'QRSTUVWXYZ 1234567890, .-;:_!'#%&/()=?@${[]}'> ;> > > // Target string to be generated> > private> const> string> TARGET => 'I love techcodeview.com'> ;> > > private> static> readonly> Random random => new> Random();> > > // Function to generate random numbers in given range> > private> static> int> RandomNum(> int> start,> int> end)> > {> > return> random.Next(start, end + 1);> > }> > > // Create random genes for mutation> > private> static> char> MutatedGenes()> > {> > int> len = GENES.Length;> > int> r = RandomNum(0, len - 1);> > return> GENES[r];> > }> > > // Create chromosome or string of genes> > private> static> string> CreateGnome()> > {> > int> len = TARGET.Length;> > char> [] gnome => new> char> [len];> > for> (> int> i = 0; i { gnome[i] = MutatedGenes(); } return new string(gnome); } // Class representing individual in population private class Individual { public string Chromosome { get; } public int Fitness { get; } public Individual(string chromosome) { Chromosome = chromosome; Fitness = CalculateFitness(); } // Calculate fitness score, it is the number of // characters in string which differ from target string. private int CalculateFitness() { return Chromosome.Zip(TARGET, (a, b) =>een == b? 0 : 1).Som(); } // Voer paring uit en produceer nieuwe nakomelingen public Individual Mate(Individual parent2) { char[] childChromosome = new char[Chromosome.Length]; for (int i = 0; i { dubbel p = willekeurig.NextDouble(); if (p<0.45) childChromosome[i] = Chromosome[i]; else if (p <0.90) childChromosome[i] = parent2.Chromosome[i]; else childChromosome[i] = MutatedGenes(); } return new Individual(new string(childChromosome)); } } // Overloading private class FitnessComparer : IComparer { public int Compare(Individual ind1, Individual ind2) { return ind1.Fitness.CompareTo(ind2.Fitness); } } // Driver code public static void Main() { // current generation int generation = 0; List population = new List(); bool found = false; // create initial population for (int i = 0; i { string gnome = CreateGnome(); population.Add(new Individual(gnome)); } while (!found) { // sort the population in increasing order of fitness score population.Sort(new FitnessComparer()); // if the individual having lowest fitness score ie. // 0 then we know that we have reached the target // and break the loop if (population[0].Fitness == 0) { found = true; break; } // Otherwise generate new offsprings for new generation List newGeneration = new List(); // Perform Elitism, that means 10% of fittest population // goes to the next generation int s = (10 * POPULATION_SIZE) / 100; for (int i = 0; i newGeneration.Add(population[i]); // From 50% of fittest population, Individuals // will mate to produce offspring s = (90 * POPULATION_SIZE) / 100; for (int i = 0; i { int len = population.Count; int r = RandomNum(0, 50); Individual parent1 = population[r]; r = RandomNum(0, 50); Individual parent2 = population[r]; Individual offspring = parent1.Mate(parent2); newGeneration.Add(offspring); } population = newGeneration; Console.WriteLine('Generation: ' + generation + ' ' + 'String: ' + population[0].Chromosome + ' ' + 'Fitness: ' + population[0].Fitness); generation++; } Console.WriteLine('Generation: ' + generation + ' ' + 'String: ' + population[0].Chromosome + ' ' + 'Fitness: ' + population[0].Fitness); } }> |
>
>
Javascript
// Number of individuals in each generation> const POPULATION_SIZE = 100;> > // Valid Genes> const GENES => 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP'> +> > 'QRSTUVWXYZ 1234567890, .-;:_!'#%&/()=?@${[]}'> ;> > // Target string to be generated> const TARGET => 'I love techcodeview.com'> ;> > // Function to generate random numbers in given range> function> RandomNum(start, end) {> > return> Math.floor(Math.random() * (end - start + 1)) + start;> }> > // Create random genes for mutation> function> MutatedGenes() {> > let len = GENES.length;> > let r = RandomNum(0, len - 1);> > return> GENES.charAt(r);> }> > // Create chromosome or string of genes> function> CreateGnome() {> > let len = TARGET.length;> > let gnome => ''> ;> > for> (let i = 0; i gnome += MutatedGenes(); } return gnome; } // Class representing individual in population class Individual { constructor(chromosome) { this.Chromosome = chromosome; this.Fitness = this.CalculateFitness(); } // Calculate fitness score, it is the number of // characters in string which differ from target string. CalculateFitness() { let fitness = 0; for (let i = 0; i |
>Uitgang: Generation: 1 String: tO{'-?=jH[k8=B4]Oe@} Fitness: 18 Generation: 2 String: tO{'-?=jH[k8=B4]Oe@} Fitness: 18 Generation: 3 String: .#lRWf9k_Ifslw #O$k_ Fitness: 17 Generation: 4 String: .-1Rq?9mHqk3Wo]3rek_ Fitness: 16 Generation: 5 String: .-1Rq?9mHqk3Wo]3rek_ Fitness: 16 Generation: 6 String: A#ldW) #lIkslw cVek) Fitness: 14 Generation: 7 String: A#ldW) #lIkslw cVek) Fitness: 14 Generation: 8 String: (, o x _x%Rs=, 6Peek3 Fitness: 13 . . . Generation: 29 String: I lope Geeks#o, Geeks Fitness: 3 Generation: 30 String: I loMe GeeksfoBGeeks Fitness: 2 Generation: 31 String: I love Geeksfo0Geeks Fitness: 1 Generation: 32 String: I love Geeksfo0Geeks Fitness: 1 Generation: 33 String: I love Geeksfo0Geeks Fitness: 1 Generation: 34 String: I love techcodeview.com Fitness: 0>Opmerking: Het algoritme begint elke keer met willekeurige tekenreeksen, dus de uitvoer kan verschillen
Zoals we uit de uitvoer kunnen zien, bleef ons algoritme soms hangen bij een lokale optimale oplossing. Dit kan verder worden verbeterd door het algoritme voor het berekenen van de fitnessscore bij te werken of door mutatie- en crossover-operatoren aan te passen.
pysparkWaarom genetische algoritmen gebruiken?
- Ze zijn robuust
- Zorg voor optimalisatie over een grote ruimtestatus.
- In tegenstelling tot traditionele AI breken ze niet bij een kleine verandering in de input of de aanwezigheid van ruis
Toepassing van genetische algoritmen
Genetische algoritmen hebben veel toepassingen, waarvan sommige –
- Terugkerend neuraal netwerk
- Mutatie testen
- Code breken
- Filtering en signaalverwerking
- Fuzzy-regelbasis leren enz