人工智能实验遗传算法的实现.docx
《人工智能实验遗传算法的实现.docx》由会员分享,可在线阅读,更多相关《人工智能实验遗传算法的实现.docx(10页珍藏版)》请在冰豆网上搜索。
人工智能实验遗传算法的实现
人工智能
实验报告
实验名称__遗传算法的设计与实现_
学 院数计学院
班 级计科21202
学 号1261081068
姓 名许小刚
学 号
1261081068
姓名
许小刚
实验日期
2015513
实验名称
遗传算法的设计与实现
【实验目的】
通过人工智能课程的学习,熟悉遗传算法的简单应用
【实验内容】
用遗传算法求解f(x)=x2的最大值,x∈[0,31],x取整数。
可以看出该函数比较简单,只要是为了体现遗传算法的思想,在问题选择上,选了一个比较容易实现的,把主要精力放在遗传算法的实现,以及核心思想体会上。
【实验原理】遗传算法:
遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。
与传统的优化算法相比,遗传算法具有如下优点:
不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。
目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
遗传操作包括三个算子:
选择、交叉和变异。
选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。
选择算子的作用效果是提高了群体的平均适应值。
由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。
交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。
变异是对个体的某一个或某一些基因值按某一较小概率进行改变。
从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。
交叉和变异相配合,共同完成对搜索空间的全局和局部搜索
【实验环境】
Windows7
Jdk1.7
myeclise
【实验过程与结果】(附主要源码及运行结果截图)
1、源代码:
importjava.awt.*;
importjava.awt.event.*;
importjavax.swing.*;
importjavax.swing.event.*;
importjava.lang.Math.*;
publicclassgapidextendsFrameimplementsRunnable
{
privatestaticfloatgeneX[];
privatestaticfloatgeneY[];
privatestaticfloatgeneXX[];
privatestaticfloatgeneYY[];
privatestaticfloatfit[];
privatestaticfloatfitness[];
privatestaticfloatsump=0;
privatestaticfloatcumulative=0;
privatestaticfloatcumulativeProbability[];
privatestaticintgeneNumber;
privatestaticintgeneration;
privatestaticfloatcrossoverRate;
privatestaticfloatmutationRate;
privatestaticfloatsjdata;
privatestaticintsjintdata;
privatestaticintsjintdata1;
privatestaticintsjintdata2;
privatestaticfloatleft1;
privatestaticfloatright1;
privatestaticfloatleft2;
privatestaticfloatright2;
privatestaticfloatlefttb;
privatestaticfloatmiddtb;
privatestaticfloatrighttb;
privatestaticfloatmin=10000;
privatestaticfloats;
privatestaticfloath;
privatestaticintk=0;
publicvoidrun()
{
repaint();
}
publicvoidpaint(Graphicsg)
{
g.setColor(newColor(0,0,0));
for(inti=0;i{
g.drawString("o",(int)(geneX[i]),(int)(geneY[i]));
g.setColor(newColor(255,0,0));
g.drawString(min+""+geneX[i]+""+geneY[i],50,525);
}
try
{
k=k+1;
ycsf();
if(k>generation-2)
{
System.exit(0);
}
Thread.sleep((int)(1000));
}
catch(InterruptedExceptione)
{
System.out.println(e.toString());
}
repaint();
}
publicstaticvoidycsf()
{
for(inti=0;i{
//计算每个基因的适应度。
s=(float)(-0.5+Math.sin(Math.sqrt(Math.pow(geneX[i],2)+Math.pow(geneY[i],2))));
h=(float)(Math.pow((1+0.001*(Math.pow(geneX[i],2)+Math.pow(geneY[i],2))),2));
fit[i]=(float)(Math.abs(-0.5+(s/h)));
sump=sump+fit[i];
if(min>fit[i])
{
min=fit[i];
}
}
//备份基因库
geneXX=geneX;
geneYY=geneY;
//计算每个基因的选择概率和累积概率。
for(inti=0;i{
fitness[i]=fit[i]/sump;
cumulative=cumulative+fitness[i];
cumulativeProbability[i+1]=cumulative;
}
//基因的选择,采用轮盘赌的方法。
for(inti=0;i{
sjdata=(float)(Math.random());
for(intj=0;j{
if((sjdatacumulativeProbability[j]))
{
geneX[i]=geneXX[j];
geneY[i]=geneYY[j];
}
}
}
//基因的交叉
for(inti=0;i<(int)(geneNumber*crossoverRate);i++)
{
sjintdata1=(int)(geneNumber*Math.random());
sjintdata2=(int)(geneNumber*Math.random());
left1=(float)(Math.floor(geneX[sjintdata1]/10));
right1=geneX[sjintdata1]%10;
left2=(float)(Math.floor(geneX[sjintdata2]/10));
right2=geneX[sjintdata2]%10;
geneX[sjintdata1]=left1*10+right2;
geneX[sjintdata2]=left2*10+right1;
left1=(float)(Math.floor(geneY[sjintdata1]/10));
right1=geneY[sjintdata1]%10;
left2=(float)(Math.floor(geneY[sjintdata2]/10));
right2=geneY[sjintdata2]%10;
geneY[sjintdata1]=left1*10+right2;
geneY[sjintdata2]=left2*10+right1;
}
//基因的变异
for(inti=0;i<(int)(geneNumber*mutationRate);i++)
{
sjintdata=(int)(geneNumber*Math.random());
lefttb=(float)(Math.floor(geneX[sjintdata]/0.01));
middtb=(float)(Math.floor(10*Math.random()));
righttb=(float)((geneX[sjintdata]%0.01)%0.1);
geneX[sjintdata]=(float)(lefttb*0.01+middtb*0.1+righttb);
lefttb=(float)(Math.floor(geneY[sjintdata]/0.01));
middtb=(float)(Math.floor(10*Math.random()));
righttb=(float)((geneY[sjintdata]%0.01)%0.1);
geneY[sjintdata]=(float)(lefttb*0.01+middtb*0.1+righttb);
}
}
publicstaticvoidmain(String[]args)
{
generation=Integer.parseInt(JOptionPane.showInputDialog("请输入世代数1-500)"));
geneNumber=Integer.parseInt(JOptionPane.showInputDialog("请输入基因个数1000-5000)"));
crossoverRate=Float.parseFloat(JOptionPane.showInputDialog("请输入交叉率0-0.2)"));
mutationRate=Float.parseFloat(JOptionPane.showInputDialog("请输入突变率0-0.2)"));
//种群初始化
geneX=newfloat[geneNumber];
geneY=newfloat[geneNumber];
fit=newfloat[geneNumber];
fitness=newfloat[geneNumber];
cumulativeProbability=newfloat[geneNumber+1];
for(inti=0;i{
geneX[i]=(float)(1000*Math.random());
geneY[i]=(float)(600*Math.random());
}
cumulativeProbability[0]=0;
//基因开始演化直到满足所需精度为止。
ycsf();
gapidthreada=newgapid();
threada.setTitle("用遗传算法优化PID参数");
threada.setSize(800,600);
threada.addWindowListener(newgbck());
threada.setVisible(true);
Threadthreadc=newThread(threada);
threadc.start();
}
staticclassgbckextendsWindowAdapter
{
publicvoidwindowClosing(WindowEvente)
{
System.exit(0);
}
}
}
2、运行结果:
输入世代数200,基因个数1000,交叉率0.02,变异率0.02
输入世代数300,基因个数2000,交叉率0.1,变异率0.1
【实验小结】
在充分理解遗传算法基本理论,算法思想,结合实际情况,设计求解的遗传算法问题。
遗传算法程序设计复杂,算法耗费大量的存储空间和运行时间,通过老师的指导,最终运行成功,得出正确的答案。