logo

Genetiske algoritmer

Genetiske algoritmer (GA'er) er adaptive heuristiske søgealgoritmer, der tilhører størstedelen af ​​evolutionære algoritmer. Genetiske algoritmer er baseret på ideerne om naturlig udvælgelse og genetik. Disse er intelligent udnyttelse af tilfældige søgninger forsynet med historiske data for at dirigere søgningen ind i området med bedre ydeevne i løsningsrummet. De bruges almindeligvis til at generere løsninger af høj kvalitet til optimeringsproblemer og søgeproblemer.

Genetiske algoritmer simulerer processen med naturlig udvælgelse hvilket betyder, at de arter, der kan tilpasse sig ændringer i deres miljø, kan overleve og formere sig og gå til næste generation. Med enkle ord simulerer de overlevelse af de stærkeste blandt individer i på hinanden følgende generationer for at løse et problem. Hver generation består af en population af individer og hver enkelt repræsenterer et punkt i søgerummet og mulig løsning. Hvert individ er repræsenteret som en streng af tegn/heltal/float/bits. Denne streng er analog med kromosomet.



Grundlaget for genetiske algoritmer

Genetiske algoritmer er baseret på en analogi med den genetiske struktur og adfærd af kromosomer i befolkningen. Følgende er grundlaget for GA'er baseret på denne analogi -

  1. Individer i befolkningen konkurrerer om ressourcer og parrer sig
  2. De individer, der er succesrige (fittest), parrer sig derefter for at skabe flere afkom end andre
  3. Gener fra den stærkeste forælder forplanter sig gennem generationen, det vil sige nogle gange skaber forældre afkom, som er bedre end begge forældre.
  4. Således er hver efterfølgende generation mere egnet til deres miljø.

Søg rum

Populationen af ​​individer opretholdes inden for søgeområdet. Hvert individ repræsenterer en løsning i søgerummet for et givet problem. Hvert individ er kodet som en vektor med endelig længde (analog med kromosom) af komponenter. Disse variable komponenter er analoge med gener. Et kromosom (individ) er således sammensat af flere gener (variable komponenter).



Fitness Score

En Fitness Score gives til hver enkelt person viser en persons evne til at konkurrere . Der søges efter den person, der har en optimal konditionsscore (eller næsten optimal).

GA'erne opretholder populationen af ​​n individer (kromosom/opløsninger) sammen med deres fitnessscore. De personer, der har bedre fitnessscores, får større chance for at reproducere sig end andre. De personer med bedre konditionsresultater udvælges, som parrer sig og producerer bedre afkom ved at kombinere forældres kromosomer. Befolkningsstørrelsen er statisk, så lokalet skal oprettes til nyankomne. Så nogle individer dør og bliver erstattet af nyankomne, som til sidst skaber en ny generation, når alle parringsmulighederne for den gamle befolkning er udtømt. Det er håbet, at der over successive generationer vil komme bedre løsninger, mens de mindst fit dør.

Hver ny generation har i gennemsnit flere bedre gener end individet (løsningen) fra tidligere generationer. Således har hver ny generation bedre delløsninger end tidligere generationer. Når først det producerede afkom ikke har nogen signifikant forskel fra afkom produceret af tidligere populationer, er populationen konvergeret. Algoritmen siges at være konvergeret til et sæt af løsninger på problemet.



Operatører af genetiske algoritmer

Når den første generation er oprettet, udvikler algoritmen generationen ved hjælp af følgende operatører -
1) Valg af operatør: Ideen er at give præference til individer med gode konditionsresultater og give dem mulighed for at videregive deres gener til successive generationer.
2) Crossover-operatør: Dette repræsenterer parring mellem individer. To personer udvælges ved hjælp af udvælgelsesoperator, og krydsningssteder vælges tilfældigt. Derefter udveksles generne på disse krydsningssteder, hvorved der skabes et helt nyt individ (afkom). For eksempel -

