人工智能遗传算法实验报告.docx
《人工智能遗传算法实验报告.docx》由会员分享,可在线阅读,更多相关《人工智能遗传算法实验报告.docx(9页珍藏版)》请在冰点文库上搜索。
人工智能遗传算法实验报告
人工智能-遗传算法实验报告
Lt
D
人工智能实验报告
学号:
姓名:
实验名称:
遗传算法
实验日期:
2021.1.5
【实验名称】遗传算法
【实验目的】
掌握遗传算法的根本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】
遗传算法〔GeneticAlgorithm〕是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群那么由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。
遗传算法程度流程图为:
【实验内容】
题目:
f(x)=x*sin(x)+1,x∈[0,2π],求f(x)的最大值和最小值。
数据结构:
structpoptype
{
doublegene[length];//染色体
doublerealnumber;//对应的实数x
doublefitness;//适应度
doublerfitness;//相对适应度
doublecfitness;//累计适应度
};
structpoptypepopulation[popsize+1];//最后一位存放max/min
structpoptypenewpopulation[popsize+1];//
染色体编码:
,变量长度为2π,取小数点后6位,由于
因此,染色体由23位字节的二进制矢量表示,那么X与二进制串〔〕2之间的映射如下:
;
适应度函数:
由于要求f(x)的最值,所以适应度函数即可为f(x)。
但为了确保在轮赌法选择过中,每个个体都有被选中的可能性,因此需要将所有适应度调整为大于0的值。
因此,设计求最大值的适应度函数如下:
将最小问题转化为求-f(x)的最大值,同理,设计最小值的适应度函数如下:
种群大小:
本实验默认为50,再进行种群初始化。
实验参数:
主要有迭代数,交叉概率,变异概率这三个参数。
一般交叉概率在0.6-0.9范围内,变异概率在0.01-0.1范围内。
可以通过手动输入进行调试。
主要代码如下:
voidinitialize()//种群初始化
{
srand(time(NULL));
inti,j;
for(i=0;ifor(j=0;j<23;j++)
population[i].gene[j]=rand()%2;
voidtransform()//染色体转化为实数x
{
inti,j;
for(i=0;i<=popsize+1;i++)
{
population[i].realnumber=0;
for(j=0;j<23;j++)
population[i].realnumber+=population[i].gene[j]*pow(2,j);
population[i].realnumber=population[i].realnumber*2*pi/(pow(2,23)-1);
}
}
voidcal_fitness()//计算适应度
{
inti;
for(i=0;ipopulation[i].fitness=population[i].realnumber*sin(population[i].realnumber)+6;
}
voidselect()//选择操作
{
intmem,i,j,k;
doublesum=0;
doublep;
for(mem=0;memsum+=population[mem].fitness;
for(mem=0;mempopulation[mem].rfitness=population[mem].fitness/sum;
population[0].cfitness=population[0].rfitness;
for(mem=1;mempopulation[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;
for(i=0;i{//轮赌法选择机制
p=rand()%1000/1000.0;
if(pnewpopulation[i]=population[0];
else{
for(j=0;jif(p>=population[j].cfitness&&pnewpopulation[i]=population[j+1];
}
}
for(i=0;ipopulation[i]=newpopulation[i];
}
voidcross()//交叉操作
{
inti,mem,one;
intfirst=0;
doublex;
for(mem=0;mem{
x=rand()%1000/1000.0;
if(x{
++first;
if(first%2==0)Xover(one,mem);//个体间染色体进行交叉函数
elseone=mem;
}
}
}
voidmutate()//变异操作
{
inti,j,t;
doublex;
for(i=0;ifor(j=0;j{
x=rand()%1000/1000.0;
if(x{
if(population[i].gene[j])population[i].gene[j]=0;
elsepopulation[i].gene[j]=1;
}
}
}
voidcal_max()//计算最大值
{
inti;
doublemax,sum=0;
intmax_m;
max=population[0].fitness;
for(i=0;i{
if(population[i].fitness>population[i+1].fitness)
if(population[i].fitness>=max)
{
max=population[i].fitness;
max_m=i;
}
elseif(population[i+1].fitness>=max)
{
max=population[i+1].fitness;
max_m=i+1;
}
}
if(max>population[popsize].fitness)
{
iteration=0;
for(i=0;ipopulation[popsize].gene[i]=population[max_m].gene[i];
population[popsize].fitness=population[max_m].fitness;
}
for(i=0;isum=population[popsize].gene[i]-population[max_m].gene[i];
if(sum==0)iteration++;
transform();
printf("%f,%f,%f,%f\n",population[popsize].fitness,population[popsize+1].fitness,population[popsize].realnumber,population[popsize+1].realnumber);
}
【实验结果】