遺傳算法的原理與實現示例

??遺傳算法是一種受生物進化理論啟發的隨機優化算法,其核心思想是模擬自然界中 “物競天擇、適者生存” 的進化過程,通過對候選解的迭代優化,找到問題的最優解。

一、核心思想

??遺傳算法將優化問題的候選解視為生物群體中的“個體”,每個個體的“基因”對應解的參數。通過模擬生物進化中的選擇、交叉、變異等過程,讓群體中 “適應性強”(即更接近最優解)的個體保留并繁衍,“適應性弱” 的個體被淘汰,最終使群體逐漸逼近最優解。

二、算法步驟

1. 編碼:將問題解轉化為“基因”形式

??首先需要將實際問題的候選解編碼為計算機可處理的字符串(如二進制串、實數編碼等),這個字符串稱為 “染色體”,其中的每個元素(如二進制位)稱為 “基因”。

??例如:若優化問題是求“x 在 [0,31] 范圍內使函數 f (x)=x2 最大的解”,可將 x 用 5 位二進制編碼(如 x=5 對應染色體“00101”)。

2. 初始化群體

??隨機生成一定數量的染色體,組成初始 “群體”(個體數量稱為 “種群規模”)。

??例如:隨機生成 4 個 5 位二進制串,組成初始群體:00101、11011、01001、10010。

3. 適應度評估:衡量個體的 “優劣”

??定義“適應度函數”,計算每個個體的適應度值,值越高表示該個體(解)越優。

??例如:對上述問題,適應度函數可直接用 f (x)=x2,將染色體轉為十進制后計算:
??????00101(x=5)→ 適應度 = 25;
??????11011(x=27)→ 適應度 = 729(最優)。

4. 遺傳操作:模擬進化過程

??通過選擇、交叉、變異,生成下一代群體:

??選擇(Selection):從當前群體中篩選出適應度高的個體,使其有更高概率繁衍后代(類似 “適者生存”)。
??常用方法:輪盤賭選擇(適應度越高的個體,被選中的概率越大)。例如:適應度為 729 的個體被選中的概率遠高于25的個體。

??交叉(Crossover):將兩個選中的個體(父代染色體)按一定概率(交叉概率)交換部分基因,生成新個體(子代染色體),增加群體多樣性。

??例如:對父代11011和10010,隨機選擇交叉點(如第 3 位后),交換后半部分:
??????父代 1:110 | 11 → 子代 1:11010;
??????父代 2:100 | 10 → 子代 2:10011。

??變異(Mutation):對子代染色體的基因按一定概率(變異概率)隨機改變(如二進制位 0 變 1 或 1 變 0),避免群體陷入局部最優。

??例如:對子代11010的第 4 位進行變異(1→0),得到11000。

5. 終止條件

??重復步驟 3 和 4,直到滿足終止條件(如迭代次數達到上限、最優個體的適應度不再提升等),最終輸出適應度最高的個體作為最優解。

三、算法特點

??魯棒性:對問題的數學性質要求低,可處理非線性、多峰等復雜問題。
??并行性:群體中的多個個體可同時優化,適合并行計算。
??隨機性:通過隨機操作探索解空間,但通過適應度評估引導優化方向,兼顧 “探索” 與 “利用”。

四、應用場景

??遺傳算法廣泛用于函數優化、機器學習(如神經網絡參數優化)、組合優化(如旅行商問題、背包問題)、工程設計(如電路布局)等領域。

五、Python實現示例

??現尋找函數 f ( x ) = ? x 2 + 10 f(x)=-x^2+10 f(x)=?x2+10在區間 [ ? 10 , 10 ] [-10,10] [?10,10]內的最大值。理論上,當 x = 0 x=0 x=0時函數取得最大值 f ( 0 ) = 10 f(0)=10 f(0)=10。運行該程序后,可以觀察算法如何逐步逼近這個最優解。

