資源簡(jiǎn)介
遺傳算法實(shí)現(xiàn)Rosenbrock函數(shù)的求解過程,對(duì)遺傳算法有一個(gè)比較詳細(xì)和簡(jiǎn)練的代碼編寫,對(duì)于初學(xué)者來(lái)說很容易看懂!
代碼片段和文件信息
#include?
#include?“time.h“
#include?“stdlib.h“
#include?
using?namespace?std;
const?int?M=8T=3;//M種群大小,T終止代數(shù)
const?double?pc=0.6pm=0.01;//pc交叉概率pm變異概率
struct?population??????//定義群體結(jié)構(gòu)
{
int?x[20];
double?x1x2;
double?fit;
double?sumfit;
}p[M];
void?initial(population?*);//初始化函數(shù)
void?evaluefitness(population?*);//計(jì)算適應(yīng)度
void?select(population?*);//選擇復(fù)制函數(shù)
void?crossover(population?*);//交叉函數(shù)
void?mutation(population?*);//變異參數(shù)
void?decoding(population?*);//解碼函數(shù)
void?print(population?*);//顯示函數(shù)
int?main()//遺傳算法主函數(shù)
{
int?gen=0;
initial(&p[0]);//隨機(jī)獲得初始解
cout<<“initialed!“< print(&p[0]);
decoding(&p[0]);//先解碼
cout<<“decoded!“< print(&p[0]);
evaluefitness(&p[0]);//計(jì)算適應(yīng)度值與累計(jì)適值
cout<<“evalued!“< print(&p[0]);
while(gen<=T)
{
cout<<“gen=“< select(&p[0]);//執(zhí)行選擇操作
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<“selected!“< print(&p[0]);
crossover(&p[0]);//執(zhí)行交叉操作
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<“crossovered!“< print(&p[0]);
mutation(&p[0]);//執(zhí)行變異操作
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<“mutated!“< print(&p[0]);
gen++;
}
decoding(&p[0]);
evaluefitness(&p[0]);
cout<<“最后得出的滿意解為:“< for(int?i=0;i cout<<“x1:“< return?0;
}
///////////////初始化函數(shù)//////////////////
int?rand01()//用于隨機(jī)取0或1的函數(shù)
{
int?r;
double?q;
q=rand()/(RAND_MAX+0.0);
if(q<0.5)
r=0;
else
r=1;
return?r;
}
void?initial(population?*t)//群體初始化函數(shù)
{
int?j;
population?*po;
srand(time(0));
for(po=t;po for(j=0;j<20;j++)
(*po).x[j]=rand01();
}
/////////////////////計(jì)算適應(yīng)值函數(shù)////////////////
void?evaluefitness(population?*t)//計(jì)算適應(yīng)值函數(shù)
{
double?fx1x2temp=0.0;
population?*po*po2;
for(po=t;po {
x1=(*po).x1;
x2=(*po).x2;
f=100.0*(x1*x1-x2*x2)*(x1*x1-x2*x2)+(1.0-x1)*(1.0-x1);
(*po).fit=f;
}
for(po=t;po {
for(po2=t;po2<=po;po2++)
temp=temp+(*po2).fit;
(*po).sumfit=temp;
temp=0.0;
}
}
/////////////////選擇復(fù)制函數(shù)/////////////////////////
double?randab(double?a?double?b)//在區(qū)間(ab)內(nèi)產(chǎn)生一個(gè)隨機(jī)數(shù)
{
double?cr;
c=b-a;
r
評(píng)論
共有 條評(píng)論