前兩天寫了乙個遺傳演算法求最優解的程式,今天拿出來簡單整理一下。
最優解問題:四個變數取何值,該函式取最大值時?(取值範圍-5到5)
顯然,當四個未知數都為零的時候,函式取最大值,但如何利用遺傳演算法來實現,才是要研究的問題。
1.染色體結構定義define.h
2.遺傳演算法類定義,以及輔助函式ga.hstruct chromosome
;//基因
#define gene double
//種群
#define pool vector
3.遺傳演算法成員函式實現ga.cpp//引數:
//種群規模n
//交配概率pc
//變異概率pm
class ga
;//設定取值範圍
inline
double get_5_5_rand()
//得到0--3之間的隨機數
inline
int get_0_3_rand()
//0--1
inline
double get_0_1_rand()
inline
double get_chro_value(chromosome chro)
4.主函式main.cpp#include "ga.h"
inline
bool sort_value(const chromosome &aim1,const chromosome &aim2);
ga::ga(int n,double pc,double pm)
ga::ga(int n)
ga::~ga(void)
c_chromosome_temp.s_value=0;
c_pool.push_back(c_chromosome_temp);
}cout
<
<
<0]
<
<1]
<
<2]
<
<3]
true;
}//適應值評價
bool ga::eval_pool()
sort(c_pool.begin(),c_pool.end(),sort_value);
return
true;
}inline
bool sort_value(const chromosome &aim1,const chromosome &aim2)
//根據對大自然的適應能力,進行自然選擇,優勝劣汰
bool ga::selection()
}//計算適應值fit
while(true)
}//賭盤選擇
pool tmp_pool;
for(int k=0;kdouble m=0,r=get_0_1_rand();
for(int j=0;jif(r<=m)}}
c_pool.clear();
c_pool=tmp_pool;
return
true;
}//染色體交配
bool ga::crossover()
//進行交叉
//不需要交叉
if(cross_pool.size()==0)
else
if (cross_pool.size()==1)
else
//交叉數量位偶數
if (cross_pool.size()%2==0)
else
}//交叉結束,將新的染色體放入nocrosspool
if(get_chro_value(cross_tmp1)>get_chro_value(cross_1))
no_cross_pool.push_back(cross_tmp1);
else
no_cross_pool.push_back(cross_1);
if(get_chro_value(cross_tmp2)>get_chro_value(cross_2))
no_cross_pool.push_back(cross_tmp2);
else
no_cross_pool.push_back(cross_2);}}
//交叉數量位奇數,放棄交叉第乙個
else
else
}//交叉結束,將新的染色體放入nocrosspool
//如果交叉後代比上一代更好,就把父代替換子代
if(get_chro_value(cross_tmp1)>get_chro_value(cross_1))
no_cross_pool.push_back(cross_tmp1);
else
no_cross_pool.push_back(cross_1);
if(get_chro_value(cross_tmp2)>get_chro_value(cross_2))
no_cross_pool.push_back(cross_tmp2);
else
no_cross_pool.push_back(cross_2);}}
c_pool.clear();
c_pool=no_cross_pool;
return
true;
}}//根據變異率,進行染色體變異
bool ga::mutation()
i++;
if(i>=c_pool.size())
}return
true;
}int ga::run(int maxnum,double d)
if(i>=maxnum)
last_value=current_value;
}eval_pool();
return i;
}double ga::get_best_value()
chromosome ga::get_best_chro()
在程式編寫過程中,遇到了幾個小問題#include "ga.h"
#include "test.h"
#define error 0.00000001
#define maxnum 1000
int main()
#include
//得到0--3之間的隨機數
inline
int get_0_3_rand()
//交叉結束,將新的染色體放入nocrosspool
if(get_chro_value(cross_tmp1)>get_chro_value(cross_1))
no_cross_pool.push_back(cross_tmp1);
else
no_cross_pool.push_back(cross_1);
if(get_chro_value(cross_tmp2)>get_chro_value(cross_2))
no_cross_pool.push_back(cross_tmp2);
else
no_cross_pool.push_back(cross_2);
使用遺傳演算法求最優解
在2008年全國大學生數學建模競賽,學習過matlab遺傳演算法工具箱求最優解,用得也比較熟練,時隔兩年忘得差不多了!現在想用ga工具箱來解決乙個優化問題,不得不重新查資料學習使用!這是乙個根據已知資料擬合乙個函式,使用最小二乘法作為適應度函式,求最小值 適應度函式如下 function f zpp...
簡單遺傳演算法求函式極值
引言 遺傳演算法求函式極值算是遺傳演算法的一種最簡單的應用,這裡就介紹一種簡單的,全文基本翻譯自codeproject的一篇文章,作者為luay al wesi,軟體工程師。例子中的函式為y x2 5 大家可以將其改為其他複雜一些的函式,比如說f x 10sin 5x 7cos 4x 等。本篇文章適...
mysql遺傳演算法 原 遺傳演算法求函式極大值
1.遺傳演算法 genetic algorithms,ga 基於自然選擇和自然遺傳機制的搜尋演算法,它是一種有效的解決最優化問題的方法,進化演算法的一種。最早由美國michigan大學的john holland和他的同事及學生提出的。類似於自然界演化的基本法則,適者生存 是遺傳演算法的核心機制 複製...