遗传算法实验报告17643
遗传算法实验报告

遗传算法实验报告专业:自动化:张俊峰学号:13351067 摘要:遗传算法,是基于达尔文进化理论发展起来的一种应用广泛、高效的随机搜索与优化方法。
本实验利用遗传算法来实现求函数最大值的优化问题,其中的步骤包括初始化群体、个体评价、选择运算、交叉运算、变异运算、终止条件判断。
该算法具有覆盖面大、减少进入局部最优解的风险、自主性等特点。
此外,遗传算法不是采用确定性原则而是采用概率的变迁规则来指导搜索方向,具有动态自适应的优点。
关键词:串集最优化评估迭代变异一:实验目的熟悉和掌握遗传算法的运行机制和求解的基本方法。
遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻找所求问题的答案。
其求解过程是个最优化的过程。
一般遗传算法的主要步骤如下:(1)随机产生一个确定长度的特征字符串组成的初始种群。
〔2〕对该字符春种群迭代地执行下面的步骤a和步骤b,直到满足停止准则为止:a计算种群中每个个体字符串的适应值;b应用复制、交叉和变异等遗传算子产生下一代种群。
〔3〕把在后代中表现的最好的个体字符串指定为遗传算法的执行结果,即为问题的一个解。
二:实验要求已知函数y=f〔x1,x2,x3,x4〕=1/(x12+x22+x32+x42+1),其中-5≤x1,x2,x3,x4≤5,用遗传算法求y的最大值。
三:实验环境操作系统:Microsoft Windows 7软件:Microsoft Visual studio 2010四:实验原理与步骤1、遗传算法的思想生物的进化是以集团为主体的。
与此相对应,遗传算法的运算对象是由M个个体所组成的集合,称为群体。
与生物一代一代的自然进化过程相类似,遗传算法的运算过程也是一个反复迭代过程,第t代群体极为P〔t〕,进过一代遗传和进化后,得到第t+1代群体,他们也是由多个个体组成的集合,记做P〔t+1〕。
这个群体不断地经过遗传和进化操作,并且每次都按照有优胜劣汰的规则将适应度较高的个体更多地遗传到下一代,这样最终在群体中将会得到一个优良的个体X,它所对应的表现性X将到达或接近于问题的最优解。
遗传算法实验报告

人工智能实验报告遗传算法实验报告一、问题描述对遗传算法的选择操作,设种群规模为4,个体用二进制编码,适应度函数,x的取值区间为[0,30]。
若遗传操作规定如下:(1)选择概率为100%,选择算法为轮盘赌算法;(2)交叉概率为1,交叉算法为单点交叉,交叉顺序按个体在种群中的顺序;(3)变异几率为0请编写程序,求取函数在区间[0,30]的最大值。
二、方法原理遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。
与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。
目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
遗传操作包括三个算子:选择、交叉和变异。
选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。
选择算子的作用效果是提高了群体的平均适应值。
由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。
交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。
变异是对个体的某一个或某一些基因值按某一较小概率进行改变。
从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。
交叉和变异相配合,共同完成对搜索空间的全局和局部搜索。
三、实现过程(1)编码:使用二进制编码,随机产生一个初始种群。
人工智能 遗传算法实验报告

