遺傳演算法的簡單應用

2021-09-27 03:24:23 字數 4109 閱讀 9501

遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。

基本過程可以是:

(1)隨機產生第一代個體

(2)計算第一代個體的適應度

(3)迴圈(達到某個條件跳出)

1 0根

據適應度

從這一代

中挑選下

一代的父

母1^0根據適應度從這一代中挑選下一代的父母

10根據適應

度從這一

代中挑選

下一代的

父母2 0雜

交產生下

一代2^0雜交產生下一代

20雜交產生

下一代30新

一代個體

發生基因

突變3^0新一代個體發生基因突變

30新一代個

體發生基

因突變40計

算新一代

個體的適

應度4^0計算新一代個體的適應度

40計算新一

代個體的

適應度

下面的這個例子用遺傳演算法產生指定的字串「nino is beautiful」

#include#include#include#include#includeusing namespace std;

const int population_size = 100;

const string genes = " zxcvbnmasdfghjklqwertyuiop"

"zxcvbnmasdfghjklqwertyuiop1234567890";

const string target = "nino is beautiful";

//產生隨機數

int random_num(int start, int end)

//產生隨機基因,在變異中使用

char mutated_genes()

//產生染色體(由基因組成)

string create_gnome()

return gnome;

}//用乙個類來代表乙個個體

class individual

;individual::individual(string _chromosome)

//模仿雜交,產生新個體

individual individual::mate(individual parent2)

return individual(child_chromosome);

}//計算適應度(分數)

int individual::cal_fitness()

return fitness;

}//過載《運算子,用於sort函式

bool operator

int main()

while (!found)

vectornew_generaton;

//保留前十個優秀的個體,讓他們直接進入第二代

int s = (10 * population_size) / 100;

for (int i = 0; i < s; ++i)

new_generaton.push_back(population[i]);

//把第一代的前50%用來雜交(包括剛才的前10)

s = (90 * population_size) / 100;

for (int i = 0; i < s; ++i)

population = new_generaton;

++generation;

cout << "generation: " << generation << "\t";

cout << "string: " << population[0].chromosome << "\t";

cout << "fitness: " << population[0].fitness << "\n";

} cout << "generation: " << generation+1 << "\t";

cout << "string: " << population[0].chromosome << "\t";

cout << "fitness: " << population[0].fitness << "\n";

return 0;

}

應用2(尋找最短路徑):

小曾同學要去某城市旅遊,該城市有5個景點需要參觀,分別為a,b,c,d,e,小曾從酒店出發,最後要回到酒店,每個景點必須要走且只走一遍,景點間的距離(0-酒店,1-a,2-b…)如下表,求最短路徑。

//產生隨機數

int random_num(int start, int end)

//產生隨機基因,在基因突變中使用

char mutated_genes()

//因為輸入可以保證前面的字串肯定沒有重複,所以只要檢查最後乙個字元即可

bool isrepeatstr(string str)

return false;

}//第一代的隨機產生染色體(由基因組成)

string create_gnome()

return gnome;

}//用乙個類來代表乙個個體

class individual

;individual::individual(string _chromosome)

//模仿雜交,產生新個體

individual individual::mate(individual parent2)

return individual(child_chromosome);

}//計算適應度(分數)

int individual::cal_fitness()

} int fitness = 0;

fitness += distance_fromstart[chromosome[0] - 'a'];

for (int i = 1; i < len; ++i)

fitness += distance_fromstart[chromosome[len - 1] - 'a'];

return fitness;

}//過載《運算子,用於sort函式

bool operator

int main()

while (!found)

vectornew_generaton;

//保留前十個優秀的個體,讓他們直接進入第二代

int s = (10 * population_size) / 100;

for (int i = 0; i < s; ++i)

new_generaton.push_back(population[i]);

//把第一代的前50%用來雜交(包括剛才的前10)

s = (90 * population_size) / 100;

for (int i = 0; i < s; ++i)

population = new_generaton;

++generation;

cout << "generation: " << generation << "\t";

cout << "string: " << population[0].chromosome << "\t";

cout << "fitness: " << population[0].fitness << "\n";

} return 0;

}還有多元不定方程求正整數解問題,也可以用遺傳演算法解決。

reference:geeksforgeeks

遺傳演算法簡單例項

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

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

上篇初識遺傳演算法講述了遺傳演算法的基本思想,這篇部落格就用遺傳演算法求解方程。具體的如下 求解方程 x 3 7 x 13 0 在 3,4 區間的解,解精確到0.001,交叉概率0.7 變異概率0.01,迭代次數為100,字元編碼長度為10 二進位制編碼 首先簡單的分析一下 1 編碼與解碼 題目要求...

python遺傳演算法 Python 遺傳演算法實現

關於遺傳演算法 遺傳演算法是仿照自然界中生物進化而產生的一類優化演算法。個人感覺遺傳演算法簡單粗暴,適應性廣。關於遺傳演算法的介紹網上有很多了,這裡按照我自己的理解簡單概括一下。編碼解碼,將待優化的引數編碼為dna序列,最簡單直接的為二進位制編碼 即有兩種鹼基的dna鏈 生成隨機初代 選擇,適應度 ...