3) Mutationsoperatør: Nøgleideen er at indsætte tilfældige gener i afkom for at opretholde diversiteten i befolkningen for at undgå for tidlig konvergens. For eksempel -

Skuespillerinde Sai Pallavi

Hele algoritmen kan opsummeres som -

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>

Eksempel på problem og løsning ved hjælp af genetiske algoritmer

Givet en målstreng er målet at producere målstreng med udgangspunkt i en tilfældig streng af samme længde. I den følgende implementering laves følgende analogier -

  • Tegn A-Z, a-z, 0-9 og andre specielle symboler betragtes som gener
  • En streng genereret af disse tegn betragtes som kromosom/opløsning/individ

Fitness score er antallet af tegn, der adskiller sig fra tegn i målstrengen ved et bestemt indeks. Så individer, der har lavere konditionsværdi, foretrækkes mere.

C++


hvordan man opgraderer java



// 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->kromosom = kromosom; fitness = cal_fitness(); }; // Udfør parring og frembring nyt afkom Individual Individual::mate(Individual par2) { // kromosom for afkom streng child_chromosome = ''; int len ​​= kromosom.størrelse(); for(int i = 0;i { // tilfældig sandsynlighed float p = random_num(0, 100)/100; // hvis sandsynlighed er mindre end 0,45, indsæt gen // fra forælder 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




df.loc

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()>

>

>

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) =>a == b ? 0 : 1).Sum(); } // Udfør parring og producere nyt afkom offentligt Individual Mate(Individual parent2) { char[] childChromosome = new char[Chromosom.Length]; for (int i = 0; i { double p = random.NextDouble(); if (s<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); } }>

>

hvad er min skærmstørrelse
>

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 FitnessComparer.Compare(a, b)); // hvis individet har den laveste konditionsscore, dvs. // 0 så ved vi, at vi har nået målet // og bryder løkken if (population[0].Fitness === 0) { found = true; pause; } // Ellers generer nye afkom til ny generation lad newGeneration = []; // Udfør Elitisme, det betyder, at 10% af den stærkeste befolkning // går til næste generation lad s = Math.floor((10 * POPULATION_SIZE) / 100); for (lad i = 0; i newGeneration.push(population[i]); // Fra 50 % af den stærkeste population vil individer // parre sig for at producere afkom s = Math.floor((90 * POPULATION_SIZE) / 100); for (lad i = 0; jeg lader r = TilfældigtNum(0, 50); lad forælder1 = population[r]; r = TilfældigtNum(0, 50); lad forælder2 = population[r]; lad afkom = forælder1.Partner( parent2); newGeneration.push(offspring } population = newGeneration.log('Generation: ' + generation + ' ' + 'String: ' + population[0]. ' ' + 'Fitness: ' + population[0].Fitness generation++; } console.log('Generation: ' + generation + ' ' + 'String: ' + population[0].Kromosom + ' ' + 'Fitness: ' + population[0].Fitness);

> 

Produktion:

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>

Bemærk: Hver gangs algoritme starter med tilfældige strenge, så output kan variere

Som vi kan se fra outputtet, sidder vores algoritme nogle gange fast på en lokal optimal løsning, dette kan forbedres yderligere ved at opdatere fitness-scoreberegningsalgoritmen eller ved at justere mutations- og crossover-operatorer.

Hvorfor bruge genetiske algoritmer

  • De er robuste
  • Giv optimering over stor pladstilstand.
  • I modsætning til traditionel kunstig intelligens går de ikke i stykker ved en lille ændring i input eller tilstedeværelse af støj

Anvendelse af genetiske algoritmer

Genetiske algoritmer har mange applikationer, nogle af dem er -

  • Tilbagevendende neuralt netværk
  • Mutationstest
  • Kodebrud
  • Filtrering og signalbehandling
  • At lære fuzzy regelgrundlag osv

hvad er hive