import matplotlib
matplotlib.use('TkAgg')import numpy as np
import matplotlib.pyplot as plt# 目標函數:尋找 -x^2 + 10 的最大值
def objective_function(x):return -x ** 2 + 10# 解碼染色體為實際數值
def decode_chromosome(chromosome, min_val, max_val):"""將二進制染色體解碼為區間內的實數值"""binary_str = ''.join(map(str, chromosome))decimal = int(binary_str, 2)max_decimal = 2 ** len(chromosome) - 1return min_val + (max_val - min_val) * decimal / max_decimal# 計算適應度(函數值越大適應度越高)
def calculate_fitness(population, min_val, max_val):fitness = []for chromosome in population:x = decode_chromosome(chromosome, min_val, max_val)fitness.append(objective_function(x))return fitness# 選擇操作(錦標賽選擇)
def tournament_selection(population, fitness, tournament_size=3):selected = []for _ in range(len(population)):# 隨機選擇幾個個體進行比較tournament_indices = np.random.choice(len(population), tournament_size)tournament_fitness = [fitness[i] for i in tournament_indices]# 選擇適應度最高的個體winner_index = tournament_indices[np.argmax(tournament_fitness)]selected.append(population[winner_index])return selected# 交叉操作(單點交叉)
def crossover(parents, crossover_rate=0.8):children = []for i in range(0, len(parents), 2):parent1 = parents[i]parent2 = parents[i + 1] if i + 1 < len(parents) else parents[0]# 以一定概率進行交叉if np.random.random() < crossover_rate:crossover_point = np.random.randint(1, len(parent1))child1 = parent1[:crossover_point] + parent2[crossover_point:]child2 = parent2[:crossover_point] + parent1[crossover_point:]else:child1, child2 = parent1.copy(), parent2.copy()children.extend([child1, child2])# 確保種群大小不變return children[:len(parents)]# 變異操作
def mutate(population, mutation_rate=0.01):for chromosome in population:for i in range(len(chromosome)):if np.random.random() < mutation_rate:chromosome[i] = 1 - chromosome[i]  # 翻轉位return population# 主函數
def genetic_algorithm(pop_size=100, chromosome_length=10, generations=100,min_val=-10, max_val=10):# 初始化種群population = [np.random.randint(0, 2, chromosome_length).tolist() for _ in range(pop_size)]best_fitness_history = []best_solution = Nonebest_x = Nonefor generation in range(generations):# 計算適應度fitness = calculate_fitness(population, min_val, max_val)# 記錄最佳解best_idx = np.argmax(fitness)best_fitness_history.append(fitness[best_idx])if best_solution is None or fitness[best_idx] > calculate_fitness([best_solution], min_val, max_val)[0]:best_solution = population[best_idx]best_x = decode_chromosome(best_solution, min_val, max_val)# 選擇parents = tournament_selection(population, fitness)# 交叉children = crossover(parents)# 變異population = mutate(children)# 打印進度if generation % 10 == 0:print(f"Generation {generation}: Best fitness = {best_fitness_history[-1]:.4f}, Best x = {best_x:.4f}")# 繪制適應度進化曲線plt.figure(figsize=(10, 6))plt.plot(best_fitness_history)plt.title('Best Fitness Over Generations')plt.xlabel('Generation')plt.ylabel('Fitness')plt.grid(True)plt.savefig('figure/fitness_evolution.png')return best_solution, best_x, objective_function(best_x)# 運行算法
best_chromosome, best_x, best_fitness = genetic_algorithm()print("\n優化結果:")
print(f"最佳染色體: {best_chromosome}")
print(f"最優解 x = {best_x:.6f}")
print(f"最大值 f(x) = {best_fitness:.6f}")

在這里插入圖片描述
在這里插入圖片描述
??示例通過模擬生物進化過程來尋找函數的最優解。流程包括:
????初始化種群:隨機生成一組二進制編碼的染色體
????評估適應度:計算每個染色體對應的函數值
????選擇操作:使用錦標賽選擇法選出較優個體
????交叉操作:對選中的個體進行基因重組
????變異操作:引入隨機變異增加多樣性
????迭代進化:重復上述過程直到滿足終止條件


??通過模擬生物進化的“優勝劣汰”機制,遺傳算法能在復雜解空間中高效搜索最優解,是啟發式優化算法中的經典方法之一。



