上篇初識遺傳演算法講述了遺傳演算法的基本思想,這篇部落格就用遺傳演算法求解方程。
具體的如下:
求解方程 -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、選擇運算元
確定選擇比例,採用輪盤賭演算法。
///view code///模擬輪盤賭選擇演算法
///思路: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
; }
4、交配運算元
隨機產生交配位,交換兩個染色體的部分基因。
///view code///交叉過程個體的變化(字元的替換)
/// ///
參加交叉的兩個個體
///個體1 ///
個體2 ///
static list crossover_replace(dictionary dic, string geti1, string
geti2)
else
}return
tmp_group;
}
5、變異運算元
變換染色體基因的值,即0-1,1-0的變換。
///view code///變異過程個體的變化(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;
}
其中的方法,實現不唯一,時間比較敢,也沒有作一定的優化,只是為了熟悉演算法而寫的。
希望能幫到初學者,也歡迎各位提出修改意見。
遺傳演算法的簡單應用
遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。基本過程可以是 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...