對遺傳算法思想的理解與實例詳解

目錄

一、概述

二、實例詳解

1)問題描述與分析

2)初始化種群

3)計算種群適應度

4)遺傳操作

5)基因交叉操作

6)變異操作

三、計算結果

四、總結?


一、概述

? ? ? ?遺傳算法在求解最優解的問題中最為常用,不論是在線性還是非線性問題中都得到廣泛運用。本文主要介紹對遺傳算法思想的個人理解,并結合一個簡單實例進行說明,以便在后續實際問題中能夠借助遺傳算法思想解決問題。首先需要明白的是,遺傳算法只是一種求解最優近似解的算法之一,它不是用于求解精確解的方法。當然,如果我們能得到精確解,自然也沒必要去研究最優近似解。

? ? ? ?從遺傳算法的名字我們也可知道,這個算法的思想借助了生物學上生物進化與基因遺傳的思想。生物個體在進化過程中,基因代代相傳,并在傳遞過程中出現基因混合、突變等現象,然后適應環境的基因被保存下來,不適應環境的基因被淘汰出局,如此生物基因逐步達到與環境的最佳適配。遺傳算法的迭代過程正式基于生物進化過程來構建,并用相應的數學概念來對應生物進化過程的個體、基因、遺傳、混合(雜交)、淘汰等,其過程完全按照生物進化過程進行迭代演進。

? ? ? ?我們知道,生物進化中基因傳遞、自然淘汰等都是不可預測的概率事件。因此,遺傳算法迭代過程也充滿了不可預測性。雖然總體趨勢是向最優方向發展,但是我們并不能準確給出何時算法能得到我們認為的最優近似結果。也或許在某些問題中,我們根本不知道得到的結果是否就是最好的解。

二、實例詳解

1)問題描述與分析

? ? ? 使用遺傳算法計算函數result = x + 10 * sin(4*x) + 7 * cos(3*x)在自變量[0,10]以內的最大值。這是一個非常簡單的求極值問題,我們通過解析法也可以得到精確解,但是此處我們需要借助這個問題來詳細說明遺傳算法的實現。通過前面的概述,我們可以知道遺傳算法的實現應該依次有以下步驟:創建一個初始種群—>計算種群的適應度—>種群遺傳—>新種群雜交—>新種群變異—>計算新種群適應度,如此循環進行上述操作,直到我們得到合適的結果或迭代步數完成為止。下面借助MATLAB逐一說明每一步的實現過程。

2)初始化種群

? ? ? ?從生物學角度來講,一個種群包含若干個體,一個個體包含若干基因。因此,初始化種群前我們需要確定這個種群的個體數量和每個個體包含多少基因。在實際操作中,種群的大小和基因數量都應根據實際問題來分析設置,因為它們直接影響算法的收斂速度和求解精度。在此問題中,我們可以選擇種群數量為50個個體,這個值盡量大一點,在計算機性能允許的條件下。每個個體的基因數量設置為20。

? ? ? ?此處作進一步說明,個體其實就是我們預設的一組方程x的解,這里我們隨機預設了50個解,當然我們并不知道其中是否包含了最優解,這50個解我們將使用程序自動隨機生成。個體的基因其實就是對每個解使用二進制編碼時需要使用的二進制位數,這個位數越長,解的精度越高,當然對計算機性能的要求也越高,如果實際問題對求解精度要求很高,需要編碼長度越長。在遺傳算法中,使用二進制對個體(解)進行編碼是最常用,且最直觀的方式,因此此處就直接采用二進制編碼形式。初始化種群的具體實現如下段MATLAB代碼所示。

? ? ? ? 此段代碼已逐行解釋,核心是initial_group = randi([0,1],NP, L),randi函數實現了一個隨機初始化種群,并將該種群放入矩陣initial_group中。randi函數的作用是生成一個NP行,L列的整數矩陣,該矩陣中的元素在0和1之間隨機取值。由此我們可以知道,initial_group矩陣中,每一行表示一個個體,共有50個,每個個體包含20個基因,而基因是由0和1組成的。至于每個個體和解的對應關系,后面詳述。

NP = 50;%種群個體數量
L = 20;%個體編碼長度
PC = 0.8;%交叉概率
PB = 0.1;%變異概率
G = 100;%最大迭代次數
up = 10;%上限
down = 0;%下限
initial_group = randi([0,1],NP, L);%初始化種群

3)計算種群適應度

? ? ? ? 計算種群適應度,就是要得到在當代的種群中,每個個體對環境的適應度,環境適應度高的個體我們保留并遺傳至下一代,適應度低的個體我們就淘汰。在此問題中我們要做的就是得到每個個體接近最大值的程度,因此我們要分析如何來設計這個適應度函數。從某種程度上說,適應度函數的設計是影響遺傳算法解決實際問題效果的核心環節。某些地方也將適應度函數稱為評價函數,即用于評價群體中個體的優劣。適應度函數也是實際問題與遺傳算法相關聯的關鍵數學模型,在此問題中,我們直接給出了一個數學模型,分析時比較簡單,但在許多實際問題中需要我們自己去建立一個合理的數學模型,這也是用遺傳算法解決實際問題的難點所在。

? ? ? ?在本問題中,我們的目的是求函數的最大值(x,y),并給出了函數公式,因此我們可以直接采用原函數作為適應度函數,將個體帶入函數中,得到的值越大,說明個體適應度越高,簡單且直觀。

function result = fitnessFun(x)
result = x + 10 * sin(4*x) + 7 * cos(3*x);
end

? ? ? ?而我們在具體實現時還需要做一些處理。 首先是將群體中的個體轉換為適應度函數的輸入值,我們初始化得到的群體是一群使用二進制編碼的個體,并不是直觀的函數輸入值,所以我們首先需要將二進制編碼的個體轉換為十進制數,并將這群個體限制在給定的求值范圍內,這樣就得到了適應度函數可用的輸入值,具體代碼如下:

U = initial_group(i,:);
value = 0;
for j = 1:Lvalue = U(j)*2^(j-1) + value;
end
x(i) = down + value * (up - down)/(2^L - 1);%將編碼轉換為函數輸入值

? ? ? ?然后,我們將轉換后的個體帶入適應度函數中,就可以得到每個個體的適應度值。此處對適應度值進行了歸一化處理,將適應度控制在0到1之間,便于后續處理。

 Fit = fitnessFun(x);maxFit = max(Fit);%最大適應度值minFit = min(Fit);%最小適應度值inde_maxFit = find(Fit == maxFit);%適應度最大的個體所在位置,可能有多個值best_unit = initial_group(inde_maxFit(1,1),:);%當代中最優個體best_unitV = x(inde_maxFit(1,1));%該最優個體對應的值Fit = (Fit - minFit)/(maxFit - minFit);%歸一化適應度值,限制在0到1之間

4)遺傳操作

? ? ? ?以下開始進行進化操作,首先是進行遺傳,即根據當代種群的適應度值選擇哪些個體可以被遺傳到下一代。常用的遺傳操作方法是輪盤賭方式,具體實現代碼如下所示。輪盤賭方式就是將個體的概率按大小成比例按順序分布在圓盤上,圓盤扇形區域的大小反映了個體概率大小。當轉動輪盤時,指針最后指向的區域對應個體就是選中的個體。由此可知,個體概率越大,被選中的概率就越大。

? ? ? ?下述代碼中,前兩行是將適應度值轉化為概率值。cumsum函數將概率值進行逐項連續累加,作為輪盤賭的概率值。while循環中執行了輪盤賭操作,總共執行了NP(50)次。采用輪盤賭操作后,適應度高的個體被遺傳到下一代的概率大,且同一個個體存在被多次遺傳到下一代的可能。通過遺傳操作后,新的種群數量與上一代個體數量保持一致。

sum_fit = sum(Fit);
fitvalue = Fit./sum_fit;
fitvalue = cumsum(fitvalue);%對向量fitvalue進行逐項累加,返回一個向量如:1 2 3,返回1 3 6
ms = sort(rand(NP,1));%生成一組隨機向量,并按從小到大排序
inde_fit = 1;
inde_newUnit = 1;
while inde_newUnit <= NP%執行輪盤賭操作,上一代中同一個個體存在被多次遺傳至下一代的可能if(ms(inde_newUnit)) < fitvalue(inde_fit)new_group(inde_newUnit,:) = initial_group(inde_fit,:);%復制個體,直接遺傳至下一代inde_newUnit = inde_newUnit + 1;elseinde_fit = inde_fit +1;end
end

5)基因交叉操作

? ? ? ?交叉操作是指在上述新產生的子代群體中,選擇兩個個體,對這兩個個體對應位置的基因進行交換。具體實現代碼如下,我們直接依次選取相鄰兩個個體進行交叉操作。p是隨機生成的一個隨機數,通過與PC比較用于判斷是否要執行交叉操作。q是隨機生成的一個長度為L的0和1的向量。這個向量的作用是用于實現隨機選擇需要交叉的位置。此處我們將元素1對應的位置進行交叉。向量q保證了我們執行交叉時,交叉的位置和基因數量的隨機性。

    for i = 1:2:NP%在相鄰兩個個體之間執行交叉操作p = rand;%產生一個隨機數if p < PCq = randi([0,1],1,L);for j = 1:Lif q(j) == 1temp = new_group(i+1, j);new_group(i+1, j) = new_group(i, j);new_group(i, j) = temp;endendendend

6)變異操作

? ? ? ? 變異就是將一個個體中某些位置的基因進行修改,對于二進制編碼的個體而言,就是將部分位置的編碼元素取反。具體實現如下,while循環表征了執行變異次數的隨機性,inde_varUnit表征了執行變異個體的隨機性,for循環表征了執行變異基因的位置和數量的隨機性。

    i = 1;while i <= round(NP*PB)inde_varUnit = randi([1,NP]);%隨機指定需要變異的個體for j = 1:round(L*PB)inde_varD = randi([1,L]);%隨機指定需要變異的基因位置new_group(inde_varUnit, inde_varD) = ~new_group(inde_varUnit, inde_varD);%取反即可endi= i + 1;end

三、計算結果

在本實例中,函數的實際圖像如下,函數的最大值約為(8.28,24.8935)。

采用遺傳算法求解過程如下,得到的最優解為(8.28822,24.9005),相差很小。?參考源代碼實現。

四、總結?

? ? ? ? 本文詳細講述了經典遺傳算法的思想和典型案例實現思路。遺傳算法從一群初始解中去尋找最優解,并在迭代過程中不斷優化這個解群,其優化方法是大概率繼承前一代中最優的解,并對新的解群進行交叉、變異操作,以產生出新的解。在此過程中有兩個關鍵環節,一是解的適應度函數模型,這個是連接遺傳算法和實際問題的紐帶,是我們分析實際問題是否適用遺傳算法的關鍵;二是解的優化,從上述過程中我們可知,解的優化在交叉和變異,只有這兩步才會在原有解的基礎上產生出新的解,而這兩步操作充滿了隨機性。其中交叉的概率我們設置得比較大,因為交叉后產生的新解大概率不會與原解存在較大的差異,避免新的解呈現大幅度雜亂無序的變化。而變異操作我們設置的概率很小,且在執行次數、變異位置和數量上都引入了變異概率。這是因為變異操作針對單個個體,一個編碼位置的突變可能會導致出現一個異常偏離群體的個體,我們自然不能允許這樣的個體在群體中大量出現,但是我們又不能杜絕這樣的個體出現,因為沒有異常偏離群體的個體,我們可能會丟失可能存在的其他最優解,而陷入局部最優中,變異操作在一定程度上可以避免這樣的情況。

? ? ? ? 從本文實例中我們還可知,遺傳算法的初始解群體對算法收斂影響很大。本例中,我們限定了所有解的范圍,算法收斂速度很快,如果我們不限定范圍,或者我們將初始解群體限制在[0,5],可想而知我們可能得不到最優解,或陷入局部最優中。遺傳算法提供的是一種求解最優解的思想,而不是一種固定的模式方法,套用模式只會限制它的應用。因此具體問題要具體分析,我們要盡可能在初始化群體時確保最優解在群體囊括的包絡內,輪盤賭的遺傳方式是否合適,是否需要繼承一些適應度小的個體,變異的概率是否需要大一些,以確保群體的多樣性等,這些都是在分析實際問題時需要考慮的。通常情況下,如果我們無法限定解的范圍,也無法確定適應度函數的趨勢,那么使用遺傳算法求解也是不合適的。比如在此例中,不限定解的范圍,在整個實數域我們是無法求解的。

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

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

