人工智能实验遗传算法的实现.docx

上传人:b****5 文档编号:14438842 上传时间:2023-06-23 格式:DOCX 页数:10 大小:118.35KB
下载 相关 举报
人工智能实验遗传算法的实现.docx_第1页
第1页 / 共10页
人工智能实验遗传算法的实现.docx_第2页
第2页 / 共10页
人工智能实验遗传算法的实现.docx_第3页
第3页 / 共10页
人工智能实验遗传算法的实现.docx_第4页
第4页 / 共10页
人工智能实验遗传算法的实现.docx_第5页
第5页 / 共10页
人工智能实验遗传算法的实现.docx_第6页
第6页 / 共10页
人工智能实验遗传算法的实现.docx_第7页
第7页 / 共10页
人工智能实验遗传算法的实现.docx_第8页
第8页 / 共10页
人工智能实验遗传算法的实现.docx_第9页
第9页 / 共10页
人工智能实验遗传算法的实现.docx_第10页
第10页 / 共10页
亲,该文档总共10页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

人工智能实验遗传算法的实现.docx

《人工智能实验遗传算法的实现.docx》由会员分享,可在线阅读,更多相关《人工智能实验遗传算法的实现.docx(10页珍藏版)》请在冰点文库上搜索。

人工智能实验遗传算法的实现.docx

人工智能实验遗传算法的实现

 

人工智能

实验报告

 

实验名称__遗传算法的设计与实现_

学  院数计学院

班  级计科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

 

【实验小结】

在充分理解遗传算法基本理论,算法思想,结合实际情况,设计求解的遗传算法问题。

遗传算法程序设计复杂,算法耗费大量的存储空间和运行时间,通过老师的指导,最终运行成功,得出正确的答案。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2