?? bsga.cpp
字號(hào):
/*******************************************
* 畢設(shè)遺傳算法程序 *
* programmed by 朱健華 *
*******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
/*******************************************
* the defination of constant *
*******************************************/
#define POPSIZE 200//種群數(shù)量
#define pi 3.14
/*******************************************
* 用戶(hù)數(shù)據(jù)定義 *
*******************************************/
#define CHROMLENGTH 120
int PopSize =200;//種群規(guī)模
int MaxGeneration =50000;//終止進(jìn)化代數(shù)
double Pc =0.60;//交叉概率
double Pm =0.03;//變異概率
/*******************************************
* 數(shù)據(jù)類(lèi)型定義 *
*******************************************/
struct individual //個(gè)體數(shù)據(jù)定義
{
char chrom[CHROMLENGTH+1];//個(gè)體字符串編碼
double f1,f2,a1,a2,k1,k2;
double value;//個(gè)體表現(xiàn)型值
double fitness;//個(gè)體適應(yīng)度值
};
/*******************************************
* 定義全局變量 *
*******************************************/
int generation;//進(jìn)化代數(shù)
int best_index;//最佳個(gè)體索引
int worst_index;//最差個(gè)體索引
struct individual bestindividual;//當(dāng)前代最佳個(gè)體
struct individual worstindividual;//當(dāng)前代最差個(gè)體
struct individual currentbest;//迄今為止的最好個(gè)體
struct individual population[POPSIZE];//種群
FILE *galog;
/*******************************************
* 函數(shù)原型聲明 *
*******************************************/
void GenerateInitialPopulation(void);//產(chǎn)生初始種群
void initreport(void);
void GenerateNextPopulation(void);//產(chǎn)生下一代群體
void EvaluatePopulation(void);//評(píng)價(jià)函數(shù)
double DecodeChromosome1(char *,int,int);//電阻值對(duì)應(yīng)染色體解碼
double DecodeChromosome2(char *,int,int);//電容值對(duì)應(yīng)染色體解碼
void CaculateObjectValue(void);//計(jì)算個(gè)體表現(xiàn)型值
void CaculateFitnessValue(void);//計(jì)算適應(yīng)度
void FindBestAndWorstIndividual(void);//尋找最佳和最差個(gè)體
void PerformEvolution(void);//進(jìn)行評(píng)價(jià)操作
void SelectionOperator(void);//選擇操作
void CrossoverOperator(void);//交叉操作
void MutationOperator(void);//變異操作
void OutputTextReport(void);
void CaculateDeviceValue(char *);
void finalreport(void);
/********************************************
* 主程序 *
********************************************/
void main(void)
{
srand( (unsigned)time( NULL ) );
if ((galog = fopen("galog.txt","w"))==NULL){exit(1);}
generation=0;
GenerateInitialPopulation();
EvaluatePopulation();
while(generation<MaxGeneration)
{
generation++;
GenerateNextPopulation();
EvaluatePopulation();
PerformEvolution();
OutputTextReport();
}
finalreport();
}
/********************************************
* 產(chǎn)生初始群體 *
********************************************/
void GenerateInitialPopulation(void)
{
int i,j;
initreport();
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{population[i].chrom[j]=(rand()%10<5)?'0':'1';}
population[i].chrom[CHROMLENGTH]='\0';
}
}
/********************************************
* 初始參數(shù)輸出 *
********************************************/
void initreport()
{
fprintf(galog," 基本遺傳算法參數(shù)\n");
fprintf(galog," -------------------------------------------------\n");
fprintf(galog," 種群大小(PopSize) = %d\n",PopSize);
fprintf(galog," 染色體長(zhǎng)度(CHROMLENGTH) = %d\n",CHROMLENGTH);
fprintf(galog," 最大進(jìn)化代數(shù)(MaxGeneration) = %d\n",MaxGeneration);
fprintf(galog," 交叉概率(pcross) = %f\n",Pc);
fprintf(galog," 變異概率(pmutation) = %f\n",Pm);
fprintf(galog," -------------------------------------------------\n");
}
/*********************************************
* 產(chǎn)生下一代 *
*********************************************/
void GenerateNextPopulation(void)
{
SelectionOperator();//選擇操作
CrossoverOperator();//交叉操作
MutationOperator();//變異操作
}
/*********************************************
* 依據(jù)一定的規(guī)則評(píng)價(jià)種群 *
*********************************************/
void EvaluatePopulation(void)
{
CaculateObjectValue();//計(jì)算個(gè)體函數(shù)值
CaculateFitnessValue();//計(jì)算適應(yīng)度
FindBestAndWorstIndividual();
}
/*********************************************
*將二進(jìn)制染色體碼解碼成十進(jìn)制數(shù) 電阻值解碼 *
*********************************************/
double DecodeChromosome1(char *string,int point,int length)
{
int i;
double r=0.0;
char *pointer;
for(i=0,pointer=string+point;i<length;i++,pointer++)
{
if(i<7)
{r+=(*pointer-'0')<<(length-1-i);}
else if(i>=7)
{r+=((*pointer-'0')<<(length-1-i))/8.0;}
}
return(r);
}
/*********************************************
*將二進(jìn)制染色體碼解碼成十進(jìn)制數(shù) 電容值解碼 *
*********************************************/
double DecodeChromosome2(char *string,int point,int length)
{
int i;
double c=0.0;
char *pointer;
for(i=0,pointer=string+point;i<length;i++,pointer++)
{c+=(*pointer-'0')<<(length-1-i);}
c=c/(1024.0*40.0);
return(c);
}
/****************************************
* 計(jì)算最終濾波器的各元件參數(shù)值 *
****************************************/
void CaculateDeviceValue(char *sstring)
{
int j=1;
double y[12];
for(j=1;j<=12;j++)
{
if(j<8)
{
y[j-1]=DecodeChromosome1(sstring,10*j,10);
fprintf(galog,"R[%d]:%f\n",j,y[j-1]);
}
else if(j>=8)
{
y[j-1]=DecodeChromosome2(sstring,10*j,10);
fprintf(galog,"C[%d]:%f\n",j-7,y[j-1]);
}
}
}
/*********************************************
* 計(jì)算個(gè)體函數(shù)值 *
*********************************************/
void CaculateObjectValue(void)
{
int i,j;
double x[12];
for(i=0;i<PopSize;i++)
{
for(j=0;j<12;j++)
{
if(j<8)
{
x[j]=DecodeChromosome1(population[i].chrom,10*j,10);
}
else if(j>=8)
{
x[j]=DecodeChromosome2(population[i].chrom,10*j,10);
}
}
population[i].f1=1000/(2*pi*sqrt(x[0]*x[1]*x[8]*x[9]));
population[i].f2=1000/(2*pi*sqrt(x[4]*x[5]*x[10]*x[11]));
population[i].k1=1+x[3]/x[2];
population[i].k2=1+x[7]/x[6];
population[i].a1=(sqrt(x[1]*x[9]/(x[0]*x[8]))+sqrt(x[0]*x[9]/(x[1]*x[8]))-(population[i].k1-1)*sqrt(x[0]*x[8]/(x[1]*x[9])))/2;
population[i].a2=(sqrt(x[5]*x[11]/(x[4]*x[10]))+sqrt(x[4]*x[11]/(x[5]*x[10]))-(population[i].k2-1)*sqrt(x[4]*x[10]/(x[5]*x[11])))/2;
population[i].value=0.05*fabs(population[i].f1-11940.04)+0.05*fabs(population[i].f2-20625.4)+fabs(population[i].k1*population[i].k2-6)+10*fabs(population[i].a1-0.709)+10*fabs(population[i].a2-0.17)+1;
}
}
/***********************************************
* 計(jì)算適應(yīng)度值 *
***********************************************/
void CaculateFitnessValue(void)
{
int i;
for(i=0;i<PopSize;i++)
{
if(population[i].value==0.00)
population[i].fitness=population[i].value;
else
population[i].fitness=1/population[i].value;
}
}
/***********************************************
* 尋找當(dāng)前代最佳個(gè)體 *
***********************************************/
void FindBestAndWorstIndividual(void)
{
int i;
double sum=0.0;
//尋找當(dāng)前代最佳和最差個(gè)體
bestindividual=population[0];
worstindividual=population[0];
for(i=1;i<PopSize;i++)
{
if(population[i].fitness>bestindividual.fitness)
{
bestindividual=population[i];
best_index=i;
}
else if(population[i].fitness<worstindividual.fitness)
{
worstindividual=population[i];
worst_index=i;
}
sum+=population[i].fitness;
//尋找迄今為止最佳個(gè)體
if(generation==0)
{currentbest=bestindividual;}
else
{if(bestindividual.fitness>currentbest.fitness)
{currentbest=bestindividual;}
}
}
}
/***********************************************
* 用最優(yōu)保存策略進(jìn)行評(píng)價(jià)操作 *
***********************************************/
void PerformEvolution(void)
{
if(bestindividual.fitness>currentbest.fitness)
{currentbest=population[best_index];}
else
{population[worst_index]=currentbest;}
}
/***********************************************
* 用比例選擇的方法復(fù)制染色體 *
***********************************************/
void SelectionOperator(void)
{
int i,index;
double p,sum=0.0;
double cfitness[POPSIZE];
struct individual newpopulation[POPSIZE];
//計(jì)算相對(duì)適應(yīng)度
for(i=0;i<PopSize;i++)
{sum+=population[i].fitness;}
for(i=0;i<PopSize;i++)
{cfitness[i]=population[i].fitness/sum;}
//計(jì)算
for(i=1;i<PopSize;i++)
{cfitness[i]=cfitness[i-1]+cfitness[i];}
//選擇操作
for(i=0;i<PopSize;i++)
{
p=rand()%1000/1000.0;
index=0;
while(p>cfitness[index])
{index++;}
newpopulation[i]=population[index];
}
for(i=0;i<PopSize;i++)
{population[i]=newpopulation[i];}
}
/***********************************************
* 用單點(diǎn)交叉方法進(jìn)行交叉操作 *
***********************************************/
void CrossoverOperator(void)
{
int i,j;
int index[POPSIZE];
int point,temp;
double p;
char ch;
//隨機(jī)配對(duì)兩個(gè)個(gè)體
for(i=0;i<PopSize;i++)
{index[i]=i;}
for(i=0;i<PopSize;i++)
{
point=rand()%(PopSize-i);
temp=index[i];
index[i]=index[point+i];
index[point+i]=temp;
}
//單點(diǎn)交叉操作
for(i=0;i<PopSize-1;i+=2)
{
p=rand()%1000/1000.0;
if(p<Pc)
{
point=rand()%(CHROMLENGTH-1)+1;
for(j=point;j<CHROMLENGTH;j++)
{
ch=population[index[i]].chrom[j];
population[index[i]].chrom[j]=population[index[i+1]].chrom[j];
population[index[i+1]].chrom[j]=ch;
}
}
}
}
/***********************************************
* 變異操作 *
***********************************************/
void MutationOperator(void)
{
int i,j;
double p;
//位變異
for(i=0;i<PopSize;i++)
{
for(j=0;j<CHROMLENGTH;j++)
{
p=rand()%1000/1000.0;
if(p<Pm)
{population[i].chrom[j]=(population[i].chrom[j]=='0')?'1':'0';}
}
}
}
/***********************************************
* 輸出結(jié)果 *
***********************************************/
void OutputTextReport(void)
{
/*int i;
fprintf(galog,"--------------------------------算法統(tǒng)計(jì)報(bào)告------------------------------\n");
fprintf(galog,"第%d代",generation);
fprintf(galog,"\n");
fprintf(galog,"當(dāng)前代最佳染色體編碼\n");
for(i=0;i<CHROMLENGTH;i++)
{
fprintf(galog,"%c",currentbest.chrom[i]);
}
fprintf(galog,"\n");*/
}
void finalreport(void)
{
int i;
fprintf(galog,"最佳染色體編碼\n");
for(i=0;i<CHROMLENGTH;i++)
{
fprintf(galog,"%c",currentbest.chrom[i]);
}
fprintf(galog,"\n");
fprintf(galog,"個(gè)體最大適應(yīng)度值:%f\n",currentbest.fitness);
fprintf(galog,"第一節(jié)濾波器的頻率:%f\n",currentbest.f1);
fprintf(galog,"第二節(jié)濾波器的頻率:%f\n",currentbest.f2);
fprintf(galog,"第一節(jié)濾波器的增益:%f\n",currentbest.k1);
fprintf(galog,"第二節(jié)濾波器的增益:%f\n",currentbest.k2);
fprintf(galog,"第一節(jié)濾波器的阻尼系數(shù):%f\n",currentbest.a1);
fprintf(galog,"第二節(jié)濾波器的阻尼系數(shù):%f\n",currentbest.a2);
CaculateDeviceValue(currentbest.chrom);
fprintf(galog,"\n\nSimulation Completed\n");
fprintf(galog,"success!\n");
printf("success!\n");
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -