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-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:
- Population initialisieren: Generieren Sie zufällig einen Satz anfänglicher Baumstrukturen als anfängliche Lösung der Population.
- Fitness bewerten: Führen Sie eine Fitnessbewertung für jede Person (Baumstruktur) durch, um ihre Fähigkeit zur Problemlösung zu bewerten.
- Auswahlvorgang: Wählen Sie einige Personen basierend auf Fitnesswerten als Eltern für nachfolgende Crossover- und Mutationsvorgänge aus.
- Crossover-Operation: Führen Sie eine Crossover-Operation an den ausgewählten Eltern-Individuen durch, um neue Nachkommen-Individuen zu generieren.
- 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.
- Population aktualisieren: Eltern und Nachkommen kombinieren, um eine neue Population zu bilden.
- 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.).
- 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:
- 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.
- Starke Interpretierbarkeit: Das generierte Programm oder Modell ist gut interpretierbar und kann uns helfen, die Beziehung zwischen Problemen und Lösungen zu verstehen.
- 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:
- Symbolisches Regressionsproblem: Ein mathematisches Modell kann durch genetische Programmieralgorithmen generiert werden, um eine Regressionsanalyse für gegebene Ein- und Ausgaben durchzuführen.
- Optimierungsprobleme: Genetische Programmieralgorithmen können zur Lösung komplexer Optimierungsprobleme wie Funktionsoptimierung, kombinatorische Optimierung usw. verwendet werden.
- 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.
- 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-Praxisserie – Pretraining, SFT, Belohnungsmodellierung, RLHF-CSDN-Blog zum GPT-Training
GPT-Praxisserie – GPT-Schulung Pretraining, SFT, Belohnungsmodellierung, RLHF
GPT Praktische Serieninterpretation der Feinabstimmung der Trainingsparameter des ChatGLM2-Modells
GPT-Praxisreihe – So optimieren Sie das ChatGLM2-Modelltraining mit Ihren eigenen Daten
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