Heim  >  Artikel  >  Backend-Entwicklung  >  Python-Code zur Implementierung eines genetischen Algorithmus

Python-Code zur Implementierung eines genetischen Algorithmus

黄舟
黄舟Original
2017-10-10 10:46:364577Durchsuche

In diesem Artikel wird hauptsächlich der genetische Algorithmus von Python vorgestellt. Der Herausgeber ist der Meinung, dass er jetzt mit Ihnen geteilt wird und als Referenz dient. Folgen wir dem Editor und werfen wir einen Blick darauf.

Vorher geschrieben

Im vorherigen Artikel habe ich bereits über den grundlegenden Prozess des genetischen Algorithmus gesprochen und ihn mit MATLAB implementiert . . Dieser Artikel richtet sich hauptsächlich an Personen, die meine vorherigen Artikel gelesen haben. Daher werde ich nicht näher darauf eingehen, was ein genetischer Algorithmus ist und welchen grundlegenden Inhalt er hat. Es wird davon ausgegangen, dass jeder bereits weiß, wie ich einen genetischen Algorithmus schreibe.

Hauptfunktion des genetischen Algorithmus von Python

Meine Idee ist es, eine Chromosomenklasse zu erstellen, die zwei Variablen enthält: Chromosomenchrom und Fitnessfitness. Daher können wir Objekte direkt als Individuen in der Population erstellen.


#染色体的类
class Chrom:
  chrom = []
  fitness = 0
  def showChrom(self):
    print(self.chrom)
  def showFitness(self):
    print(self.fitness)

Also beginnen wir mit der Einstellung der Grundparameter. Ich verwende ein Wörterbuch, um die Bevölkerung auszudrücken, was bedeutet, dass ich ein Wörterbuch verwende, um alle Personen in der Bevölkerung zu speichern. Dies ist auch die Methode, die ich mir ausgedacht habe, um mehrere Objekte zu erstellen.

Konvertieren Sie den Wörterbuchindex in die einzelne Bezeichnung, z. B.: chrom1, chrom2 usw. Der Wert eines Wörterbuchindex ist ein Objekt. Dieses Objekt hat zwei Attribute, nämlich Chromosom und Fitness.

Tatsächlich denke ich, dass die Idee in dieser Hinsicht der Matrixprogrammierung mit MATLAB überlegen ist. Da dies die Idee von Individuen und individuellen Attributen sehr intuitiv ausdrücken kann, ist es logischerweise einfacher zu akzeptieren als eine Reihe von Matrizen.


#基础参数
N = 200 #种群内个体数目
mut = 0.2 #突变概率
acr = 0.2 #交叉概率

pop = {} #存储染色体的字典
for i in range(N):
  pop['chrom'+str(i)] = Chrom()
chromNodes = 2 #染色体节点数(变量个数)
iterNum = 10000 #迭代次数
chromRange = [[0, 10], [0, 10]] #染色体范围
aveFitnessList = [] #平均适应度
bestFitnessList = [] #最优适应度

Danach kommt das anfängliche Chromosom, das verschiedene Funktionen umfasst, die zur Initialisierung der Population, zur Berechnung der Fitness, zur Suche nach dem Optimum usw. verwendet werden. Ich habe sie hier in zwei getrennt Dateien, nämlich Genetic.py und Fitness.py.

Es gibt acht Funktionen in Genetic.py, die hauptsächlich Funktionen umfassen, die auf Populationen oder Chromosomen wirken, nämlich:

  1. findBest-Funktion, die verwendet wird, um Mitglieder von zu finden eine Population Das optimale Chromosom;

  2. findworser-Funktion, wird verwendet, um das schlechteste Chromosom in der Population zu finden;

  3. initialize-Funktion, wird verwendet, um das zu initialisieren Population;

  4. calAveFitness-Funktion, die zur Berechnung der durchschnittlichen Fitness der Population verwendet wird;

  5. mutChrom-Funktion, die zur Mutation von Chromosomen verwendet wird;

  6. inRange-Funktion, die verwendet wird, um zu bestimmen, ob der Chromosomenknotenwert außerhalb der Grenzen liegt;

  7. acrChrom-Funktion, die zum Überqueren des Chromosoms verwendet wird; 🎜>

    compareChrom-Funktion, mit der zwei Chromosomen verglichen werden können, welches besser ist.
  8. Es gibt zwei Funktionen in Fitness.py, die hauptsächlich Funktionen für Fitnessoperationen umfassen, nämlich:

calFitness-Funktion, verwenden Sie Zum Iterieren
  1. funcFitness-Funktion berechnet die Fitness einer einzelnen Person.
  2. Der Initialisierungscode kann also wie folgt aufgelistet werden:


Die Idee und Logik des iterativen Prozesses sind dieselben wie MATLAB

#初始染色体
pop = Genetic.initialize(pop, chromNodes, chromRange)
pop = Fitness.calFitness(pop) #计算适应度
bestChrom = Genetic.findBest(pop) #寻找最优染色体
bestFitnessList.append(bestChrom[1]) #将当前最优适应度压入列表中
aveFitnessList.append(Genetic.calAveFitness(pop, N)) #计算并存储平均适应度


Erstellen Sie abschließend ein iteratives Bild

