遗传算法与C++实现
https://blog.csdn.net/b2b160/article/details/4680853/
https://blog.csdn.net/ljp1919/article/details/42425281
1、遺傳算法,核心是達(dá)爾文優(yōu)勝劣汰適者生存的進(jìn)化理論的思想。一個(gè)種群,通過長(zhǎng)時(shí)間的繁衍,種群的基因會(huì)向著更適應(yīng)環(huán)境的趨勢(shì)進(jìn)化,適應(yīng)性強(qiáng)的個(gè)體基因被保留,后代越來越多,適應(yīng)能力低個(gè)體的基因被淘汰,后代越來越少。經(jīng)過幾代的繁衍進(jìn)化,留下來的少數(shù)個(gè)體,就是相對(duì)能力最強(qiáng)的個(gè)體了。
那么在解決一些問題的時(shí)候,我們所學(xué)習(xí)的便是這樣的思想。比如先隨機(jī)創(chuàng)造很多很多的解,然后找一個(gè)靠譜的評(píng)價(jià)體系,去篩選適應(yīng)性高的解,再用這些適應(yīng)性高的解衍生出更好的解,然后再篩選,再衍生。反復(fù)迭代一定次數(shù),可以得到近似最優(yōu)解。
2、首先,我們先看看一個(gè)經(jīng)典組合問題:“背包問題”
“背包問題(Knapsack problem)是一種組合優(yōu)化的NP完全問題。問題可以描述為:給定一組物品,每種物品都有自己的重量和價(jià)格,在限定的總重量?jī)?nèi),我們?nèi)绾芜x擇,才能使得物品的總價(jià)格最高。問題的名稱來源于如何選擇最合適的物品放置于給定背包中。”
這個(gè)問題的衍生簡(jiǎn)化問題“0-1背包問題” 增加了限制條件:每件物品只有一件,可以選擇放或者不放,更適合我們來舉例
這樣的問題如果數(shù)量少,當(dāng)然最好選擇窮舉法
比如一共3件商品,用0表示不取,1表示取,那么就一共有
000 001 010?
011 100 101
110 111
這樣8種方案,然后讓計(jì)算機(jī)去累加和,與重量上限比較,留下來的解里取最大即可。
但如果商品數(shù)有300,3000,甚至3w種呢,計(jì)算量太大窮舉法可能就不適用了,這時(shí)如果遺傳算法使用得當(dāng),就能在較短的時(shí)間內(nèi)幫我們找到近似的最優(yōu)解,我們繼續(xù)往下看:
新的問題是12件商品的0-1背包問題
我們先讓計(jì)算機(jī)隨機(jī)產(chǎn)生1000個(gè)12位的二進(jìn)制數(shù)。把總重量超過背包上限的解篩掉,剩下的兩兩一對(duì)隨機(jī)交換“基因片段”產(chǎn)生下一代
交換前:
0000 1100 1101
0011 0101 0101
交換后:
0000 0101 1101
0011 1100 0101
再篩選,再交配,如此反復(fù)幾代,留下的“基因型“差不多就是最好的了,如此這般與生物進(jìn)化規(guī)律是一樣的。
同時(shí),在生物繁殖過程中,新產(chǎn)生的基因是有一定幾率突變的,這是很多優(yōu)良性狀的重要來源,遺傳算法中可也不能忽略它
比如:
變異前:
000101100101
變異后:
000101110101
產(chǎn)生突變的位置,就是一個(gè)概率問題。在設(shè)計(jì)算法的時(shí)候,會(huì)給每個(gè)基因位設(shè)置一個(gè)突變概率(當(dāng)然是非常了)同樣的在基因交換階段交換哪些基因呢,也是一個(gè)算法設(shè)置問題。
3、總結(jié)一下,遺傳算法應(yīng)該有
一個(gè)基本函數(shù):適度函數(shù)f(x)
三個(gè)基本操作:選擇,交叉,變異
一.適度函數(shù)
適度函數(shù)其實(shí)就是指解的篩選標(biāo)準(zhǔn),比如上文所說的把所有超過上限重量的解篩選掉,但是不是有更好的篩選標(biāo)準(zhǔn)呢?這將直接影響最后結(jié)果的接近程度以及求解所耗費(fèi)的時(shí)間,所以設(shè)置一個(gè)好的適度函數(shù)很重要
二.選擇
在遺傳算法中選擇也是個(gè)概率問題,在解的范圍中適應(yīng)度更高的基因型有更高的概率被選擇到。所以,在選擇一些解來產(chǎn)生下一代時(shí),一種常用的選擇策略是“比例選擇”,也就是個(gè)體被選中的概率與其適應(yīng)度函數(shù)值成正比。假設(shè)群體的個(gè)體總數(shù)是M,那么那么一個(gè)體Xi被選中的概率為f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) )。常用的選擇方法――輪盤賭(Roulette Wheel Selection)選擇法。
三.交叉
在均等概率下基因位點(diǎn)的交叉,衍生出新的基因型。上述例子中是通過交換兩個(gè)基因型的部分”基因”,來構(gòu)造兩個(gè)子代的基因型。
四.變異
在衍生子代的過程中,新產(chǎn)生的解中的“基因型”會(huì)以一定的概率出錯(cuò),稱為變異。變異發(fā)生的概率設(shè)置為Pm,記住該概率是很小的一個(gè)值。因?yàn)樽儺愂切「怕适录?#xff01;
五.基本遺傳算法優(yōu)化
為了防止進(jìn)化過程中產(chǎn)生的最優(yōu)解被變異和交叉所破壞。《遺傳算法原理及應(yīng)用》介紹的最優(yōu)保存策略是:即當(dāng)前種群中適應(yīng)度最高的個(gè)體不參與交叉運(yùn)算和變異運(yùn)算,而是用它來替換掉本代群體中經(jīng)過交叉、變異等遺傳操作后所產(chǎn)生的適應(yīng)度最低的個(gè)體。
遺傳算法的優(yōu)點(diǎn):
1、 與問題領(lǐng)域無關(guān)且快速隨機(jī)的全局搜索能力。傳統(tǒng)優(yōu)化算法是從單個(gè)初始值迭代求最優(yōu)解的;容易誤入局部最優(yōu)解。遺傳算法從串集開始搜索,復(fù)蓋面大,利于全局擇優(yōu)。
2、 搜索從群體出發(fā),具有潛在的并行性,可以進(jìn)行多個(gè)個(gè)體的同時(shí)比較,魯棒性高!
3、 搜索使用評(píng)價(jià)函數(shù)啟發(fā),過程簡(jiǎn)單。
4、使用概率機(jī)制進(jìn)行迭代,具有隨機(jī)性。遺傳算法中的選擇、交叉和變異都是隨機(jī)操作,而不是確定的精確規(guī)則。這說明遺傳算法是采用隨機(jī)方法進(jìn)行最優(yōu)解搜索,選擇體現(xiàn)了向最優(yōu)解迫近,交叉體現(xiàn)了最優(yōu)解的產(chǎn)生,變異體現(xiàn)了全局最優(yōu)解的復(fù)蓋。
5、具有可擴(kuò)展性,容易與其他算法結(jié)合。遺傳算法求解時(shí)使用特定問題的信息極少,僅僅使用適應(yīng)值這一信息進(jìn)行搜索,并不需要問題導(dǎo)數(shù)等與問題直接相關(guān)的信息。遺傳算法只需適應(yīng)值和串編碼等通用信息,故幾乎可處理任何問題,容易形成通用算法程序。
6、具有極強(qiáng)的容錯(cuò)能力。遺傳算法的初始串集本身就帶有大量與最優(yōu)解甚遠(yuǎn)的信息;通過選擇、交叉、變異操作能迅速排除與最優(yōu)解相差極大的串;這是一個(gè)強(qiáng)烈的濾波過程;并且是一個(gè)并行濾波機(jī)制。故而,遺傳算法有很高的容錯(cuò)能力。
遺傳算法具有良好的全局搜索能力,可以快速地將解空間中的全體解搜索出,而不會(huì)陷入局部最優(yōu)解的快速下降陷阱;并且利用它的內(nèi)在并行性,可以方便地進(jìn)行分布式計(jì)算,加快求解速度。
遺傳算法的缺點(diǎn):
1、遺傳算法的編程實(shí)現(xiàn)比較復(fù)雜,首先需要對(duì)問題進(jìn)行編碼,找到最優(yōu)解之后還需要對(duì)問題進(jìn)行解碼
2、三個(gè)算子的實(shí)現(xiàn)也有許多參數(shù),如交叉率和變異率,并且這些參數(shù)的選擇嚴(yán)重影響解的品質(zhì),而目前這些參數(shù)的選擇大部分是依靠經(jīng)驗(yàn)
3、沒有能夠及時(shí)利用網(wǎng)絡(luò)的反饋信息,故算法的搜索速度比較慢,要得要較精確的解需要較多的訓(xùn)練時(shí)間
4、算法對(duì)初始種群的選擇有一定的依賴性(下圖所示),能夠結(jié)合一些啟發(fā)算法進(jìn)行改進(jìn)
5、算法的并行機(jī)制的潛在能力沒有得到充分的利用,這也是當(dāng)前遺傳算法的一個(gè)研究熱點(diǎn)方向。
同時(shí),遺傳算法的局部搜索能力較差,導(dǎo)致單純的遺傳算法比較費(fèi)時(shí),在進(jìn)化后期搜索效率較低。在實(shí)際應(yīng)用中,遺傳算法容易產(chǎn)生過早收斂的問題。采用何種選擇方法既要使優(yōu)良個(gè)體得以保留,又要維持群體的多樣性,一直是遺傳算法中較難解決的問題。
-------------------------我------是------分------割--------線------------------------------------------------------------
下面舉例來說明遺傳算法用以求函數(shù)最大值
函數(shù)為y = -x2+ 5的最大值,-32<=x<=31
一、編碼以及初始種群的產(chǎn)生
編碼采用二進(jìn)制編碼,初始種群采用矩陣的形式,每一行表示一個(gè)染色體,每一個(gè)染色體由若干個(gè)基因位組成。關(guān)于染色體的長(zhǎng)度(即基因位的個(gè)數(shù))可根據(jù)具體情況而定。比如說根據(jù)要求極值的函數(shù)的情況,本文-32<=X<=31,該范圍內(nèi)的整數(shù)有64個(gè),所以可以取染色體長(zhǎng)度為6,(26=64)。綜上所述,取染色體長(zhǎng)度為6,前5個(gè)二進(jìn)制構(gòu)成該染色體的值(十進(jìn)制),第6個(gè)表示該染色體的適應(yīng)度值。若是所取得染色體長(zhǎng)度越長(zhǎng),表示解空間搜索范圍越大,對(duì)應(yīng)的是待搜索的X范圍越大。關(guān)于如何將二進(jìn)制轉(zhuǎn)換為十進(jìn)制,文后的C代碼中函數(shù)x即為轉(zhuǎn)換函數(shù)。
初始種群結(jié)構(gòu)如下圖所示:
該初始種群共有4個(gè)染色體,第1列表示各個(gè)染色體的編號(hào),第2列表示該染色體值的正負(fù)號(hào),0表示正,1表示負(fù)。第3列到第7列為二進(jìn)制編碼,第8列表示各個(gè)染色體的適應(yīng)度值。第2列到第7列的0-1值都是隨機(jī)產(chǎn)生的。
二、適應(yīng)度函數(shù)
一般情況下,染色體(也叫個(gè)體,或一個(gè)解)的適應(yīng)度函數(shù)為目標(biāo)函數(shù)的線性組合。本文直接以目標(biāo)函數(shù)作為適應(yīng)度函數(shù)。即每個(gè)染色體的適應(yīng)度值就是它的目標(biāo)函數(shù)值,f(x)=-x^2+ 5。
三、選擇算子
初始種群產(chǎn)生后,要從種群中選出若干個(gè)體進(jìn)行交叉、變異,那么如何選擇這些個(gè)體呢?選擇方法就叫做選擇算子。一般有輪盤賭選擇法、錦標(biāo)賽選擇法、排序法等。本文采用排序法來選擇,即每次選擇都選出適應(yīng)度最高的兩個(gè)個(gè)體。那么執(zhí)行一次選擇操作后,得到的新種群的一部分為下圖所示:
四、交叉算子
那么接下來就要對(duì)新種群中選出的兩個(gè)個(gè)體進(jìn)行交叉操作,一般的交叉方法有單點(diǎn)交叉、兩點(diǎn)交叉、多點(diǎn)交叉、均勻交叉、融合交叉。方法不同,效果不同。本文采用最簡(jiǎn)單的單點(diǎn)交叉。交叉點(diǎn)隨機(jī)產(chǎn)生。但是交叉操作要在一定的概率下進(jìn)行,這個(gè)概率稱為交叉率,一般設(shè)置為0.5到0.95之間。通過交叉操作,衍生出子代,以補(bǔ)充被淘汰掉的個(gè)體。交叉后產(chǎn)生的新個(gè)體組成的新種群如下:
黑體字表示子代染色體繼承父代個(gè)體的基因。
五、變異
變異就是對(duì)染色體的基因進(jìn)行變異,使其改變?cè)瓉淼慕Y(jié)構(gòu)(適應(yīng)值也就改變),達(dá)到突變進(jìn)化的目的。變異操作也要遵從一定的概率來進(jìn)行,一般設(shè)置為0到0.5之間,即以小概率進(jìn)行基因突變。這符合自然規(guī)律。本文的變異方法直接采取基因位反轉(zhuǎn)變異法,即0變?yōu)?,1變?yōu)?。要進(jìn)行變異的基因位的選取也是隨機(jī)的。
六、終止規(guī)則
遺傳算法是要一代一代更替的,那么什么時(shí)候停止迭代呢?這個(gè)規(guī)則就叫終止規(guī)則。一般常用的終止規(guī)則有:若干代后終止,得到的解達(dá)到一定目標(biāo)后終止,計(jì)算時(shí)間達(dá)到一定限度后終止等方法。本文采用迭代數(shù)來限制。
代碼如下所示:
?
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>typedef struct Chrom // 結(jié)構(gòu)體類型,為單個(gè)染色體的結(jié)構(gòu);
{short int bit[6];//一共6bit來對(duì)染色體進(jìn)行編碼,其中1位為符號(hào)位。取值范圍-64~+64int fit ;//適應(yīng)值double rfit;//相對(duì)的fit值,即所占的百分比double cfit;//積累概率
}chrom;
//定義將會(huì)用到的幾個(gè)函數(shù);
void *evpop (chrom popcurrent[4]);//進(jìn)行種群的初始化
int x (chrom popcurrent);
int y (int x);
void *pickchroms (chrom popcurrent[4]);//選擇操作
void *pickchroms_new (chrom popcurrent[4]); // 基于概率分布
void *crossover (chrom popnext[4]);//交叉操作
void *mutation (chrom popnext[4]);//突變
double r8_uniform_ab ( double a, double b, int &seed );//生成a~b之間均勻分布的數(shù)字
chrom popcurrent [4]; // 初始種群規(guī)模為;
chrom popnext [4]; // 更新后種群規(guī)模仍為;
void main () // 主函數(shù);
{int num ; // 迭代次數(shù);int i ,j, l,Max ,k;Max=0; // 函數(shù)最大值printf("\nWelcome to the Genetic Algorithm!\n"); // printf("The Algorithm is based on the function y = -x^2 + 5 to find the maximum value of the function.\n");enter:printf ("\nPlease enter the no. of iterations\n請(qǐng)輸入您要設(shè)定的迭代數(shù) : ");scanf("%d" ,&num); // 輸入迭代次數(shù),傳送給參數(shù) num;if(num <1) goto enter ; // 判斷輸入的迭代次數(shù)是否為負(fù)或零,是的話重新輸入;//不同的隨機(jī)數(shù)可能結(jié)果不同??那是當(dāng)所設(shè)置的迭代次數(shù)過少時(shí),染色體的基因型過早地陷入局部最優(yōu)srand(time(0)); evpop(popcurrent ); // 隨機(jī)產(chǎn)生初始種群;//是否需要指定x的取值范圍呢?6bit來表示數(shù)字,第一位為符號(hào)位,5bit表示數(shù)字大小。所以,取值范圍為-32~+31Max = popcurrent[0].fit;//對(duì)Max值進(jìn)行初始化for(i =0;i< num;i ++) // 開始迭代;{printf("\ni = %d\n" ,i); // 輸出當(dāng)前迭代次數(shù);for(j =0;j<4; j++){popnext[j ]=popcurrent[ j]; // 更新種群;}pickchroms(popnext ); // 挑選優(yōu)秀個(gè)體;crossover(popnext ); // 交叉得到新個(gè)體;mutation(popnext ); // 變異得到新個(gè)體;for(j =0;j<4; j++) {popcurrent[j ]=popnext[ j]; // 種群更替;}} // 等待迭代終止;
//對(duì)于真正隨機(jī)數(shù)是需要注意取較大的迭代次數(shù)for(l =0;l<3; l++){if(popcurrent [l]. fit > Max ){Max=popcurrent [l]. fit;k=x(popcurrent [l]);//此時(shí)的value即為所求的x值}}printf("\n 當(dāng)x等于 %d時(shí),函數(shù)得到最大值為: %d ",k ,Max);printf("\nPress any key to end ! " );flushall(); // 清除所有緩沖區(qū);getche(); // 從控制臺(tái)取字符,不以回車為結(jié)束;} void *evpop (chrom popcurrent[4]) // 函數(shù):隨機(jī)生成初始種群;
{int i ,j, value1;int random ;double sum=0;for(j =0;j<4; j++) // 從種群中的第1個(gè)染色體到第4個(gè)染色體{for(i =0;i<6; i++) // 從染色體的第1個(gè)基因位到第6個(gè)基因位{random=rand (); // 產(chǎn)生一個(gè)隨機(jī)值random=(random %2); // 隨機(jī)產(chǎn)生0或者1popcurrent[j ].bit[ i]=random ; // 隨機(jī)產(chǎn)生染色體上每一個(gè)基因位的值,或;} value1=x (popcurrent[ j]); // 將二進(jìn)制換算為十進(jìn)制,得到一個(gè)整數(shù)值;popcurrent[j ].fit= y(value1); // 計(jì)算染色體的適應(yīng)度值sum = sum + popcurrent[j ].fit;printf("\n popcurrent[%d]=%d%d%d%d%d%d value=%d fitness = %d",j, popcurrent[j ].bit[5], popcurrent[j ].bit[4], popcurrent[j ].bit[3], popcurrent[j ].bit[2], popcurrent[j ].bit[1], popcurrent[j ].bit[0], value1,popcurrent [j]. fit); // 輸出整條染色體的編碼情況,}//計(jì)算適應(yīng)值得百分比,該參數(shù)是在用輪盤賭選擇法時(shí)需要用到的for (j = 0; j < 4; j++){popcurrent[j].rfit = popcurrent[j].fit/sum;popcurrent[j].cfit = 0;//將其初始化為0}return(0);
} int x (chrom popcurrent) // 函數(shù):將二進(jìn)制換算為十進(jìn)制;
{//此處的染色體長(zhǎng)度為,其中個(gè)表示符號(hào)位int z ;z=(popcurrent .bit[0]*1)+( popcurrent.bit [1]*2)+(popcurrent. bit[2]*4)+(popcurrent .bit[3]*8)+( popcurrent.bit [4]*16);if(popcurrent .bit[5]==1) // 考慮到符號(hào);{z=z *(-1); }return(z );
}
//需要能能夠從外部直接傳輸函數(shù),加強(qiáng)魯棒性
int y (int x)// 函數(shù):求個(gè)體的適應(yīng)度;
{int y ;y=-(x *x)+5; // 目標(biāo)函數(shù):y= - ( x^ 2 ) +5;return(y );
}
//基于輪盤賭選擇方法,進(jìn)行基因型的選擇
void *pickchroms_new (chrom popnext[4])//計(jì)算概率
{int men;int i;int j;double p;double sum=0.0;//find the total fitness of the populationfor (men = 0; men < 4; men++ ){sum = sum + popnext[men].fit;}//calculate the relative fitness of each memberfor (men = 0; men < 4; men++ ){popnext[men].rfit = popnext[men].fit / sum;}//calculate the cumulative fitness,即計(jì)算積累概率popcurrent[0].cfit = popcurrent[0].rfit;for ( men = 1; men < 4; men++){popnext[men].cfit = popnext[men-1].cfit + popnext[men].rfit;}for ( i = 0; i < 4; i++ ){//產(chǎn)生0~1之間的隨機(jī)數(shù)//p = r8_uniform_ab ( 0, 1, seed );//通過函數(shù)生成0~1之間均勻分布的數(shù)字p =rand()%10;//p = p/10;if ( p < popnext[0].cfit ){popcurrent[i] = popnext[0]; }else{for ( j = 0; j < 4; j++ ){ if ( popnext[j].cfit <= p && p < popnext[j+1].cfit ){popcurrent[i] = popcurrent[j+1];}}}}// Overwrite the old population with the new one.//for ( i = 0; i < 4; i++ ){popnext[i] = popcurrent[i]; }return(0);
}
void *pickchroms (chrom popnext[4]) // 函數(shù):選擇個(gè)體;
{int i ,j;chrom temp ; // 中間變量//因此此處設(shè)計(jì)的是個(gè)個(gè)體,所以參數(shù)是for(i =0;i<3; i++) // 根據(jù)個(gè)體適應(yīng)度來排序;(冒泡法){for(j =0;j<3-i; j++){if(popnext [j+1]. fit>popnext [j]. fit){temp=popnext [j+1];popnext[j +1]=popnext[ j];popnext[j ]=temp;} } }for(i =0;i<4; i++){printf("\nSorting:popnext[%d] fitness=%d" ,i, popnext[i ].fit);printf("\n" ); }flushall();/* 清除所有緩沖區(qū) */ return(0);
}
double r8_uniform_ab( double a, double b, int &seed )
{{int i4_huge = 2147483647;int k;double value;if ( seed == 0 ){std::cerr << "\n";std::cerr << "R8_UNIFORM_AB - Fatal error!\n";std::cerr << " Input value of SEED = 0.\n";exit ( 1 );}k = seed / 127773;seed = 16807 * ( seed - k * 127773 ) - k * 2836;if ( seed < 0 ){seed = seed + i4_huge;}value = ( double ) ( seed ) * 4.656612875E-10;value = a + ( b - a ) * value;return value;}
}
void *crossover (chrom popnext[4]) // 函數(shù):交叉操作;
{int random ;int i ;//srand(time(0)); random=rand (); // 隨機(jī)產(chǎn)生交叉點(diǎn);random=((random %5)+1); // 交叉點(diǎn)控制在0到5之間;for(i =0;i< random;i ++) {popnext[2].bit [i]= popnext[0].bit [i]; // child 1 cross overpopnext[3].bit [i]= popnext[1].bit [i]; // child 2 cross over}for(i =random; i<6;i ++) // crossing the bits beyond the cross point index{popnext[2].bit [i]= popnext[1].bit [i]; // child 1 cross overpopnext[3].bit [i]= popnext[0].bit [i]; // chlid 2 cross over} for(i =0;i<4; i++){popnext[i ].fit= y(x (popnext[ i])); // 為新個(gè)體計(jì)算適應(yīng)度值;}for(i =0;i<4; i++){printf("\nCrossOver popnext[%d]=%d%d%d%d%d%d value=%d fitness = %d",i, popnext[i ].bit[5], popnext[i ].bit[4], popnext[i ].bit[3], popnext[i ].bit[2], popnext[i ].bit[1], popnext[i ].bit[0], x(popnext [i]), popnext[i ].fit); // 輸出新個(gè)體;}return(0);
} void *mutation (chrom popnext[4]) // 函數(shù):變異操作;
{int random ;int row ,col, value;//srand(time(0)); random=rand ()%50; // 隨機(jī)產(chǎn)生到之間的數(shù);//變異操作也要遵從一定的概率來進(jìn)行,一般設(shè)置為0到0.5之間//if(random ==25) // random==25的概率只有2%,即變異率為,所以是以小概率進(jìn)行變異!!{col=rand ()%6; // 隨機(jī)產(chǎn)生要變異的基因位號(hào);row=rand ()%4; // 隨機(jī)產(chǎn)生要變異的染色體號(hào);if(popnext [row]. bit[col ]==0) // 1變?yōu)?#xff1b;{popnext[row ].bit[ col]=1 ;}else if (popnext[ row].bit [col]==1) // 0變?yōu)?#xff1b;{popnext[row ].bit[ col]=0;}popnext[row ].fit= y(x (popnext[ row])); // 計(jì)算變異后的適應(yīng)度值;value=x (popnext[ row]);printf("\nMutation occured in popnext[%d] bit[%d]:=%d%d%d%d%d%d value=%d fitness=%d", row,col ,popnext[ row].bit [5],popnext[ row].bit [4],popnext[ row].bit [3],popnext[ row].bit [2],popnext[ row].bit [1],popnext[ row].bit [0],value, popnext[row ].fit);// 輸出變異后的新個(gè)體;} return(0);
}
?
總結(jié)
以上是生活随笔為你收集整理的遗传算法与C++实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: USTC并行计算复习
- 下一篇: PRT(Precomputed Radi