遺傳演算法的簡單應用 求解方程

2022-01-20 12:11:11 字數 1939 閱讀 2660

上篇初識遺傳演算法講述了遺傳演算法的基本思想,這篇部落格就用遺傳演算法求解方程。

具體的如下:

求解方程 -x^3+7*x+13=0 在[3,4]區間的解,解精確到0.001,交叉概率0.7

變異概率0.01,迭代次數為100,字元編碼長度為10(二進位制編碼)

首先簡單的分析一下:

1、編碼與解碼

題目要求的是採用二進位制的編碼方式來實現,既然已經編碼了,自然就需要解碼,給定的10

位二進位制編碼表示的區間範圍就是0~1023,題目的區間是[3,4]很自然的就能想到10位二進

制編碼中的0表示是就是[3,4]中的3,1023表示的就是[3,4]中的4,所以,每個二進位制對應的

十進位制就是((10位二進位制對應的十進位制數/1023)+3),這個就是解碼後的在區間[3,4]中的具體值。

2、適應度函式

這裡取的適應度函式是方程絕對值的倒數,即f=1/(|-x^3+7*x+13|)

3、選擇運算元

確定選擇比例,採用輪盤賭演算法。

///

///模擬輪盤賭選擇演算法

///思路:1.求適應度的總和;2.計算每個個體適應度所佔的比例(除第乙個之外,其他的都是疊加);

///3.在0~1產生隨機數,這個隨機數所在的區間,就是要選擇的個體

/// ///

選擇出來的優秀個體

static list rws(listlist)

inti, j;

for (i = 0; i < p.count; i++)

else

if (temp < p[j] && temp >= p[j - 1

])

}}

return

select

; }

view code

4、交配運算元

隨機產生交配位,交換兩個染色體的部分基因。

///

///交叉過程個體的變化(字元的替換)

/// ///

參加交叉的兩個個體

///個體1 ///

個體2 ///

static list crossover_replace(dictionary dic, string geti1, string

geti2)

else

}return

tmp_group;

}

view code

5、變異運算元

變換染色體基因的值,即0-1,1-0的變換。

///

///變異過程個體的變化(0->1,1->0)

///思路:1.將個體的編碼轉化成字元;2.為每個字元產生乙個0~1的隨機數,判斷是否要進行變異操作

///3.要變異則將0->1,1->0

/// ///

個體(二進位制編碼)

///變異後的結果

///變異概率

///static

string mutation_replace(string str, string result, double

probability)

else

if (chrarray[i] == '1'

) }}

//將字元拼接成字串

foreach (char ch in

chrarray)

return

result;

}

view code

其中的方法,實現不唯一,時間比較敢,也沒有作一定的優化,只是為了熟悉演算法而寫的。

希望能幫到初學者,也歡迎各位提出修改意見。

遺傳演算法的簡單應用

遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。基本過程可以是 1 隨機產生第一代個體 2 計算第一代個體的適應度 3 迴圈 達到某個條件跳出 1 0根 據適應度 從這一代 中挑選下 一代的父 母1 0根據適應度從這一代中挑選下一代的父母 1...

遺傳演算法簡單例項

遺傳演算法的手工模擬計算示例 為更好地理解遺傳演算法的運算過程,下面用手工計算來簡單地模擬遺傳演算法的各 個主要執行步驟。例 求下述二元函式的最大值 1 個體編碼 遺傳演算法的運算物件是表示個體的符號串,所以必須把變數 x1,x2 編碼為一種符號串。本題中,用無符號二進位制整數來表示。因 x1,x2...

利用標準遺傳演算法求解函式

package wh.algorithm public class sga public sga 初始化一條染色體 用二進位制字串表示 return 一條染色體 private string initpop else return res 初始化一組染色體 return 染色體組 private s...