End.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/87596.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/87596.shtml
英文地址,請注明出處:http://en.pswp.cn/web/87596.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

centos7 ping127.0.0.1不通

ping 127.0.0.1&#xff0c;localhost和本地ip都不通&#xff0c;所有的配置也是正確的 檢查下是否禁止了ping vim /proc/sys/net/ipv4/icmp_echo_ignore_all 內容為 1 禁止ping 內容為0 開啟ping sysctl -w net.ipv4.icmp_echo_ignore_all0 變更以上設置即可

【無標題】JavaScript入門

JS 1.JS引入方式 <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>JS-引入方式</title><!-- …

(JAVA)自建應用調用企業微信API接口,實現消息推送

建議先簡單了解企業微信開發者中心文檔&#xff1a;開發前必讀 - 文檔 - 企業微信開發者中心 了解一下企業微信調用接口的基礎參數&#xff1a;基本概念介紹 - 文檔 - 企業微信開發者中心 本篇每個步驟都會跟著官網文檔走&#xff0c;都會貼上相關鏈接&#xff0c;看完本篇文…

P/Invoke 在默認封送(marshalling)規則下,常見托管 ? 非托管類型的對應關系

下表整理了 P/Invoke 在默認封送&#xff08;marshalling&#xff09;規則下&#xff0c;常見托管???非托管類型的對應關系。 內容主要依據微軟官方 Marshalling Data with?Platform?Invoke 文檔&#xff0c;并補充了常見指針&#xff0f;句柄用法與字符串緩沖區&#xff…

2.isaacsim4.2 教程-初識OmniGraph

1. OmniGraph&#xff08;視覺編程&#xff09; OmniGraph 是 Omniverse 的可視化編程框架。它提供了一個圖狀結構&#xff0c;將 Omniverse 內多個系統的功能節點串聯起來&#xff1b;同時也是一個計算框架&#xff0c;允許你編寫高度自定義的節點&#xff0c;將自己的功能無…

MonoGame 游戲開發框架日記 -03

第三章&#xff1a;創建類庫 內容介紹 主要內容&#xff1a;創建Core類并編寫 創建這個類主要是為了后續開發方便&#xff0c;并介紹游戲開發中的一種非常重要編程模式 單例模式&#xff0c;以及了解MonoGame基本圖形渲染知識單例模式&#xff1a; 第一步我們得先了解什么是單例…

AES 256 CBC加密和解密

AES-256-CBC 是一種對稱加密算法&#xff0c;使用 256位密鑰 和 CBC&#xff08;Cipher Block Chaining&#xff09;模式。它的典型使用場景包括對敏感信息進行加密存儲或傳輸。下面是 AES-256-CBC 的加密與解密的 Python 示例&#xff0c;使用 pycryptodome 庫&#xff1a; &a…

Git 版本控制完全指南:從入門到精通

Git 版本控制完全指南&#xff1a;從入門到精通 作為當今最流行的分布式版本控制系統&#xff0c;Git 已經成為開發者必備的技能之一。無論你是獨立開發者還是團隊協作&#xff0c;Git 都能幫助你高效管理代碼版本。本文將帶你從零開始&#xff0c;逐步掌握 Git 的核心概念和常…

408第三季part2 - 計算機網絡 - 計算機網絡分層結構

理解 PCI會放一些控制信息&#xff0c;源地址目的地址都在里面 SDU是放的數據 整個加起來是PDU 每一層的SDU都是上一層的PDU 看一看 也是簡單看一看就行 網絡層有時候也叫IP數據報 這里斷點下載的意思就是&#xff0c;你下載東西的時候網絡斷了&#xff0c;再連回來的時候會接…

打開攝像頭,服務器和客戶端傳輸攝像頭圖像數據

1&#xff1a;Camera Server 主要功能&#xff0c;打開攝像頭&#xff0c;接收客戶端請求 接收到客戶端請求“R”字符后開始傳輸攝像頭圖像。 #include "mainwindow.h" #include "ui_mainwindow.h"#include<QDebug>MainWindow::MainWindow(QWidget…

Android實現獲取前臺應用信息

