课程设计Java.docx

上传人:b****2 文档编号:24576426 上传时间:2023-05-29 格式:DOCX 页数:19 大小:90.24KB
下载 相关 举报
课程设计Java.docx_第1页
第1页 / 共19页
课程设计Java.docx_第2页
第2页 / 共19页
课程设计Java.docx_第3页
第3页 / 共19页
课程设计Java.docx_第4页
第4页 / 共19页
课程设计Java.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

课程设计Java.docx

《课程设计Java.docx》由会员分享,可在线阅读,更多相关《课程设计Java.docx(19页珍藏版)》请在冰豆网上搜索。

课程设计Java.docx

课程设计Java

河南理工大学

计算机科学与技术学院

课程设计报告

2014—2015学年第一学期

 

课程名称Java

设计题目用遗传算法优化函数

姓名丁慧娟

学号321409010102

专业班级计算机本1401

指导教师刘志忠

2015年1月16日

1.绪论2

1.1摘要2

1.2背景2

1.3本文主要内容3

2.遗传算法简介3

2.1历史与发展3

2.2遗传算法的基本原理4

2.3遗传算法特点4

2.4遗传算法中的作用4

2.5遗传算法的应用5

3.遗传算法的主要参数和算子选择5

3.1遗传算法的数学理论5

3.2编码6

4.算例验证9

4.1编码9

4.2计算适应度9

4.3遗传操作10

4.4模拟结果10

5.代码10

5.1代码源程序10

5.1运行结果14

1.绪论

1.1摘要

本文首先介绍遗传算法的历史背景,基本思想,对遗传算法的常见的编码解码方法进行了深入的阐述,并对算子选择方法进行深入分析和对比,在此基础上把遗传算法应用于求解复杂函数的极值计算。

函数优化是遗传算法的经典应用领域,也是对遗传算法进行性能评价的常用算例。

本文将用一个详细的例子来说明用遗传算法应用于求解复杂函数的极值计算问题。

最后在JAVA语言环境下编写程序,对求解函数的最大值进行了仿真,并对调试的结果进行了分析,得出了部分结论。

1.2背景

遗传算法采纳自然进化模型。

通过保持一个潜在解的群体执行了多方向的搜索并支持这些方向上的信息构成和交换。

群体经过一个模拟进化的过程:

在每一代,相对“好”的解产生,相对“差”的解死亡。

为区别不同解,我们使用了一个目标(评价)函数,它起着一个环境的作用。

选择是用来确定管理费用或交叉个体,以及被选个体将产生多少个代个体。

杂交组合了两个亲代染色体的特征,并通过交换父代相应的片断形成了两个相似的后代。

杂交算子的意图是在不同潜在解之间进行信息交换。

1.2.1遗传与变异

1、遗传

世间的生物从其亲代继承特性或性状,这种生命现象叫遗传,研究这种生命现象的科学叫做遗传学。

遗传信息是由基因组成的,生物的各种性状由其相应基因来控制,基因是遗传的基本单位。

细胞分裂具有自我复制的能力,在细胞分裂的过程中,其遗传基因也同时被复制到下一代,从而其性状也被下一代所继承。

2、变异

细胞在分裂时,遗传物质DNA通过复制而转移到新产生的细胞中,新细胞就继承了旧细胞的基因,在进行细胞复制时,虽然概率很小,但也有可能产生某些复制差错,从而使DNA发生某种变异产生出新的染色体,从而表现出新的性状。

1.2.2进化

生物在其延续生存的过程中,逐渐适应于其生存环境,使得其品质不断得到改良,这种现象叫做进化。

新的基因依据其与环境的适应程度决定其增殖能力,有利于生存环境的基因逐渐增加,而不利于生存环境的基因逐渐减少,通过这种自然的选择,物种渐渐的向适应于生存环境的方向进化,从而产生优良的物种。

1.3本文主要内容

本文主要讨论遗传算法在实际数值函数优化问题中的应用,即对实际问题建模后求函数最大值的问题。

遗传算法通过对群体所施加的迭代进化过程,不断的将当前群体中具有较高适应度的个体遗传到下一代群体中,并且不断的淘汰掉适应度较低的个体,从而最终寻求出适应度最大的个体。

这个适应度最大的个体经解码处理之后所对应的个体表现型即为实际问题最优解或是最近似最优解。

2.遗传算法简介

2.1历史与发展

二十世纪六十年代,I.Rechenberg在他的《演化战略》中第一次引入了进化算法的思想(起初称之为Evolutionsstragegie)。

他的这一思想逐渐被其他一些研究者发展。

遗传算法(GeneticAlgorithms)是JohnHolland发明的,后来他和他的学生及他的同事又不断发展了它。

终于,在1975年JohnHolland出版了专著《自然系统和人工系统中的自适应》(AdaptionInNaturalandArtificialSystems)。

1992年,JohnKoza曾经使用遗传算法编出新的程序去做一些具体的工作。

他称他的这种方法为“进化规划”(GeneticProgramming,简称GP)。

其中使用了LISP规划方法,这是因为这种语言中的程序被表示为“分析树”(ParseTree),而这种遗传算法就是以这些分析树为对象的。

1930~1947年,达尔文进化论与遗传学走向融合,Th.Dobzhansky1937年发表的《遗传学与物种起源》是融合进化论与遗传学的代表作。

(GeneticAlgorithm,GA)是进化计算的一个分支,是一种模拟自然界生物进化过程的随机搜索算法。

GA思想源于自然界“自然选择”和“优胜劣汰”的进化规律,通过模拟生物进化中的自然选择和交配变异寻找问题的全局最优解。

它最早由美国密歇根大学教授JohnH.Holland提出,现在已经广泛应用于各种工程领域的优化问题之中。

2.2遗传算法的基本原理

遗传算法GA把问题的解表示成“染色体”,在算法中也即是以二进制编码的串。

并且,在执行遗传算法之前,给出一群“染色体”,也即是假设解。

然后,把这些假设解置于问题的“环境”中,并按适者生存的原则,从中选择出较适应环境的“染色体”进行复制,再通过交叉,变异过程产生更适应环境的新一代“染色体”群。

这样,一代一代地进化,最后就会收敛到最适应环境的一个“染色体”上,它就是问题的最优解。

这里所指的某种结束准则一般是指个体的适应度达到给定的阀值;或者个体的适应度的变化率为零。

进化过程的三种运算

选择:

根据适应度,按照一定的规则或方法,从第t代群体p(t)中选择优良的个体遗传到下一代群体p(t+1)中。

交叉:

将群体p(t)内各个个体随机搭配成对,对每个个体中交换一部分染色体。

变异:

对群体p(t)中的每个个体改变某个或一些值是其他个体的值。

2.3遗传算法特点

(1)遗传算法的操作对象是一组可行解,而非单个可行解;搜索轨道有多条,而非单条,因此具有良好的并行性。

(2)遗传算法只需利用目标函数取值信息,而无须梯度等高价信息,因而实用用于大规模高度非线形的不连续多峰值函数的优化以及无解析表达式的目标函数的优化,具有很强的通用性。

(3)遗传算法的择优机制是一种“软“策略,加上其良好的并行性使其具有良好的全局优化性能和稳健性鲁棒性。

(4)遗传算法的可行解集是经过编码的,目标函数可解释为编码化个体的适应值因而具有良好的可操作性与简单性。

2.4遗传算法中的作用

算法停止,最优值被留住解,解的编码(字符串,向量等),解中每一分量特征(编码单元)适应函数值。

搜索空间中选定的一组有效解,根据适应函数值选定的一组解,交换部分基因产生一组新解的过程,编码的某一分量发生变化。

2.5遗传算法的应用

遗传算法已经在很多复杂问题(比如说NP-难题)、机器学习和简单的进化规划中得到了使用。

遗传算法在一些艺术领域也取得了很大成就,比如说进化图片和进化音乐。

遗传算法的优势在于他的并行性。

遗传算法在搜索空间中非常独立地移动(按照基因型而不是表现型),所以它几乎不可能像其它算法那样“粘”在局部极值点。

遗传算法更容易实现。

一旦你有了一个遗传算法的程序,如果你想解决一个新的问题,你只需要针对新的问题重新进行基因编码就行。

如果编码方法也相同,那你只需要改变一下适应度函数就可以了。

当然,选择编码方法和适应度函数是一件非常难的问题。

遗传算法的缺点是它的计算时间太长。

它们可能比其他任何算法需要的时间都长。

当然,对于今天的高速计算机来说,这已经不是个大问题了。

为了让读者更好地了解遗传算法所解决的问题,这里有一个关于遗传算法应用的小列表:

(1)非线性动态系统——预测,数据分析;

(2)神经网络的结构和权重设计;

(3)自动控制导弹的轨道设计;

(4)进化LISP规划(遗传规划);

(5)战略计划;

(6)蛋白质分子的形状的寻找;

(7)旅行商问题和时间序列排序问题;

3.遗传算法的主要参数和算子选择

3.1遗传算法的数学理论

3.1.1模式定理

遗传算法中,在选择,交叉和变异算子的作用下,具有低阶,短的定义长度,并且平均适应度高于群体平均适应度的模式将按指数级增加。

其中:

(1)模式表示一些相似的模块,它描述了在某些位置上具有相似结构特征的个体编码串的一个子集。

(2)在模式H中具有确定基因值的位置数目叫做该模式的模式阶。

(3)模式H中第一个确定基因值的位置和最后一个确定基因值的位置之间的距离称为该模式的模式定义长度。

模式定理阐述了遗传算法的理论基础,它说明了模式的增加规律,同时也给遗传算法的应用提供了指导作用。

3.1.2积木块假设

模式定理说明了具有某种结构特征的模式在遗传进化过程中其样本数将按指数级增加,这种模式具有低阶,短的定义长度,且平均适应度高于群体平均适应度的模式。

这种模式被称为积木块。

模式定理说明了积木块的样本数呈指数级增长,也说明了用遗传算法寻求最优化样本的可能性,但它并未指明遗传算法一定能够寻求到最优样本而积木块假设却说明了遗传算法的这种能力。

定义:

个体的基因块通过选择,交叉,变异等遗传算子的作用,能够相互连接在一起,形成适应度更高的个体编码串。

作用:

积木块假设说明了用遗传算法求解各类问题的基本思想,即通过基因块之间的相互拼接能够产生出问题更好的解。

基于模式定理和积木块假设,就使得我们能够在很多应用问题中广泛的使用遗传算法的思想。

3.2编码

定义:

遗传算法中如何描述问题的可行解,即把一个问题的可行解从其解空间转换到遗传算法所能处理的搜索空间的转换方法就称为编码

作用:

编码是应用遗传算法时要解决的首要问题,也是设计遗传算法时的一个关键步骤。

编码方法除了决定了个体的染色体排列形式之外还决定个体从搜索空间的基因型变换到解空间的表现性时的解码方法,编码方法也影响到交叉算子和变异算子的遗传算法的运算方法。

由此看见,编码方法在很大程度上决定了如何进行群体的遗传化运算及遗传进化运算效率。

3.2.1编码方法

1、二进制编码方法

定义:

二进制编码方法是遗传算法中最常见的一种编码方法,它使用的编码符号集是由二进制符号0和1所组成的二值符号集{0,1},它所构成的基因型是一个二进制符号串。

在使用二进制编码时,每一个基因就是一个由0或者1组成的字符串。

表3-1二进制编码的基因

使用二进制编码时,即使等位基因的数量不大,我们也可以得到很多种可能的基因。

另一方面,这种方法对于很多问题来都很不自然,所以有时候在交叉和变异结束后还要做一些调整。

2.算法机理

优化问题的解被视为个体,它表示为一个参数列表,叫做染色体或者基因串。

染色体一般被表达为简单的字符串或数字串。

一开始,算法随机生成一定数量的个体,有时操作者也可以对这个随机产生过程进行干预,播下已经部分优化的种子。

在每一代中,每一个个体都被评价,并通过适应度函数计算并返回一个适应度数值。

