資源簡(jiǎn)介
用C++實(shí)現(xiàn)的遺傳算法求函數(shù)的最大值,可運(yùn)行
代碼片段和文件信息
#include???
#include???
#include???
#include???
#include???
??
typedef?struct?Chrom???????????????????????????//?結(jié)構(gòu)體類(lèi)型,為單個(gè)染色體的結(jié)構(gòu);??
{??
????short?int?bit[6];//一共6bit來(lái)對(duì)染色體進(jìn)行編碼,其中1位為符號(hào)位。取值范圍-64~+64??
????int?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?lMax?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ù)或零,是的話(huà)重新輸入;??
????//不同的隨機(jī)數(shù)可能結(jié)果不同??那是當(dāng)所設(shè)置的迭代次數(shù)過(guò)少時(shí),染色體的基因型過(guò)早地陷入局部最優(yōu)??
????srand(time(0));????
????evpop(popcurrent?);????//?隨機(jī)產(chǎn)生初始種群;??
????//是否需要指定x的取值范圍呢?6bit來(lái)表示數(shù)字,第一位為符號(hào)位,5bit表示數(shù)字大小。所以,取值范圍為-32~+31??
????Max?=?popcurrent[0].fit;//對(duì)Max值進(jìn)行初始化??
??
????for(i?=0;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)取字符,不以回車(chē)為結(jié)束;??
??
}???????????????????????????????????????????????
??
??
??
void?*evpop?(chrom?popcurrent[4])???//?函數(shù):隨
評(píng)論
共有 條評(píng)論