Android實現獲取前臺應用信息 1.前言&#xff1a; 之前需要獲取在后臺運行的App信息&#xff0c;比如包名、版本這些常規的&#xff0c;今天是講解獲取在前臺的App信息&#xff0c;雖然App在前臺&#xff0c;但是具體的信息可能不知道&#xff0c;今天就嘗試獲取一下&#xf…

快訊|美團即時零售日訂單已突破1.2億,餐飲訂單占比過億

據美團內網公布信息顯示&#xff0c;截至22時54分&#xff0c;美團即時零售當日訂單已經突破了1.2億單&#xff0c;其中&#xff0c;餐飲訂單已超過1億單。 值得注意的是&#xff0c;就在當晚20時45分&#xff0c;美團內網曾顯示即時零售日訂單突破了1億。這也意味著&#xff…

pycharm2018配置gitee操作

一、gitee介紹及下載安裝 gitee介紹&#xff1a; gitee別名碼云&#xff0c;是中國的一個代碼托管平臺&#xff0c;類似于GitHub&#xff0c;基于Git技術&#xff0c;提供遠程倉庫托管、協作功能和開源社區服務&#xff0c;優勢包括訪問速度快、本地化服務和政策合規git和gite…

數據結構——棧的講解(超詳細)

數據結構——棧的講解&#xff08;超詳細&#xff09;-騰訊云開發者社區-騰訊云 #include"Stack.h" void STInit(ST* ps) {ps->arr NULL;ps->capacity ps->top 0; //總空間個數和有用空間個數都初始化為0 }void STDestroy(ST* ps) {if (ps -> arr) …

MySQL允許root用戶遠程連接

注意&#xff1a;在實際生產環境中&#xff0c;允許root用戶從任意主機&#xff08;‘%’&#xff09;連接存在安全風險&#xff0c;建議使用強密碼并限制訪問IP&#xff0c;或者創建具有必要權限的單獨用戶用于遠程連接。MySQL 配置遠程連接指南 1. 登錄 MySQL 服務器 mysql -…

STM32的 syscalls.c 和 sysmem.c

syscalls.c 是 STM32CubeIDE 自動生成的標準系統調用適配文件&#xff0c;用于裸機環境下支持 newlib 標準庫&#xff08;如 printf, scanf, malloc&#xff09;的運行。這份文件提供了標準庫運行所需的最小系統調用實現。現在我來逐段解析其作用&#xff0c;并補充你可能需要修…

Java零基礎筆記01(JKD及開發工具IDEA安裝配置)

1.Java簡介 Java是一種廣泛使用的計算機編程語言&#xff0c;由美國的Sun Microsystems公司&#xff08;Stanford University Network&#xff09;在1995年推出。Java以其跨平臺、面向對象、安全性高等特點&#xff0c;廣泛應用于企業級應用開發、移動應用開發等領域。2009年&a…

Spark SQL架構及高級用法

Spark SQL 架構概述 架構核心組件 API層&#xff08;用戶接口&#xff09; 輸入方式&#xff1a;SQL查詢&#xff1b;DataFrame/Dataset API。統一性&#xff1a; 所有接口最終轉換為邏輯計劃樹&#xff08;Logical Plan&#xff09;&#xff0c;進入優化流程。 編譯器層&…

【機器學習深度學習】什么是下游任務模型?

目錄 前言 一、什么是下游任務模型&#xff1f; 二、為什么需要下游任務模型&#xff1f; 三、下游任務模型都在干嘛&#xff1f; 四、下游模型怎么訓練出來的&#xff1f; 五、圖解理解&#xff1a;上游 vs 下游 六、一個現實案例&#xff1a;BERT做情感分析 原始數據…

補充:問題:CORS ,前后端訪問跨域問題

補充&#xff1a;問題&#xff1a;CORS &#xff0c;前后端訪問跨域問題 我這邊的解決方法是&#xff1a; myAxios.defaults.withCredentials true; // 配置為true&#xff0c;表示前端向后端發送請求的時候&#xff0c;需要攜帶上憑證cookie整體的&#xff1a; import axio…