遺傳演算法求函式最優解

2021-08-07 15:15:51 字數 3746 閱讀 1973

前兩天寫了乙個遺傳演算法求最優解的程式,今天拿出來簡單整理一下。

最優解問題:四個變數取何值,該函式取最大值時?(取值範圍-5到5)

顯然,當四個未知數都為零的時候,函式取最大值,但如何利用遺傳演算法來實現,才是要研究的問題。

1.染色體結構定義define.h

struct chromosome

;//基因

#define gene double

//種群

#define pool vector

2.遺傳演算法類定義,以及輔助函式ga.h
//引數:

//種群規模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)

3.遺傳演算法成員函式實現ga.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()

4.主函式main.cpp
#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和他的同事及學生提出的。類似於自然界演化的基本法則,適者生存 是遺傳演算法的核心機制 複製...