遺傳演算法解決函式優化問題

2021-06-10 16:10:16 字數 2985 閱讀 6813

一、實驗目的

1.掌握遺傳演算法的基本原理和步驟。

2. 複習vb、vc的基本概念、基本語法和程式設計方法,並熟練使用vb或vc編寫遺傳演算法程式。

二、實驗內容

1. 上機編寫程式,解決以下函式優化問題:

2. 除錯程式。

3. 根據實驗結果,撰寫實驗報告。

三、實驗原理

遺傳演算法是一類隨機優化演算法,但它不是簡單的隨機比較搜尋,而是通過對染色體的評價和對染色體中基因的作用,有效地利用已有資訊來指導搜尋有希望改善優化質量的狀態。

標準遺傳演算法流程圖如下圖所示,主要步驟可描述如下:

① 隨機產生一組初始個體構成初始種群。

② 計算每乙個體的適配值(fitness value

,也稱為適應度)。適應度值是對染色體(個體

)進行評價的一種指標,是

ga進行優化所用的主要資訊,它與個體的目標值存在一種對應關係。

③ 判斷演算法收斂準則是否滿足,若滿足,則輸出搜尋結果;否則執行以下步驟。

④ 根據適應度值大小以一定方式執行複製操作(也稱為選擇操作)。

⑤ 按交叉概率pc執行交叉操作。

⑥ 按變異概率pm執行變異操作。

⑦ 返回步驟②。

圖1.1 標準遺傳演算法流程圖

**實現::::::

#include #include #include #include#define byte unsigned char

#define step 200 //步長

#define max 50

#define n 10 //隨機數個數

#define pt 0.25 //交叉的概率,個數=pt*n 舍,小於n 0~(n2+1)隨機數,之後部分開始交叉

#define pm 0.01 //變異的概率,個數=pm*n*n2 入,小於n 0~(n*(n2+1))隨機數/(n2+1)=個體,0~(n*(n2+1))隨機數%(n2+1)=該個體基因位置

#define n2 15//2的15次方,共16位

#define next_t (int)(pt*n)//交叉個數

#define next_m (int)(pm*n+1)//變異個數 向後約等於

#define e 0.001//次數限制閾值

/*int n=10; //隨機數個數

float pt=0.25; //交叉的概率,個數=pt*n 舍,小於n 0~(n2+1)隨機數,之後部分開始交叉

float pm=0.01; //變異的概率,個數=pm*n*n2 入,小於n 0~(n*(n2+1))隨機數/(n2+1)=個體,0~(n*(n2+1))隨機數%(n2+1)=該個體基因位置

*/byte bitary[n][n2+1],bitary0[n][n2+1];//二進位制

int src1[n];

float showtype(int a);//表現型

void binnum(int a);//二進位制位數n2

float fit_func(float a);//適應度

void dectobin (int src,int num);//十進位制轉二進位制

void bintodec (void);//十進位制轉二進位制

int selectt(float a,float b[10]);//選擇交叉個體

int selectm(float a,float b[10]);//選擇變異個體

void main(void)

printf("\n第%d代適配總值\n%f\n",count,sumfit);//第0代

count++;

min=sumfit;

printf("\n遺傳到下一代的概率\n");

for(i=0;isumfit)

while(fabs(min-min1)>e&&count0)//兩個不同個體交叉

while(new_t[i]==new_t[i-1])

new_t[i]=rand()%n;

printf("%d, ",new_t[i]);

} srand( (unsigned)time(null) );//隨機產生交叉位置

k=rand()%n2;//0~14的十進位制數

printf("\n隨機產生交叉位置 %d\n",k);

printf("\n原編碼\n");

for(j=n2;j>=0;j--)

printf("%c",bitary[new_t[0]][j]);

printf("\n");

for(j=n2;j>=0;j--)

printf("%c",bitary[new_t[1]][j]);

printf("\n位置%d後交叉編碼\n",k);

char temp;

for(i=k+1;i=0;j--)

printf("%c",bitary[new_t[0]][j]);

printf("\n");

for(j=n2;j>=0;j--)

printf("%c",bitary[new_t[1]][j]);

//從新一代選擇個體變異

printf("\n隨機產生變異個體號 ");

srand( (unsigned)time(null) );

for(i=0;i<1;i++) //簡單起見變異數設為1個

printf("\n");

count++;

//新的bitary即產生第二代

printf("\n新產生的第%d代\n",count);

for(i=0;i=0;j--)

printf("%c",bitary[i][j]);

printf("\n");

} bintodec ();//二進位制轉十進位制

for(i=0;i

遺傳演算法 簡單函式優化

f x 11sin 6x 7cons 5x 0 x 2 pi 注意程式中num2gray函式和gray2num函式可以參照我上面的另外兩個博文中有 初始化引數 l 16 編碼為16位二進位制數 n 32 初始種群規模 m 48 m個中間體,運用運算元選擇出m 2對母體,進行交叉 對m個中間體進行變異...

遺傳演算法之函式優化

一 遺傳演算法簡介 遺傳演算法是模擬生物在自然環境下的遺傳和進化過程的一種自適應的全域性優化搜尋演算法,通過借助遺傳學的原理,經過自然選擇 遺傳 變異等作用機制進而篩選出具有適應性更高的個體 適者生存 遺傳演算法從20世紀七八十年代的誕生到現在主要集中的適用範圍為 np問題 指存在多項式演算法能夠解...

tsp問題 遺傳演算法解決

tsp問題最簡單的求解方法是列舉法。它的解是多維的 多區域性極值的 趨於無窮大的複雜解的空間,搜尋空間是n個點的所有排列的集合,大小為 n 1 可以形象地把解空間看成是乙個無窮大的丘陵地帶,各山峰或山谷的高度即是問題的極值。求解tsp,則是在此不能窮盡的丘陵地帶中攀登以達到山頂或谷底的過程。這一篇將...