人工智能试验陈述学号:姓名:试验名称:遗传算法试验日期: 2016.1.5【试验名称】遗传算法【试验目标】控制遗传算法的基起源基础理,熟习遗传算法的运行机制,学会用遗传算法来求解问题.【试验道理】遗传算法(Genetic Algorithm)是模仿达尔文生物进化论的天然选择和遗传学机理的生物进化进程的盘算模子,是一种经由过程模仿天然进化进程搜刮最优解的办法.遗传算法是从代表问题可能潜在的解集的一个种群开端的,而一个种群则由经由基因编码的必定命目标个别构成.每个个别现实上是染色体带有特点的实体.在一开端须要实现从表示型到基因型的映射即编码工作.因为模仿基因编码的工作很庞杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生计和优越劣汰的道理,逐代演变产生出越来越好的近似解,在每一代,依据问题域中个别的顺应度大小选择个别,并借助于天然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群.这个进程将导致种群像天然进化一样的后生代种群比前代加倍顺应于情况,末代种群中的最优个别经由解码,可以作为问题近似最优解.遗传算法程度流程图为:【试验内容】标题:已知f(x)=x*sin(x)+1,xÎ[0,2p],求f(x)的最大值和最小值.数据构造:struct poptype{double gene[length];//染色体double realnumber;//对应的实数xdouble fitness;//顺应度double rfitness;//相对顺应度double cfitness;//累计顺应度};struct poptype population[popsize+1];//最后一位存放max/minstruct poptype newpopulation[popsize+1];//染色体编码:[0,2]x π∈,变量长度为 2 π,取小数点后6位,因为2262322*102;π<<是以,染色体由23位字节的二进制矢量暗示,则X 与二进制串(<b 22 b 21…… b 0>)2之间的映射如下:()22222102010bb ......b 2'i i i b x =⎛⎫=•= ⎪⎝⎭∑;232'21x x π=- 顺应度函数: 因为请求f(x)的最值,所以顺应度函数即可为f(x).但为了确保在轮赌法选择过中,每个个别都有被选中的可能性,是以须要将所有顺应度调剂为大于0的值.是以,设计求最大值的顺应度函数如下:将最小问题转化为求-f(x)的最大值,同理,设计最小值的顺应度函数如下:种群大小:本试验默以为50,再进行种群初始化.试验参数:重要有迭代数,交叉概率,变异概率这三个参数.一般交叉概率在0.6-0.9规模内,变异概率在0.01-0.1规模内.可以经由过程手动输入进行调试.重要代码如下:void initialize()//种群初始化{srand(time(NULL));int i,j;for(i=0;i<popsize;i++)for(j=0;j<23;j++)population[i].gene[j]=rand()%2;void transform()//染色体转化为实数x{int i,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*p i/(pow(2,23)-1);}}void cal_fitness()//盘算顺应度{int i;for(i=0;i<popsize;i++)population[i].fitness=population[i].realnumber*sin(po pulation[i].realnumber)+6;}void select()//选择操纵{int mem,i,j,k;double sum=0;double p;for (mem=0;mem<popsize;mem++)sum+=population[mem].fitness;for (mem=0;mem<popsize; mem++)population[mem].rfitness=population[mem].fitness/sum;population[0].cfitness=population[0].rfitness;for (mem=1;mem<popsize;mem++)population[mem].cfitness=population[mem-1].cfitness+population[mem].rfitness;for (i=0;i<popsize;i++){ //轮赌法选择机制p=rand()%1000/1000.0;if (p<population[0].cfitness)newpopulation[i]=population[0];else{for (j=0;j<popsize;j++)if(p>=population[j].cfitness&&p<population[j+1].cfitness)newpopulation[i]=population[j+1];}}for (i=0;i<popsize;i++)//复制给下一代population[i]=newpopulation[i];}void cross()//交叉操纵{int i, mem, one;int first = 0;double x;for(mem=0;mem<popsize;mem++){x = rand()%1000/1000.0;if (x<pcross){++first;if (first%2==0)Xover(one,mem);//个别间染色体进行交叉函数else one=mem;}}}void mutate()//变异操纵{int i, j,t;double x;for (i=0;i<popsize;i++)for(j=0;j<length;j++){x=rand()%1000/1000.0;if (x<pvariation){if(population[i].gene[j])population[i].gene[j]=0; else population[i].gene[j]=1;}}}void cal_max()//盘算最大值{int i;double max,sum=0;int max_m;max=population[0].fitness;for(i=0;i<popsize-1;i++){if(population[i].fitness>population[i+1].fitness)if(population[i].fitness>=max){max=population[i].fitness;max_m=i;}else if(population[i+1].fitness>=max){max=population[i+1].fitness;max_m=i + 1;}}if(max>population[popsize].fitness){iteration=0;for (i=0;i<length;i++)population[popsize].gene[i]=population[max_m].gene[i]; population[popsize].fitness=population[max_m].fitness; }for (i=0;i<length;i++)sum=population[popsize].gene[i]-population[max_m].gene[i];if(sum==0)iteration++;transform();printf("%f,%f,%f,%f\n",population[popsize].fitness,po pulation[popsize+1].fitness,population[popsize].realnumbe r,population[popsize+1].realnumber);}【试验成果】。
遗传算法实验报告

人工智能实验报告遗传算法实验报告一、问题描述对遗传算法的选择操作,设种群规模为4,个体用二进制编码,适应度函数,x的取值区间为[0,30]。
若遗传操作规定如下:(1)选择概率为100%,选择算法为轮盘赌算法;(2)交叉概率为1,交叉算法为单点交叉,交叉顺序按个体在种群中的顺序;(3)变异几率为0请编写程序,求取函数在区间[0,30]的最大值。
二、方法原理遗传算法:遗传算法是借鉴生物界自然选择和群体进化机制形成的一种全局寻优算法。
与传统的优化算法相比,遗传算法具有如下优点:不是从单个点,而是从多个点构成的群体开始搜索;在搜索最优解过程中,只需要由目标函数值转换得来的适应值信息,而不需要导数等其它辅助信息;搜索过程不易陷入局部最优点。
目前,该算法已渗透到许多领域,并成为解决各领域复杂问题的有力工具。
在遗传算法中,将问题空间中的决策变量通过一定编码方法表示成遗传空间的一个个体,它是一个基因型串结构数据;同时,将目标函数值转换成适应值,它用来评价个体的优劣,并作为遗传操作的依据。
遗传操作包括三个算子:选择、交叉和变异。
选择用来实施适者生存的原则,即把当前群体中的个体按与适应值成比例的概率复制到新的群体中,构成交配池(当前代与下一代之间的中间群体)。
选择算子的作用效果是提高了群体的平均适应值。
由于选择算子没有产生新个体,所以群体中最好个体的适应值不会因选择操作而有所改进。
交叉算子可以产生新的个体,它首先使从交配池中的个体随机配对,然后将两两配对的个体按某种方式相互交换部分基因。
变异是对个体的某一个或某一些基因值按某一较小概率进行改变。
从产生新个体的能力方面来说,交叉算子是产生新个体的主要方法,它决定了遗传算法的全局搜索能力;而变异算子只是产生新个体的辅助方法,但也必不可少,因为它决定了遗传算法的局部搜索能力。
交叉和变异相配合,共同完成对搜索空间的全局和局部搜索。
三、实现过程(1)编码:使用二进制编码,随机产生一个初始种群。
人工智能遗传算法实验报告

人工智能实验报告学号:姓名:实验名称:遗传算法实验日期:2016.1.5【实验名称】遗传算法【实验目的】掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
这个过程将导致种群像自然进化一样的后生代种群比前代更加适应于环境,末代种群中的最优个体经过解码,可以作为问题近似最优解。
遗传算法程度流程图为:【实验名称】遗传算法【实验目的】掌握遗传算法的基本原理,熟悉遗传算法的运行机制,学会用遗传算法来求解问题。
【实验原理】遗传算法( Genetic Algorithm )是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。
遗传算法是从代表问题可能潜在的解集的一个种群开始的,而一个种群则由经过基因编码的一定数目的个体组成。
每个个体实际上是染色体带有特征的实体。
在一开始需要实现从表现型到基因型的映射即编码工作。
由于仿照基因编码的工作很复杂,我们往往进行简化,如二进制编码,初代种群产生之后,按照适者生存和优胜劣汰的原理,逐代演化产生出越来越好的近似解,在每一代,根据问题域中个体的适应度大小选择个体,并借助于自然遗传学的遗传算子进行组合交叉和变异,产生出代表新的解集的种群。
遗传算法报告

遗传算法实验报告一、实验目的1、 掌握遗传算法原理;2、 学会编写遗传算法程序寻找函数最大值。
二、实验设备装有matlab7.0以上版本软件的PC 机一台三、实验原理传统的优化理论都是通过调整模型的参数来得到期望的结果,而遗传优化算法是根据生物界的遗传和自然选择的原理来实现的,它的学习过程是通过保持和修改群体解中的个体特性,并且保证这种修改能够使下一代的群体中的有利于与期望特性相近的个体在整个群体份额中占有的比例越来越多。
与基于代数学的优化方法一样,遗传算法是通过连续不断地队群体进行改进来搜索函数的最大值。
遗传算法的搜索结果会有很大的差异。
遗传学习的基本机理是使那些优于群体中其他个体的个体具有生存、繁殖以及保持更多基因给下一代的机会。
遗传算法实质上是在群体空间中寻求较优解。
四、实验步骤及内容1、实验步骤:(1)群体初始化;(2)评价群体中每一个体性能;(3)选择下一代个体;(4)执行简单的操作算子(如交叉、变异);(5)评价下一代群体的性能;(6)判断终止条件满足否?若不,则转(3)继续,若满足,则结束。
2、实验内容:寻找函数 22212121(,)100()(1)f x x x x x =-+- 的最大值及所对应的x1和x2的值。
( 2.048 2.048i x -≤≤)五、实验程序clc;clear;%**************************遗传算法*****************************num=80;A1=rand(num,10); %生成随机数A2=rand(num,10);A1=round(A1); %编码A2=round(A2);times=100;for k=1:times %遗传次数SIZE(k)=size(A1,1);for i=1:size(A1,1)B1(i)=binvec2dec(A1(i,:));%二进制转换十进制B2(i)=binvec2dec(A2(i,:));X1(i)=4.096*B1(i)/1023-2.048;%映射到实际取值范围X2(i)=4.096*B2(i)/1023-2.048;H(i)=100*(X1(i)^2-X2(i))^2+(1-X1(i))^2;%计算函数值endJ=1./H;[J1,IX]=sort(J);Hm(k)=H(IX(1)); %得本次迭代的函数最大值Xm1(k)=X1(IX(1));%得本次迭代的使函数值最大的X1值Xm2(k)=X2(IX(1));%得本次迭代的使函数值最大的X2值S=sum(H)/size(H,2); %求适应度C1=[];C2=[];for i=1:size(A1,1)%复制过程if round(H(i)/S)==0 %为0则淘汰C1=C1;C2=C2;elseif round(H(i)/S)==1 %为1保留一次C1=[C1;A1(i,:)];C2=[C2;A2(i,:)];elseif round(H(i)/S)==2 %为2保留两次C1=[C1;A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:)];elseif round(H(i)/S)==3 %为3保留三次C1=[C1;A1(i,:);A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:);A2(i,:)];elseif round(H(i)/S)==4 %为4保留四次C1=[C1;A1(i,:);A1(i,:);A1(i,:);A1(i,:)];C2=[C2;A2(i,:);A2(i,:);A2(i,:);A2(i,:)];else %其他值时保留五次C1=[C1;A1(i,:);A1(i,:);A1(i,:);A1(i,:);A1(i,:)]; C2=[C2;A2(i,:);A2(i,:);A2(i,:);A2(i,:);;A2(i,:)]; endendA1=C1;A2=C2;for i=1:size(A1,1) %交叉a=rand;%生成本次交叉概率b=round(rand*9+1);%确定交叉位置if a>=0.6c=round(rand*(size(A1,1)-1)+1);%开始交叉D=A1(i,1:b);A1(i,1:b)=A2(c,1:b);A2(c,1:b)=D;endendfor i=1:size(A1,1) %变异e=rand;%生成变异概率f=round(rand*9+1);%确定变异位置if e<=0.1A1(i,f)=~A1(i,f);%开始变异A2(i,f)=~A2(i,f);endendendHH=1./Hm;[Q,IY]=sort(HH);Hmax=Hm(IY(1)) %最优解X1you=Xm1(IY(1)) %最优解时X1值X2you=Xm2(IY(1)) %最优解时X2值t=IY(1)%寻得最优解时的迭代次数s=SIZE(t)%训得最优解时种群中个体个数%************************寻优曲线********************** count=1:times;%figure(1);subplot(2,1,1);plot(count,Hm,'r.-');grid on;title('寻优曲线');xlabel('迭代次数');ylabel('函数取值');%figure(2);subplot(2,1,2);plot(count,SIZE,'b.-');grid on;title('种群个数曲线');xlabel('迭代次数');ylabel('种群个数');六、实验结果第一次运行结果:Hmax = 3.9059e+003 ,X1you = -2.0480,X2you = -2.0480,t =26,s = 42(此结果是最优解)第二次运行结果:Hmax = 3.8855e+003,X1you =-2.0440,X2you =-2.0480,t = 27,s =44(此结果不为最优解)第三次运行结果:Hmax = 3.9059e+003,X1you = -2.0480,X2you =-2.0480,t =17,s =60(此结果是最优解)改变初始种群个体个数为30Hmax = 3.8308e+003,X1you = -2.0440,X2you =-2.0040,t = 7,s = 24 (此结果不为最优解)改变迭代次数为30Hmax =3.8805e+003,X1you = -2.0440,X2you =-2.0440,t = 28,s = 57(此次不为最优解)七、分析实验结果在初始种群为80,迭代次数为100情况下,第一次和第三次运行结果寻得了最优解,而第二次并没寻得最优解,并且第一次和第三次寻得最优解时的迭代次数t和寻得最优解时的种群中个体个数s也不一样。
遗传算法求函数最大值实验报告

遗传算法求函数最大值实验报告遗传算法是一种模拟自然界进化过程的优化算法,它通过模拟生物进化过程中的遗传、交叉和变异等机制,逐步优化解空间中的个体,以找到问题的最优解。
在本次实验中,我们利用遗传算法来求解一个函数的最大值。
下面我们将详细介绍实验的过程和结果。
首先,我们选择了一个简单的函数作为实验对象,即f(x) = x^2,在x的范围为[-10, 10]。
我们的目标是找到使函数值最大的x。
首先,我们需要定义遗传算法中的基本元素,包括编码方式、适应度函数、选择策略、交叉和变异操作等。
在本实验中,我们选择二进制编码方式,将x的范围[-10, 10]离散化为10位的二进制编码。
适应度函数即为f(x) = x^2,它表示个体的适应度。
选择策略采用轮盘赌选择算法,交叉操作采用单点交叉,变异操作采用随机位变异。
接下来,我们需要初始化种群,并迭代进行交叉和变异操作,直到满足终止条件。
在每一代中,我们根据适应度函数对种群中的个体进行评估,并根据选择策略选择父代个体进行交叉和变异操作。
通过交叉和变异操作,产生新的子代个体,并替代原有种群中的个体。
在本次实验中,我们设置了100个个体的种群,并进行了100代的迭代。
实验结果显示,经过多次迭代,算法逐渐优化到了最优解。
最终找到了使函数值最大的x,即x=10,对应的函数值为100。
总结起来,本次实验利用遗传算法求解函数的最大值,展示了遗传算法在优化问题中的应用。
通过适当选择编码方式、适应度函数和操作策略,我们可以有效地找到问题的最优解。
在后续的研究中,我们可以进一步探索遗传算法在更复杂问题上的应用,并通过改进算法的参数和操作策略来提高算法的性能。
人工智能遗传算法实验报告

人工智能遗传算法实验报告摘要:遗传算法是一种算法设计和算法实现的一种方法,通过大量的数据进行比较,通过计算和迭代优化,寻找出最优解。
通过对实验数据进行分析和计算,得出了一套适合于计算科学的、高效的人工智能算法。
关键词:人工智能;算法;计算科学;实验作者简介:吴晓峰(1988年7月-),汉族,清华大学计算机系1995年9月毕业于清华大学。
现任北京航空航天大学计算机科学与技术学院教授、博士生导师。
曾任中国科学院计算技术研究所研究员、博士生导师。
一、背景人工智能(Artificial Intelligence)是指利用计算机对人的认知能力进行处理、分析、推理的技术系统。
人工智能领域的研究内容包括了智能系统功能的实现,智能系统的组成、智能系统在不同应用场景下所发挥的作用、智能系统在人与人之间扮演的角色以及智能系统对人类行为所产生的影响等问题。
我国在近年来,以谷歌、微软、百度等为代表的世界人工智能巨头纷纷加大研发力度及相关投入为标志,人工智能技术已经在社会各领域开始崭露头角。
随着人工智能领域在我国经济、科技、文化等方面都有了飞速发展以及中国在人工智能领域所取得的一些成就,我们应该更加重视人工智能技术领域所带来的影响。
本文主要介绍人工智能算法目前最先进的算法及未来发展方向。
本报告将通过一个多月时间对人工智能算法中涉及到的人工智能算法特点、算法原理以及常见问题进行分析总结,以得出一些人工智能算法相关的发展趋势与展望,从而更加深刻地认识人工智能所带来的社会变革与产业变革以及人工智能技术发展的新趋势与新方向之间的关系。
二、实验研究思路在研究人工智能时要做很多实验,首先,要确定好问题的类型,有什么方法能够快速的找到最优解,或者是一些特定的算法。
其次,还要确定实验用到具体的数据类型和数据集。
对于数据集而言,我们主要包括三个部分。
第一部分是需要确定的问题所在的数据集可以在计算机中实现。
第二部分是数据集的选取和组合后在计算机中可以实现的具体算法问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
交叉操作就是让2个以上的染色体进行交叉产生后代的过程,具体的交叉操作要看具体的问题。不过我觉得有一个原则,就是要有对称性,交叉得到的后代中的基因要来源于父代的所有个体中,也就是说n个个体进行交叉是和它们的排列没关系,这样子代才有机会得到更优秀的基因。交叉操作是遗传算法中最重要的操作。最简单的基本方式是交换父代中染色体片段。
三、实验内容
用遗传算法求根号2,也就是求方程f(x)=x*x-2=0的正整数解,x=1时f(1)<0,x=2时f(2)>0,由介值定理,则1到2中间存在一个根,根据代数基本定理和根的对称性知这就是我们要找的根,由目标函数得到适应度函数,我们选择个体都在[1,2]之间,那适应度函数我可以取
j(x)=40/(2+|x*x-2|)-10,由x的取值范围知j的范围是(0,10)
五、实验程序
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
typedef struct _indi//个体
{
double code;//染色体
double degree;//适应度
}Indi;
Indi group[40];//种群规模为40
//------------------------------------------------------名称:人工智能
实验名称:遗传算法问题
姓名:苏鹏海贾美丽赵妍张汉昭
学号:15100030631510003024
班级:计科实验室:软件技术实验室
指导教师:张慧日期:2016.11.09
&&遗传算法问题
一、实验目的
1.熟悉和掌握遗传算法的原理、实质;
2.学会使用遗传算法解决问题;
变异操作:
生物可以突变,有时候突变是好的,有时候却是坏的,但正是因为有了突变才让有限的种群中基因库可以非常丰富,也保证了种群的适应能力。变异操作通常是翻转个体中某段染色体,编码后的染色体在计算机中都是01串,也就可以随机的翻转某个(或多个)bit上的值。
交叉和变异不是一定要发生在选择了的个体上,而是按一定控制概率发生的,交叉概率比较高通常是0.6~0.95,而变异概率比较低通常是0.001~0.01。
return;
y=z;
}
}
//------------------------------------------------------
3.学会编写遗传算法程序寻找函数最值;
二、实验原理
遗传算法是仿真生物遗传学和自然选择机理,通过人工方式所构造的一类搜索算法,从某种程度上说遗传算法是对生物进化构成进行的数学方式仿真。在遗传算法中染色体对应的是一系列符号序列,在标准的遗传算法(即基本遗传算法)中,通常用0, 1组成的位串表示,串上各个位置对应基因座,各位置上的取值对应等位基因。遗传算法对染色体进行处理,染色体称为基因个体。一定数量的基因个体组成基因种群。种群中个体的数目为种群的规模,各个体对环境的适应程度称为适应度。
5.对被选择进入匹配池中的个体进行交叉操作,形成新种群
6.以小概率在种群中选择个体进行变异操作形成新种群
7.计算每个个体的适值
8.根据适值概率选择新个体形成新种群
9.检查结束条件,若满足则算法结束,当前种群中适值最高的个体即所求解;否则转3
选择操作:
首先要知道适应度函数,所谓的适应度函数就是评价函数,通常是问题的目的函数(或它的倒数),它描述了个体的优劣程度同时也决定了选择操作的概率,设fi表示第i个个体的适应度值,那选择第i个个体的概率就是fi/∑fj,简单来说,这个概率的大小就决定了该个体是被淘汰还是被保留。通常的具体做法是用类似赌盘的方法,每个个体占它的适应度那么宽的转盘大小,每次掷色子,落到哪一格就选哪一格对应的个体。
{
Indi z;
z.code=(x.code+y.code)/2.0;//交叉只进行了取平均值
Judge(z);
if(x.degree<y.degree)
{
if(z.degree<=x.degree)
return;//如果新个体不如双亲,淘汰之
x=z;//否则,替代父代中最次的一个
}
else
{
if(z.degree<=y.degree)
//适应度算法
void Judge(Indi &x)//适应度算法
{
double tmp=x.code*x.code-2.0;
if(tmp>=0)
x.degree=40.0/(2.0+tmp)-10.0;
else
x.degree=40.0/(2.0-tmp)-10.0;
}
//------------------------------------------------------
int happened(double p)//是否发生一个概率在p=0~1的事件
{
return rand()<(int)(p*RAND_MAX);
}
//------------------------------------------------------
//交叉操作
void Cross(Indi &x,Indi &y)//交叉操作,产生一个子代取代父代中最次的一个
x和y交叉就用取平均(x+y)/2,交叉概率取0.9,变异概率为0,
四、步骤分析
1.选择目标函数,确定变量定义域及编码精度,形成编码方案
2.随机产生一个规模为(即该种群中含有个体)的种群2
3.个体评价:计算群体P(t)中各个个体适应度
4.选择运算:将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。选择操作是建立在群体中个体的适应度评估基础上的。(选择运算用轮盘赌算法)