遺傳演算法採用概率化的尋優方法,在大範圍內對解進行優化,不限於區域性。遺傳演算法擅長解決全域性最優化問題。
基本過程可以是:
(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鏈 生成隨機初代 選擇,適應度 ...