Klassischer Algorithmus – Python-Implementierung des genetischen Algorithmus

Klassischer Algorithmus – Python-Implementierung des genetischen Algorithmus

Vorwort

In diesem Artikel werden klassische Algorithmen vorgestellt: Genetische Algorithmen sind von der biologischen Evolutionstheorie inspiriert und simulieren den Evolutionsprozess biologischer Populationen. Der genetische Algorithmus ist eine Art Optimierungsalgorithmus, der auf der Theorie der biologischen Evolution basiert. Er simuliert den Prozess der biologischen Evolution und optimiert und löst kontinuierlich Probleme durch Vorgänge wie Selektion, Crossover und Mutation. Genetische Programmierung (GP), als eine Art evolutionärer Algorithmus, generiert durch Evolution Programme oder Modelle, um Probleme zu lösen. Implementieren Sie einen genetischen Algorithmus mithilfe der Python-Sprache.


Artikel zum LLM-Großmodell:

GPT praktische Serie – ChatGLM3 lokale Bereitstellung CUDA11+1080Ti+ Grafikkarte 24G praktische Lösung

GPT-Praxisserie – Baichuan2-Lokalisierungsplan

GPT-Praxisreihe – So optimieren Sie das ChatGLM2-Modelltraining mit Ihren eigenen Daten

GPT praktische Serie – Dahua LLM Großmodellschulung

GPT Praktische Serieninterpretation der Feinabstimmung der Trainingsparameter des ChatGLM2-Modells

GPT Practical Series – Erkundung der Textgenerierung großer Modelle wie GPT

GPT-Praxisserie – GPT-Schulung Pretraining, SFT, Belohnungsmodellierung, RLHF


Genetische Programmierung ähnelt in gewissem Maße dem verstärkenden Lernen.

Konzept

Der genetische Algorithmus (GA) wurde erstmals in den 1970er Jahren von John Holland in den USA vorgeschlagen. Dieser Algorithmus wurde auf der Grundlage der Evolutionsgesetze von Organismen in der Natur entworfen und vorgeschlagen und simulierte die natürliche Selektion und Genetik von Darwins biologischer Evolutionstheorie. Das Rechenmodell Der biologische Evolutionsprozess des Mechanismus ist auch eine Methode zur Suche nach der optimalen Lösung durch Simulation des natürlichen Evolutionsprozesses.

Genetische Algorithmen nutzen mathematische Formeln und Computersimulationen, um den Problemlösungsprozess in einen Prozess umzuwandeln, der dem Crossover und der Mutation von Chromosomengenen in der biologischen Evolution ähnelt. Bei der Lösung komplexerer kombinatorischer Optimierungsprobleme können schnellere und bessere Optimierungsergebnisse erzielt werden als mit einigen herkömmlichen Optimierungsalgorithmen.

Gegenwärtig werden genetische Algorithmen häufig in Bereichen wie kombinatorischer Optimierung, maschinellem Lernen, Signalverarbeitung, adaptiver Steuerung und künstlichem Leben eingesetzt.

Grundlegend

Genetische Algorithmen optimieren durch Kombination, Mutation und Auswahl von Programmen oder Modellen. Es stellt ein Programm oder Modell als Baumstruktur dar, jeder Knoten repräsentiert eine Funktion oder einen Operator und jeder Blattknoten repräsentiert eine Variable oder Konstante. Genetische Programmieralgorithmen bearbeiten diese Bäume durch genetische Operationen, generieren kontinuierlich neue Lösungen und wählen durch Fitnessbewertung hervorragende Lösungen aus. Die grundlegenden Schritte des genetischen Programmieralgorithmus sind wie folgt:

  1. Population initialisieren: Generieren Sie zufällig einen Satz anfänglicher Baumstrukturen als anfängliche Lösung der Population.
  2. Fitness bewerten: Führen Sie eine Fitnessbewertung für jede Person (Baumstruktur) durch, um ihre Fähigkeit zur Problemlösung zu bewerten.
  3. Auswahlvorgang: Wählen Sie einige Personen basierend auf Fitnesswerten als Eltern für nachfolgende Crossover- und Mutationsvorgänge aus.
  4. Crossover-Operation: Führen Sie eine Crossover-Operation an den ausgewählten Eltern-Individuen durch, um neue Nachkommen-Individuen zu generieren.
  5. Mutationsoperation: Führen Sie eine Mutationsoperation an Nachkommen durch, führen Sie neue Variablen oder Operatoren ein und erhöhen Sie die Diversität des Lösungsraums.
  6. Population aktualisieren: Eltern und Nachkommen kombinieren, um eine neue Population zu bilden.
  7. Beurteilung der Beendigungsbedingungen: Bestimmen Sie, ob der Algorithmus basierend auf den voreingestellten Beendigungsbedingungen beendet werden soll (z. B. Erreichen der maximalen Anzahl von Iterationen oder Finden einer zufriedenstellenden Lösung usw.).
  8. Ergebnis zurückgeben: Gibt die optimale Lösung oder die Lösung zurück, die die Bedingungen erfüllt.

Algorithmusimplementierung

Implementierung eines genetischen Algorithmus. Die Einbeziehung von Python und verwandten wissenschaftlichen Computerbibliotheken wie Numpy- und Matplotlib-Bibliotheken wird bei der Implementierung eine wichtige Rolle spielen. Im Folgenden sind die Implementierungsschritte des genetischen Algorithmus aufgeführt.

1. Definieren Sie die Zielfunktion

Das Folgende ist ein Beispielcode eines einfachen genetischen Programmieralgorithmus, der zur Lösung des Maximalwertproblems einer einfachen mathematischen Funktion verwendet wird.

Definieren Sie zunächst eine Funktion zur Berechnung des Zielfunktionswerts. Der spezifische Code lautet wie folgt:

def target_function(x):
    return x ** 2 - 2 * x + 1

2. Definieren Sie relevante Parameter

Definieren Sie die für den genetischen Algorithmus erforderlichen Parameter, einschließlich Populationsgröße, Genlänge, Crossover-Wahrscheinlichkeit, Mutationswahrscheinlichkeit usw. Die folgenden Parameter werden speziell verwendet:

# 定义遗传规划算法的参数
POPULATION_SIZE = 100
GENERATION_COUNT = 50
CROSSOVER_RATE = 0.8
MUTATION_RATE = 0.1

3. Initialisieren Sie die Bevölkerung

Als nächstes folgt der Initialisierungsvorgang, bei dem eine zufällig generierte Binärzeichenfolge als anfängliches Individuum verwendet wird, wie unten gezeigt:

# 定义个体的数据结构
class Individual:
    def __init__(self, chromosome):
        self.chromosome = chromosome
        self.fitness = self.calculate_fitness()
    
    
# 初始化种群
def initialize_population():
    population = []
    for _ in range(POPULATION_SIZE):
        chromosome = [random.randint(0, 1) for _ in range(10)]  # 假设染色体长度为10
        individual = Individual(chromosome)
        population.append(individual)
    return population

4. Wählen Sie den Vorgang aus

# 选择操作
def selection(population):
    # 使用轮盘赌选择算法
    total_fitness = sum(individual.fitness for individual in population)
    probabilities = [individual.fitness / total_fitness for individual in population]
    selected_individuals = random.choices(population, probabilities, k=POPULATION_SIZE)
    return selected_individuals

5. Kreuzbetrieb

# 交叉操作
def crossover(parent1, parent2):
    if random.random() < CROSSOVER_RATE:
        crossover_point = random.randint(1, len(parent1.chromosome) - 1)
        child1_chromosome = parent1.chromosome[:crossover_point] + parent2.chromosome[crossover_point:]
        child2_chromosome = parent2.chromosome[:crossover_point] + parent1.chromosome[crossover_point:]
        child1 = Individual(child1_chromosome)
        child2 = Individual(child2_chromosome)
        return child1, child2
    else:
        return parent1, parent2

6. Mutationsoperation

# 变异操作
def mutation(individual):
    mutated_chromosome = individual.chromosome.copy()
    for i in range(len(mutated_chromosome)):
        if random.random() < MUTATION_RATE:
            mutated_chromosome[i] = 1 - mutated_chromosome[i]
    return Individual(mutated_chromosome)

7. Fitnessfunktion definieren

Dann gibt es noch die Operation zum Definieren der Fitnessfunktion. Die Fitnessfunktion ist der Wert der Zielfunktion, wie unten gezeigt:

def calculate_fitness(self):
        x = self.decode_chromosome()
        return target_function(x)
def decode_chromosome(self):
        binary_x = "".join(str(bit) for bit in self.chromosome)
        x = int(binary_x, 2) * (X_MAX - X_MIN) / (2 ** len(self.chromosome) - 1) + X_MIN
        return x

8. Implementieren Sie den genetischen Iterationszyklus

Der Schlüssel zum genetischen Algorithmus besteht darin, die Hauptschleife der genetischen Iteration zu implementieren. Hier wird die Anzahl der Iterationen auf 100 festgelegt und die grafische Oberfläche wird nach jeder Iteration aktualisiert. Der spezifische Code lautet wie folgt:

population = initialize_population()
    best_fitness = float('-inf')
    best_individual = None
    for generation in range(GENERATION_COUNT):
        selected_individuals = selection(population)
        new_population = []
        while len(new_population) < POPULATION_SIZE:
            parent1, parent2 = random.sample(selected_individuals, 2)
            child1, child2 = crossover(parent1, parent2)
            child1 = mutation(child1)
            child2 = mutation(child2)
            new_population.extend([child1, child2])
        population = new_population
        # 更新最佳个体
        for individual in population:
            if individual.fitness > best_fitness:
                best_fitness = individual.fitness
                best_individual = individual
        print("Generation:", generation + 1)
        print("Best Individual:", best_individual.chromosome)
        print("Best Fitness:", best_fitness)
        print()
    # 输出最终结果
    x = best_individual.decode_chromosome()

Die oben genannten Schritte implementieren einen einfachen genetischen Algorithmus, der ausgeführt werden kann, um die Entwicklung des Algorithmus und die schrittweise Optimierung der optimalen Lösung zu beobachten.


Genetische Programmieralgorithmen haben folgende Vorteile:

  1. Hochgradig anpassungsfähig: Genetische Programmieralgorithmen können die Struktur und Parameter von Kandidatenlösungen automatisch anpassen, um sie an die Komplexität und Vielfalt des Problems anzupassen.
  2. Starke Interpretierbarkeit: Das generierte Programm oder Modell ist gut interpretierbar und kann uns helfen, die Beziehung zwischen Problemen und Lösungen zu verstehen.
  3. Breite Anwendbarkeit: Genetische Programmieralgorithmen können auf eine Vielzahl von Problembereichen angewendet werden, z. B. maschinelles Lernen, Data Mining, Entwurf von Steuerungssystemen usw. Genetische Programmieralgorithmen werden häufig in den folgenden Bereichen eingesetzt:
  4. Symbolisches Regressionsproblem: Ein mathematisches Modell kann durch genetische Programmieralgorithmen generiert werden, um eine Regressionsanalyse für gegebene Ein- und Ausgaben durchzuführen.
  5. Optimierungsprobleme: Genetische Programmieralgorithmen können zur Lösung komplexer Optimierungsprobleme wie Funktionsoptimierung, kombinatorische Optimierung usw. verwendet werden.
  6. Entwurf von Steuerungssystemen: Genetische Programmieralgorithmen können zum Entwurf von Parametern oder Strukturen von Steuerungssystemen verwendet werden, um die Systemleistung und -stabilität zu verbessern.
  7. Künstliche Intelligenz: Mithilfe genetischer Programmieralgorithmen können intelligente Agenten, Entscheidungsbäume usw. generiert werden, um Probleme im Bereich der künstlichen Intelligenz zu lösen.

GPT-Kolumnenartikel:
GPT-Praxisserie – ein kurzer Chat über LangChain

GPT praktische Serie – LangChain + ChatGLM3 baut einen Wetterabfrageassistenten auf

GPT-Praxisreihe – Ich verwende das große Modell, um mit ChatGLM3 einen Abfrageassistenten zu erstellen

GPT Practical Series – Berechnungsgenauigkeit und Quantifizierung großer Modelle wie Baichuan2 – CSDN-Blog

GPT-Praxisserie – Pretraining, SFT, Belohnungsmodellierung, RLHF-CSDN-Blog zum GPT-Training

GPT-Praxisserie – GPT-Schulung Pretraining, SFT, Belohnungsmodellierung, RLHF

GPT praktische Serie – P-Tuning lokalisiertes Training ChatGLM2 und andere LLM-Modelle, was genau hat es bewirkt? (zwei)

GPT praktische Serie – P-Tuning lokalisiertes Training ChatGLM2 und andere LLM-Modelle, was genau hat es bewirkt? (eins)

GPT praktische Serie – ChatGLM3 lokale Bereitstellung CUDA11+1080Ti+ Grafikkarte 24G praktische Lösung

GPT Praktische Serieninterpretation der Feinabstimmung der Trainingsparameter des ChatGLM2-Modells

GPT-Praxisreihe – So optimieren Sie das ChatGLM2-Modelltraining mit Ihren eigenen Daten

Die GPT-Praxisserie ChatGLM2 stellt eine praktische 24G-Lösung mit Ubuntu+Cuda11+Videospeicher bereit

GPT-Praxisserie – Baichuan2-Lokalisierungsplan

GPT Practical Series – Erkundung der Textgenerierung großer Modelle wie GPT-CSDN Blog

Großer Assistent für Modellabfragetools, kostenlose Abfrageschnittstelle

Guess you like

Origin blog.csdn.net/Alex_StarSky/article/details/135460134