下一步是产生下一代个体并组成群落。

这个过程是通过选择和繁殖完成的,其中繁殖包括杂交和突变。

选择是根据新个体的适应度数值进行的,适应度越高,选择的机会越多,而适应度低的,被选择的机会就低。

通过这样的过程,初始的数据可以达到一个优化的群体。

之后,被选择的个体进入杂交过程。

一般的遗传算法都有一个杂交率的参数,范围一般是0.6~1,这个杂交率反映两个被选中的个体进行杂交的概率。

例如,杂交率为0.8,则80%的“夫妻”会生育后代。

每两个个体通过杂交产生两个新个体,代替原来的“老”个体,而不杂交的个体则保持不变。

杂交父母的染色体相互交错,从而产生两个新的染色体,第一个个体前半段是父亲的染色体,后半段是母亲的,第二个个体则正好相反。

不过这里的半段不是真正的一半,这个位置叫做杂交点,也是随机产生的,可以是染色体的任意位置。

再下一步是变异,通过变异产生新的“子”个体。

一般遗传算法都有一个固定的变异常数,通常是0.01或者更小,这代表变异发生的概率。

根据这个概率,新个体的染色体随机的变异,通常就是改变染色体的一个字节(0变到1,或者1变到0)。

经过这一系列的过程(选择、杂交和变异),产生的新一代个体不同于初始的一代,并一代一代向增加整体适应度的方向发展,因为最好的个体总是更多的被选择去产生下一代,而适应度低的个体逐渐被淘汰掉。

这样的过程不断的重复:

每个个体被评价,计算出适应度,两个个体杂交,然后变异,产生第三代。

周而复始,直到终止条件满足为止。

终止条件有以下几种:

进化次数限制;

计算耗费的资源限制(例如计算时间、计算占用的内存等);

一个个体已经满足最小值的条件,即最小值已经找到;

适应度已经达到饱和,继续进化不会造成适应度更好的个体;

人为干预;

以及以上两种或更多种的组合。

3.个体适应度评价

标准遗传算法按与个体适应度成正比的概率来决定当前群体中每个个体遗传到下一代群体中的机会多少。

为正确计算这个概率,这里要求所有个体的适应度必须为正数或零。

4.遗传算子

标准遗传算法使用下述三种遗传算子:

选择运算使用比例选择算子,交叉运算使用单点交叉算子,变异运算使用基本位变异算子或均匀变异算子。

5.运行参数

标准遗传算法有下述4个运行参数需要提前设定:

群体大小M,即群体中所含个体数目,一般取为20~100;

遗传运算的终止进化代数T,一般取为1~500;

交叉概率Pc,一般取为0.1~0.99;

变异概率Pm,一般取为0.00~0.1。

4.算例验证

应用遗传算法(GeneticAlgorithm)求解Rastrigin函数优化问题;

4.1编码

表现型:

x

基因型:

二进制编码(串长取决于求解精度)

串长与精度之间的关系:

若要求求解精度到3位小数,区间长度为10-(-10)=20,即需将区间分为20/0.001=20×

等份

16384=

<20000<

=32768

所以编码的二进制串长应为14位

产生初始种群

产生的方式:

随机

产生的结果:

长度为14的二进制串

产生的数量:

种群的大小(规模),如20,40,…

11110100111000

11001100111010

10101000111100

10111100100111

00011001010011

00000110100100

……

4.2计算适应度

不同的问题有不同的适应度计算方法

本例:

直接用目标函数作为适应度函数

①将某个体转化为[-10,10]区间的实数:

s=<00001101010001>→x=0.848

②计算x的函数值(适应度):

f(x)=

-10cos(2πx)+10=19.719

4.3遗传操作

选择:

轮盘赌选择法;

交叉:

单点交叉;

变异:

小概率变异

4.4模拟结果

设置的参数:

种群大小34;交叉概率0.1;变异概率0.00;最大代数45。

得到的最佳个体。

5.代码

5.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);

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

当前位置:首页 > 医药卫生 > 基础医学

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

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