#开始迭代
for t in range(iterNum):
  #染色体突变
  pop = Genetic.mutChrom(pop, mut, chromNodes, bestChrom, chromRange)
  #染色体交换
  pop = Genetic.acrChrom(pop, acr, chromNodes)
  #寻找最优
  nowBestChrom = Genetic.findBest(pop)
  #比较前一个时间的最优和现在的最优
  bestChrom = Genetic.compareChrom(nowBestChrom, bestChrom)
  #寻找与替换最劣
  worseChrom = Genetic.findWorse(pop)
  pop[worseChrom[0]].chrom = pop[bestChrom[0]].chrom.copy()
  pop[worseChrom[0]].fitness = pop[bestChrom[0]].fitness
  #存储最优与平均
  bestFitnessList.append(bestChrom[1])
  aveFitnessList.append(Genetic.calAveFitness(pop, N))


Fügen Sie abschließend verschiedene Bilder hinzu front Die Bibliothek und die Dateien sind betriebsbereit.

plt.figure(1)
plt.plot(x, aveFitnessList)
plt.plot(x, bestFitnessList)
plt.show()


Erleuchtung
import Genetic
import Fitness
import matplotlib.pyplot as plt
import numpy as np

Man kann sagen, dass die wichtigste Erkenntnis die Kategorie der Chromosomen ist. Tatsächlich können die beiden Dateien Genetic.py und Fitness.py auch direkt in Klassen gepackt werden, aber in diesem Fall halte ich die Hauptdatei für zu aufgeblasen und es wäre schließlich überflüssig, sie in Klassen in anderen Dateien zu packen , das ist nur ein kleines Programm, also habe ich das geschrieben.

Ich verstehe die Vorteile der objektorientierten Programmierung zutiefst. Es ist ein wahres Vergnügen, die Programmierlogik zu verarbeiten. Sie müssen nur über die Eigenschaften des Objekts nachdenken, wodurch eine Menge komplizierter Überlegungen entfallen.

Eine weitere Erkenntnis besteht darin, beim Erstellen mehrerer Objekte die Wörterbuchmethode zum Erstellen von Objekten zu verwenden. Am Anfang war ich auch verwirrt darüber, wie man ein Objektarray ähnlich dem in C++ erstellt. Ich habe im Internet nach verschiedenen Methoden gesucht, aber die Ergebnisse waren alle ausweichend (natürlich kann es sein, dass meine Suchfähigkeit zu schlecht ist). und ich konnte es nicht finden), also bin ich nach dem Ausprobieren auf diese Methode gestoßen.

Ich werde diese Methode im Detail erklären, wenn ich Zeit habe, aber dieses Mal werde ich hier aufhören.

Die übrigen Funktionen werden ergänzt

Die erste sind die acht Funktionen in Genetic.py


Dann gibt es noch die beiden Funktionen von Fitness.py

import random

#寻找最优染色体
def findBest(pop):
  best = ['1', 0.0000001]
  for i in pop:
    if best[1] < pop[i].fitness:
      best = [i, pop[i].fitness]
  return best

#寻找最劣染色体
def findWorse(pop):
  worse = [&#39;1&#39;, 999999]
  for i in pop:
    if worse[1] > pop[i].fitness:
      worse = [i, pop[i].fitness]
  return worse

#赋初始值
def initialize(pop, chromNodes, chromRange):
  for i in pop:
    chromList = []
    for j in range(chromNodes):
      chromList.append(random.uniform(chromRange[j][0], chromRange[j][1]+1))
    pop[i].chrom = chromList.copy()
  return pop

#计算平均适应度
def calAveFitness(pop, N):
  sumFitness = 0
  for i in pop:
    sumFitness = sumFitness + pop[i].fitness
  aveFitness = sumFitness / N
  return aveFitness

#进行突变
def mutChrom(pop, mut, chromNodes, bestChrom, chromRange):
  for i in pop:
    #如果随机数小于变异概率(即可以变异)
    if mut > random.random():
      mutNode = random.randrange(0,chromNodes)
      mutRange = random.random() * (1-pop[i].fitness/bestChrom[1])**2
      pop[i].chrom[mutNode] = pop[i].chrom[mutNode] * (1+mutRange)
      #判断变异后的范围是否在要求范围内
      pop[i].chrom[mutNode] = inRange(pop[i].chrom[mutNode], chromRange[mutNode])
  return pop

#检验便宜范围是否在要求范围内
def inRange(mutNode, chromRange):
  if chromRange[0] < mutNode < chromRange[1]:
    return mutNode
  elif mutNode-chromRange[0] > mutNode-chromRange[1]:
    return chromRange[1]
  else:
    return chromRange[0]

#进行交叉
def acrChrom(pop, acr, chromNodes):
  for i in pop:
    for j in pop:
      if acr > random.random():
        acrNode = random.randrange(0, chromNodes)
        #两个染色体节点进行交换
        pop[i].chrom[acrNode], pop[j].chrom[acrNode] = pop[j].chrom[acrNode], pop[i].chrom[acrNode]
  return pop

#进行比较
def compareChrom(nowbestChrom, bestChrom):
  if bestChrom[1] > nowbestChrom[1]:
    return bestChrom
  else:
    return nowbestChrom

Das obige ist der detaillierte Inhalt vonPython-Code zur Implementierung eines genetischen Algorithmus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn