智能大作业.docx

上传人:b****5 文档编号:30747485 上传时间:2023-08-20 格式:DOCX 页数:20 大小:216.54KB
下载 相关 举报
智能大作业.docx_第1页
第1页 / 共20页
智能大作业.docx_第2页
第2页 / 共20页
智能大作业.docx_第3页
第3页 / 共20页
智能大作业.docx_第4页
第4页 / 共20页
智能大作业.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

智能大作业.docx

《智能大作业.docx》由会员分享,可在线阅读,更多相关《智能大作业.docx(20页珍藏版)》请在冰豆网上搜索。

智能大作业.docx

智能大作业

智能大作业--遗传算法

一、摘要

遗传算法(GeneticAlgorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。

它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。

遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。

它是现代有关智能计算中的关键技术之一。

二、概要设计

1.程序流程图

2.类型定义

intpopsize;//种群大小

intmaxgeneration;//最大世代数

doublepc;//交叉率

doublepm;//变异率

structindividual

{

charchrom[chromlength+1];

doublevalue;

doublefitness;//适应度

};

intgeneration;//世代数

intbest_index;

intworst_index;

structindividualbestindividual;//最佳个体

structindividualworstindividual;//最差个体

structindividualcurrentbest;

structindividualpopulation[POPSIZE];

3.函数声明

voidgenerateinitialpopulation();

voidgeneratenextpopulation();

voidevaluatepopulation();

longdecodechromosome(char*,int,int);

voidcalculateobjectvalue();

voidcalculatefitnessvalue();

voidfindbestandworstindividual();

voidperformevolution();

voidselectoperator();

voidcrossoveroperator();

voidmutationoperator();

voidinput();

voidoutputtextreport();

4.程序的各函数的简单算法说明如下:

(1).voidgenerateinitialpopulation()和voidinput()初始化种群和遗传算法参数。

input()函数输入种群大小,染色体长度,最大世代数,交叉率,变异率等参数。

(2)voidcalculateobjectvalue();计算适应度函数值。

根据给定的变量用适应度函数计算然后返回适度值。

(3)选择函数selectoperator()

在函数selectoperator()中首先用rand()函数产生0~1间的选择算子,当适度累计值不为零时,比较各个体所占总的适应度百分比的累计和与选择算子,直到达到选择算子的值那个个体就被选出,即适应度为fi的个体以fi/∑fk的概率继续存在;

显然,个体适应度愈高,被选中的概率愈大。

但是,适应度小的个体也有可

能被选中,以便增加下一代群体的多样性。

(4)染色体交叉函数crossoveroperator()

这是遗传算法中的最重要的函数之一,它是对个体两个变量所合成的染色体进行交叉,而不是变量染色体的交叉,这要搞清楚。

首先用rand()函数产生随机概率,若小于交叉概率,则进行染色体交叉,同时交叉次数加1。

这时又要用rand()函数随机产生一位交叉位,把染色体的交叉位的后面部分交叉即可;若大于交叉概率,则进行简单的染色体复制即可。

(5)染色体变异函数mutation()

变异是针对染色体字符变异的,而不是对个体而言,即个体变异的概率是一样。

随机产生比较概率,若小于变异概率,则1变为0,0变为1,同时变异次数加1。

(6)longdecodechromosome(char*,int,int)

本函数是染色体解码函数,它将以数组形式存储的二进制数转成十进制数,然后才能用适应度函数计算。

(7)voidfindbestandworstindividual()本函数是求最大适应度个体的,每一代的所有个体都要和初始的最佳比较,如果大于就赋给最佳。

(8)voidoutputtextreport()输出种群统计结果

输出每一代的种群的最大适应度和平均适应度,最后输出全局最大值

三、源代码

#include

#include

#include

#include

#definePOPSIZE500

#definemaximization1

#defineminimization2

#definecmax100

#definecmin0

#definelength110

#definelength210

#definechromlengthlength1+length2//染色体长度

intfunctionmode=maximization;

intpopsize;//种群大小

intmaxgeneration;//最大世代数

doublepc;//交叉率

doublepm;//变异率

structindividual

{

charchrom[chromlength+1];

doublevalue;

doublefitness;//适应度

};

intgeneration;//世代数

intbest_index;

intworst_index;

structindividualbestindividual;//最佳个体

structindividualworstindividual;//最差个体

structindividualcurrentbest;

structindividualpopulation[POPSIZE];

//函数声明

voidgenerateinitialpopulation();

voidgeneratenextpopulation();

voidevaluatepopulation();

longdecodechromosome(char*,int,int);

voidcalculateobjectvalue();

voidcalculatefitnessvalue();

voidfindbestandworstindividual();

voidperformevolution();

voidselectoperator();

voidcrossoveroperator();

voidmutationoperator();

voidinput();

voidoutputtextreport();

voidgenerateinitialpopulation()//种群初始化

{

inti,j;

for(i=0;i

{

for(j=0;j

{

population[i].chrom[j]=(rand()%10<5)?

'0':

'1';

}

population[i].chrom[chromlength]='\0';

}

}

voidgeneratenextpopulation()//生成下一代

{

selectoperator();

crossoveroperator();

mutationoperator();

}

voidevaluatepopulation()//评价个体,求最佳个体

{

calculateobjectvalue();

calculatefitnessvalue();

findbestandworstindividual();

}

longdecodechromosome(char*string,intpoint,intlength)//给染色体解码

{

inti;

longdecimal=0;

char*pointer;

for(i=0,pointer=string+point;i

if(*pointer-'0')

{decimal+=(long)pow(2,i);

}

return(decimal);

}

voidcalculateobjectvalue()//计算函数值

{

inti;

longtemp1,temp2;

doublex1,x2;

for(i=0;i

{

temp1=decodechromosome(population[i].chrom,0,length1);

temp2=decodechromosome(population[i].chrom,length1,length2);

x1=4.096*temp1/1023.0-2.048;

x2=4.096*temp2/1023.0-2.048;

population[i].value=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1);

}

}

voidcalculatefitnessvalue()//计算适应度

{

inti;

doubletemp;

for(i=0;i

{

if(functionmode==maximization)

{if((population[i].value+cmin)>0.0)

{temp=cmin+population[i].value;}

else

{temp=0.0;

}

}

elseif(functionmode==minimization)

{

if(population[i].value

{temp=cmax-population[i].value;}

else{temp=0.0;}

}

population[i].fitness=temp;

}

}

voidfindbestandworstindividual()//求最佳个体和最差个体

{

inti;

doublesum=0.0;

bestindividual=population[0];

worstindividual=population[0];

for(i=1;i

if(population[i].fitness>bestindividual.fitness){

bestindividual=population[i];

best_index=i;

}

elseif(population[i].fitness

{

worstindividual=population[i];

worst_index=i;

}

sum+=population[i].fitness;

}

if(generation==0){

currentbest=bestindividual;

}

else{

if(bestindividual.fitness>=currentbest.fitness){

currentbest=bestindividual;

}

}

}

voidperformevolution()//演示评价结果

{

if(bestindividual.fitness>currentbest.fitness){

currentbest=population[best_index];

}

else{

population[worst_index]=currentbest;

}

}

voidselectoperator()//比例选择算法

{

inti,index;

doublep,sum=0.0;

doublecfitness[POPSIZE];

structindividualnewpopulation[POPSIZE];

for(i=0;i

{sum+=population[i].fitness;}

for(i=0;i

cfitness[i]=population[i].fitness/sum;

}

for(i=1;i

cfitness[i]=cfitness[i-1]+cfitness[i];

}

for(i=0;i

{

p=rand()%1000/1000.0;

index=0;

while(p>cfitness[index])

{

index++;

}

newpopulation[i]=population[index];

}

for(i=0;i

population[i]=newpopulation[i];

}

}

voidcrossoveroperator()//交叉算法

{

inti,j;

intindex[POPSIZE];

intpoint,temp;

doublep;

charch;

for(i=0;i

index[i]=i;

}

for(i=0;i

point=rand()%(popsize-i);

temp=index[i];

index[i]=index[point+i];

index[point+i]=temp;

}

for(i=0;i

p=rand()%1000/1000.0;

if(p

point=rand()%(chromlength-1)+1;

for(j=point;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;

}

}

}

}

voidmutationoperator()//变异操作

{

inti,j;

doublep;

for(i=0;i

for(j=0;j

p=rand()%1000/1000.0;

if(p

population[i].chrom[j]=(population[i].chrom[j]=='0')?

'1':

'0';

}

}

}

}

voidinput()//数据输入

{printf("初始化全局变量:

\n");

printf("种群大小(50-500):

");

scanf("%d",&popsize);

if((popsize%2)!

=0)

{

printf("种群大小已设置为偶数\n");

popsize++;};

printf("最大世代数(100-300):

");

scanf("%d",&maxgeneration);

printf("交叉率(0.2-0.99):

");

scanf("%f",&pc);

printf("变异率(0.001-0.1):

");

scanf("%f",&pm);

}

voidoutputtextreport()//数据输出

{

inti;

doublesum;

doubleaverage;

sum=0.0;

for(i=0;i

{sum+=population[i].value;}

average=sum/popsize;

printf("当前世代=%d\n当前世代平均函数值=%f\n当前世代最高函数值=%f\n",generation,average,population[best_index].value);

}

voidmain()//主函数

{inti;

printf("本程序为求函数y=100*(x1*x1-x2)*(x1*x2-x2)+(1-x1)*(1-x1)的最大值\n其中-2.048<=x1,x2<=2.048\n");

generation=0;

input();

generateinitialpopulation();

evaluatepopulation();

while(generation

{

generation++;

generatenextpopulation();

evaluatepopulation();

performevolution();

outputtextreport();

}

printf("\n");

printf("统计结果:

");

printf("\n");

printf("最大函数值等于:

%f\n",currentbest.fitness);

printf("其染色体编码为:

");

for(i=0;i

{

printf("%c",currentbest.chrom[i]);

}

printf("\n");

}

四、实验结果:

A.y=x1*x1+4*x1-1

B.y=4*x1*x1-2.1*x1*x1*x1*x1+(1/3)*x1*x1*x1*x1*x1*x1+x1*x2+4*x2*x2+4*x2*x2*x2*x2

C.y=100*(x1*x1-x2)*(x1*x1-x2)+(1-x1)*(1-x1)

D.y=20+x1*x1+x2*x2-cos(2*3.1415926*x1)-cos(2*3.1415926*x2)

5.参考文献

《人工智能及其应用》——清华大学出版社蔡自兴徐光佑

《遗传算法》——XX文献

6.心得体会

在实现遗传算法的过程中遇到了种种问题,平常对调试编写算法不太熟练;参考了大量网上的算法勉强得以实现,通过这个大作业加深了我对c语言的使用和对算法本身的理解。

同时感谢同学们的帮助。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1