相關文章

計算機圖形學編程(使用OpenGL和C++)(第2版) 學習筆記 07.光照

1. 光照 1.1. 光源 光源類型特點優點缺點環境光整個場景均勻受光&#xff0c;無方向和位置。模擬全局光照&#xff0c;避免完全黑暗的區域。缺乏方向性和真實感&#xff0c;無法產生陰影。平行光光線方向平行&#xff0c;無位置&#xff0c;僅有方向。計算簡單&#xff0c;適…

Python在大數據機器學習模型的多模態融合:深入探索與實踐指南

一、多模態融合的全面概述 1.1 多模態融合的核心概念 多模態融合(Multimodal Fusion)是指將來自不同傳感器或數據源(如圖像、文本、音頻、視頻、傳感器數據等)的信息進行有效整合,以提升機器學習模型的性能和魯棒性。在大數據環境下,多模態融合面臨著獨特的挑戰和機遇: 數…

【PostgreSQL數據分析實戰:從數據清洗到可視化全流程】6.4 時間序列分析(窗口函數處理時間數據)

&#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 &#x1f449; 點擊關注不迷路 文章大綱 PostgreSQL時間序列分析&#xff1a;窗口函數處理時間數據實戰一、時間序列分析核心場景與窗口函數優勢1.1 業務場景需求1.2 窗口函數核心優勢 二、窗口函數基礎&#xff1a…

window 顯示驅動開發-配置內存段類型

視頻內存管理器&#xff08;VidMm&#xff09;和顯示硬件僅支持某些類型的內存段。 因此&#xff0c;內核模式顯示微型端口驅動程序&#xff08;KMD&#xff09;只能配置這些類型的段。 KMD 可以配置內存空間段和光圈空間段&#xff0c;其中不同&#xff1a; 內存空間段由保存…

筆記,麥克風的靈敏度

麥克風的“靈敏度&#xff08;Sensitivity&#xff09;”決定了它捕捉聲音細節的能力。想象麥克風是一只有耳朵的生物。高靈敏度麥克風像長著“超級順風耳”的精靈&#xff0c;能聽見花瓣飄落的聲音、遠處樹葉的沙沙聲&#xff0c;甚至你心跳的微弱震動。適合錄音棚里捕捉歌手的…

lvm詳細筆記

LVM簡介 邏輯卷管理器&#xff0c;是Linux 系統中用于管理磁盤儲存的關鍵技術。 LVM 則打破了磁盤分區一旦確定&#xff0c;其大小調整往往較為復雜&#xff0c;且難以靈活應對業務變化這種限制&#xff0c;它允許用戶將多個物理分區組合卷組。例如&#xff0c;系統中的多個物…

rust-candle學習筆記10-使用Embedding

參考&#xff1a;about-pytorch candle-nn提供embedding()初始化Embedding方法: pub fn embedding(in_size: usize, out_size: usize, vb: crate::VarBuilder) -> Result<Embedding> {let embeddings vb.get_with_hints((in_size, out_size),"weight",cr…

Python小酷庫系列:Munch,用對象的訪問方式訪問dict

Munch&#xff0c;用對象的訪問方式訪問dict 基本使用1、創建一個 Munch 對象2、使用字典初始化3、訪問不存在的字段4、嵌套結構支持5、合并操作6、應用場景說明 進階功能1、嵌套寫入&#xff1a;創建不存在的子對象2、序列化&#xff08;轉回 dict&#xff09;3、深度拷貝結構…

對稱加密以及非對稱加密

對稱加密和非對稱加密是兩種不同的加密方式&#xff0c;它們在加密原理、密鑰管理、安全性和性能等方面存在區別&#xff0c;以下是具體分析&#xff1a; 加密原理 對稱加密&#xff1a;通信雙方使用同一把密鑰進行加密和解密。就像兩個人共用一把鑰匙&#xff0c;用這把鑰匙鎖…

[JAVAEE]HTTP協議(2.0)

響應報文格式 響應報文格式由首行&#xff0c;響應頭&#xff08;header&#xff09;&#xff0c;空行&#xff0c;正文&#xff08;body&#xff09; 組成 響應報文首行包括 1.版本號 如HTTP/1.1 2.狀態碼(如200) 描述了請求的結果 3.狀態碼描述(如OK) 首行——狀態碼…

Spring Boot 之MCP Server開發全介紹

Spring AI 的 MCP(模型上下文協議,Model Context Protocol)服務器啟動器為在 Spring Boot 應用程序中設置 MCP 服務器提供了自動配置功能。它使得 MCP 服務器功能能夠與 Spring Boot 的自動配置系統實現無縫集成。 MCP 服務器啟動器具備以下特性: MCP 服務器組件的自動配置…

YOLOv8 對象檢測任務的標注、訓練和部署過程

YOLOv8 對象檢測任務的標注、訓練和部署過程 在計算機視覺領域&#xff0c;對象檢測是一項基礎且重要的任務&#xff0c;YOLOv8 作為當前先進的實時對象檢測模型&#xff0c;以其高效性和準確性受到廣泛關注。從數據準備到最終模型部署&#xff0c;整個流程包含多個關鍵環節&a…

電池熱管理CFD解決方案,為新能源汽車筑安全防線

在全球能源結構加速轉型的大背景下&#xff0c;新能源汽車產業異軍突起&#xff0c;成為可持續發展的重要驅動力。而作為新能源汽車 “心臟” 的電池系統&#xff0c;其熱管理技術的優劣&#xff0c;直接決定了車輛的安全性、續航里程和使用壽命。電池在充放電過程中會產生大量…

Redis 數據類型:掌握 NoSQL 的基石

Redis (Remote Dictionary Server) 是一種開源的、內存中的數據結構存儲系統&#xff0c;通常用作數據庫、緩存和消息代理。 它的高性能和豐富的數據類型使其成為現代應用程序開發中不可或缺的一部分。 本文將深入探討 Redis 的核心數據類型&#xff0c;幫助你更好地理解和利用…

MLX-Audio:高效音頻合成的新時代利器

MLX-Audio&#xff1a;高效音頻合成的新時代利器 現代社會的快節奏生活中&#xff0c;對語音技術的需求越來越高。無論是個性化語音助手&#xff0c;還是內容創作者所需的高效音頻生成工具&#xff0c;語音技術都發揮著不可或缺的作用。今天&#xff0c;我們將介紹一個創新的開…

Kafka單機版安裝部署

目錄 1.1、概述1.2、系統環境1.3、ZooKeeper的作用1.4、部署流程1.4.1、下載安裝包1.4.2、解壓文件1.4.3、創建日志目錄1.4.4、配置Kafka1.4.5、啟動Kafka服務1.4.6、啟動成功驗證 1.5、創建Topic測試1.6、消息生產與消費測試1.6.1、啟動生產者1.6.2、啟動消費者 1.1、概述 Kaf…

【C++設計模式之Observer觀察者模式】

Observer觀察者模式 模式定義動機(Motivation)結構(Structure)應用場景一&#xff08;氣象站&#xff09;實現步驟1.定義觀察者接口2.定義被觀察者(主題)接口3.實現具體被觀察者對象(氣象站)4.實現具體觀察者(例如&#xff1a;顯示屏)5.main.cpp中使用示例6.輸出結果7. 關鍵點 …

資產月報怎么填?資產月報填報指南

資產月報是企業對固定資產進行定期檢查和管理的重要工具&#xff0c;它能夠幫助管理者了解資產的使用情況、維護狀況和財務狀況&#xff0c;從而為資產的優化配置和決策提供依據。填寫資產月報時&#xff0c;除了填報內容外&#xff0c;還需要注意格式的規范性和數據的準確性。…

UG471 之 SelectIO 邏輯資源

背景 《ug471》介紹了Xilinx 7 系列 SelectIO 的輸入/輸出特性及邏輯資源的相關內容。 第 1 章《SelectIO Resources》介紹了輸出驅動器和輸入接收器的電氣特性&#xff0c;并通過大量實例解析了各類標準接口的實現。 第 2 章《SelectIO Logic Resources》介紹了輸入輸出數據…

C++ 內存泄漏相關

ASAN 參考鏈接 https://blog.csdn.net/wonengguwozai/article/details/129593186https://www.cnblogs.com/greatsql/p/16256926.htmlhttps://zhuanlan.zhihu.com/p/700505587小demo // leak.c #include <stdio.h> #include <stdlib.h> #include <string.h>…