遗传算法求解函数最大值

合集下载

用遗传算法求解Rosenbrock函数最优解实验报告

用遗传算法求解Rosenbrock函数最优解实验报告

华中师范大学计算机科学系实验报告书实验题目:用遗传算法求解Rosenbrock函数的最大值问题课程名称:智能计算主讲教师:***辅导教师:课程编号:班级:2011级实验时间:2011.11用遗传算法求解Rosenbrock函数最大值问题摘要:本文利用遗传算法研究了求解Rosenbrock函数的最大值问题.在较多的计算机模拟实验结果中表明,用遗传算法可以有效地解决这一问题.文中分析了一种基于遗传算法对Rosenbrock函数最大值问题的求解,得到了适于解决此问题的合理的遗传操作,从而为有效地解决最速下降法所不能实现的某一类函数代化问题提供了一种新的途径.通过对基于遗传算法对Rosenbrock函数最大值问题的求解,进一步理解遗传算法对解决此类问题的思想。

关键词:遗传算法,Rosenbrock函数,函数优化,最速下降法。

Abstract:This paper deals with the maximum of Rosenbrock s function based ongenetic algorithms. The simulated results show that the problem can be solved effectivelyusing genetic algorithms. The influence of some rnodified genetic algorithms on searchspeed is also examined. Some genetic operations suitable to the optimization technique areobtained, therefore, a novel way of solving a class of optimizations of functions that cannot be realized using the method of steepest descent is proposed.Through dealing with the maximum of Rosenbrock s function based ongenetic algorithms,a better understanding of the genetic algorithm to solve such problems thinking.Keyword:ongenetic algorithms,Rosenbrock function,function optimization,Steepest descent method绪论:无约束的函数优化是应用范围广泛的一类函数优化问题,随着对这类问题逐渐深入的研究,到目前为止,人们已经提出了许多无约束最优化的方法,例如:导数的梯度法,牛顿法,共轭梯度法等多种方法。

遗传算法求函数最大值实验报告

遗传算法求函数最大值实验报告

遗传算法求函数最大值实验报告遗传算法是一种模拟自然界进化过程的优化算法,它通过模拟生物进化过程中的遗传、交叉和变异等机制,逐步优化解空间中的个体,以找到问题的最优解。

在本次实验中,我们利用遗传算法来求解一个函数的最大值。

下面我们将详细介绍实验的过程和结果。

首先,我们选择了一个简单的函数作为实验对象,即f(x) = x^2,在x的范围为[-10, 10]。

我们的目标是找到使函数值最大的x。

首先,我们需要定义遗传算法中的基本元素,包括编码方式、适应度函数、选择策略、交叉和变异操作等。

在本实验中,我们选择二进制编码方式,将x的范围[-10, 10]离散化为10位的二进制编码。

适应度函数即为f(x) = x^2,它表示个体的适应度。

选择策略采用轮盘赌选择算法,交叉操作采用单点交叉,变异操作采用随机位变异。

接下来,我们需要初始化种群,并迭代进行交叉和变异操作,直到满足终止条件。

在每一代中,我们根据适应度函数对种群中的个体进行评估,并根据选择策略选择父代个体进行交叉和变异操作。

通过交叉和变异操作,产生新的子代个体,并替代原有种群中的个体。

在本次实验中,我们设置了100个个体的种群,并进行了100代的迭代。

实验结果显示,经过多次迭代,算法逐渐优化到了最优解。

最终找到了使函数值最大的x,即x=10,对应的函数值为100。

总结起来,本次实验利用遗传算法求解函数的最大值,展示了遗传算法在优化问题中的应用。

通过适当选择编码方式、适应度函数和操作策略,我们可以有效地找到问题的最优解。

在后续的研究中,我们可以进一步探索遗传算法在更复杂问题上的应用,并通过改进算法的参数和操作策略来提高算法的性能。

matlab遗传算法计算函数区间最大值和最小值

matlab遗传算法计算函数区间最大值和最小值

matlab遗传算法计算函数区间最大值和最小值下面是用matlab实现遗传算法计算函数区间最大值和最小值的示例代码:首先定义函数(此处以f(x)=x*sin(10*pi*x)+1为例):matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;end然后设置遗传算法参数:matlaboptions = gaoptimset('Generations', 1000, 'PopulationSize', 50,'StallGenLimit', 200, 'TolCon', 1e-10);其中,Generations表示遗传算法的迭代次数,PopulationSize表示种群大小,StallGenLimit表示在连续多少代没有改变时停止迭代,TolCon表示收敛精度。

接着,编写遗传算法主函数:matlab[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);其中,第一个参数为要优化的函数,第二个参数为变量维度,后面的参数为变量的取值范围。

最后,输出结果:matlabfprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);其中,-fval表示函数最大值,fval表示函数最小值。

完整代码如下:matlabfunction y = myfun(x)y = x*sin(10*pi*x)+1;endoptions = gaoptimset('Generations', 1000, 'PopulationSize', 50, 'StallGenLimit', 200, 'TolCon', 1e-10);[x, fval] = ga(@myfun, 1, [], [], [], [], -1, 2, [], [], options);fprintf('Function maximum is %f\n',-fval);fprintf('Function minimum is %f\n',fval);参考资料:[1][2]。

实验五:遗传算法求解函数最值问题实验

实验五:遗传算法求解函数最值问题实验
//适应度巒数』为避免负值.把目标函数加Y正数
EJdoublefitness(constCh^crrcscrcRc)
{
doublek,y;
decode(cx# y);
retiurnf(x, y)+5;
2•交叉操作
首先是根据交叉概率probCross选择要交叉的个体进行交叉
//根据交叉槪率进行交叉
for(inti=pre = -1;i<N; i++)
//根据变异概率迸行变异
for (inti=0;i<N; i++)
if(randQm61() < probMutation)
mutate(group[i]);
变异时先随机生成变异的位置,然后把改位的01值翻转。
//变异操作
Hvoidmutate(ChrcfnosomeS c)
{
//随机选行翻转
inti-rand()%len; c-g[i] =
//骑越
boolflag-令;
for(inti = j=0; i<1.亡n;i++)
swap(d.g[l]Jc2.g[i]);
if(i== crosspcint[j])
//妇杲若干个交叉点重合”则效果叠加 "偃数个交叉点效果瑁当于没有交叉点while(j<
flag = [flag;
3.变异操作
首先是根据变异概率probMutation选择要变异的个体
经过一定的进化之后得到最终种群,从中选择最优的个体即可得
到最终的结果。
//获取种群最优你
-intgetOptimal(Ch^crescr:-oup[mxn]doubled—double&』doubled\)

遗传算法求解函数最大值

遗传算法求解函数最大值

S9 李麒星用遗传算法通过复制交叉过程循环求解函数f(x)=x^2在[0,31]区间上的最大值点x。

代码如下:using System;using ;using ;namespace Project2{class Class1{public int ff(int a){return a * a;}public int Max(int[] args){int s = 0;int m = args[0];for (int i = 0; i < ; i++){if (m < args[i]){m = args[i];s = i;}}return s;}public int Min(int[] args){int s = 0;int m = args[0];for (int i = 0; i < ; i++){if (m > args[i]){m = args[i];s = i;}}return s;}static void Main(String[] args)S9 李麒星{string[] A = new string[4];A[0] = "01101";A[1] = "11000";A[2] = "01000";A[3] = "10011";Class1 cl = new Class1();Random a = new Random();int[] x = new int[4];ubstring(k1);ubstring(k2);string s3 = A[3 - max].Substring(k1);string s4 = A[3 - min].Substring(k2);A[max] = A[max].Substring(0, k1) + s3;A[min] = A[min].Substring(0, k2) + s4;A[3 - max] = A[3 - max].Substring(0,k1) + s1; A[3 - min] = A[3 - min].Substring(0,k2) + s2; }elseif ((max > min) && (min + 1 ==max))ubstring(k1);ubstring(k2);string s3 = A[3].Substring(k1);string s4 = A[0].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[3] = A[3].Substring(0,k1) + s1;A[3] = A[3].Substring(0,k2) + s2;S9 李麒星}elseif ((max < min) && (min == max +1))ubstring(k1);ubstring(k2);string s3 = A[0].Substring(k1);string s4 = A[3].Substring(k2);A[max] = A[max].Substring(0,k1) + s3; A[min] = A[min].Substring(0,k2) + s4; A[0] = A[0].Substring(0,k1) + s1;A[3] = A[3].Substring(0,k2) + s2;}elseif ((max > min) && (max ==min +3))ubstring(k1);ubstring(k2);string s3 = A[2].Substring(k1);string s4 = A[1].Substring(k2);A[max] = A[max].Substring(0,k1) + s3; A[min] = A[min].Substring(0,k2) + s4; A[2] = A[2].Substring(0,k1) + s1;A[1] = A[1].Substring(0,k2) + s2;}elseif ((max < min) && ( min==max +3 ))ubstring(k1);ubstring(k2);string s3 = A[1].Substring(k1);string s4 = A[2].Substring(k2);A[max] = A[max].Substring(0,k1) + s3;A[min] = A[min].Substring(0,k2) + s4;A[1] = A[1].Substring(0,k1) + s1; S9 李麒星A[1] = A[1].Substring(0,k2) + s2; }}("最大值是={0}", t1); }}}输出如下:S9 李麒星结论:由图可知每次循环结果不唯一。

遗传算法计算函数最大值

遗传算法计算函数最大值

遗传算法计算函数最大值遗传算法是一种模拟进化过程的优化算法,被广泛应用于求解函数最大值问题。

在遗传算法中,问题的解被表示为染色体的形式,每个染色体都是由一串基因组成。

每个基因可以看作是染色体中的一个变量值,它们合起来构成了一个可行解。

随着进化的进行,每个可行解都会被评估,评估函数即为目标函数,目标函数可以是我们需要求解的函数。

根据目标函数的评价结果,我们可以对染色体进行选择、交叉和变异,以产生新的一代染色体,进而继续进行优化。

遗传算法的核心是选择、交叉和变异这三个基本操作。

选择操作是指从当前种群中选择部分优秀的染色体作为父代,根据染色体的适应度值进行随机抽样。

交叉操作是指将两个父代染色体的一部分基因进行互换,产生新的子代染色体。

变异操作是指对子代染色体的某个基因进行随机改变,产生新的基因。

遗传算法具有很好的鲁棒性和适应性,能够应对大规模的优化问题。

它的优势在于不要求问题具有良好的可微性,也不需要先验知识,能够处理不确定的搜索空间和复杂的非线性函数。

在求解函数最大值问题时,我们需要首先定义一个适当的目标函数。

目标函数可以是实际应用中的函数,也可以是一些基本函数或常用函数。

常见的函数包括线性函数、二次函数、指数函数、对数函数、三角函数等。

以求解f(x)=-x^2+2x+6函数最大值为例,假设x的范围在[0,5]之间,则可定义目标函数如下:f(x)=-x^2+2x+6在遗传算法的优化过程中,我们需要确定初始种群、目标函数、选择、交叉和变异等相关参数。

初始种群可以采用随机生成的方式,或者根据某些规律生成;目标函数应该能够给出染色体的适应度值;选择操作可以根据适应度函数对染色体进行排序,或者采用轮盘赌的方式选择优秀染色体;交叉操作可以随机选取父代染色体的一部分基因进行交叉;变异操作可以按照一定概率随机对子代染色体的基因进行改变。

最终,经过多轮迭代,我们可以得到一组较优的染色体,以及它们所对应的函数最大值。

遗传算法求函数最大值

遗传算法求函数最大值

遗传算法求函数最大值
遗传算法是一种基于自然进化的搜索算法,它可以用来求解复杂的优化问题。

它的基本思想是模拟自然界中的进化过程,通过繁殖、变异和选择来改善解决方案。

遗传算法可以用
来求解函数最大值问题,它的基本步骤如下:
1. 初始化种群:首先,需要初始化一个种群,种群中的每个个体都是一个可能的解决方案,每个个体都有一个与之对应的适应度值。

2. 计算适应度:然后,需要计算每个个体的适应度值,适应度值越高,表明该个体越有可
能是最优解。

3. 选择:接下来,需要根据适应度值对种群中的个体进行选择,选择出适应度值较高的个体,以便在下一代中繁殖。

4. 交叉:然后,需要对选择出的个体进行交叉,以产生新的个体,新的个体具有父代个体
的特征。

5. 变异:最后,需要对新的个体进行变异,以产生新的特征,以提高搜索的效率。

通过上述步骤,可以不断迭代,直到找到最优解为止。

遗传算法可以用来求解函数最大值问题,它可以有效地搜索出最优解,而且可以在复杂的环境中取得良好的效果。

基于遗传算法求函数最大值

基于遗传算法求函数最大值

土豆学习小组基于遗传算法求函数最大值先给出实例:设函数为:]7,1[,10)3sin()5cos()(∈+−=x x x x f ,取种群大小20,搜索精度0.0001,交叉概率0.6,变异概率0.1,遗传20代。

下面根据这个例子来叙述如何通过遗传算法来计算最大值。

遗传算法的概念和相关知识可以去网上查看,这里主要介绍和程序相关的知识。

遗传算法的流程图如下:遗传算法流程图种群的产生一般由随机数产生固定长度的01序列,可以理解成染色体,例如:1111010011100001011000,这表示一个单独个体的染色体,那么结合这个例子就是产生20个这样的染色体。

种群适应度估计,因为是求最大值,所以适应度可以通过求函数值来确定,函数值越大,越适合生存。

选择,这是一个自然选择的过程,这里用轮盘赌选择法,土豆学习小组轮盘赌选择法交叉用单点交叉:单点交叉变异的形式如下:变异当然变异的概率相对较低。

注意:选择和交叉方法还很多,也比这来的有效,只是这种方法较为简单,易于程序实现。

MATLAB命令窗口:>>[xv,fv]=GA(@fitness,1,7,20,20,0.6,0.1,0.0001)xv=3.6723土豆学习小组fv=11.8830函数图形结果基本符合。

函数文件1:fitness.m用于存放需要求的函数function F=fitness(x)F=cos(5*x)-sin(3*x)+10;函数文件2:GA.m遗传算法文件function[xv,fv]=GA(fitness,a,b,NP,NG,pc,pm,eps) %上限a%下限b%种群大小:NP%遗传代数:NG%交叉概率:pc%变异概率:pm%离散精度:eps%第一步产生初始种群x,产生之前需要根据离散精度确定串长L L=ceil(log2((b-a)/eps));x=Initial(L,NP);for i=1:NPxdec(i)=dec(a,b,x(i,:),L);end%第二步选择交叉变异要循环好几代for i=1:NG%选择轮盘赌选择法fx=fitness(xdec);%适应度fxp=fx/sum(fx);%选择概率fxa(1)=fxp(1);%累计概率土豆学习小组for j=2:NPfxa(j)=fxa(j-1)+fxp(j);end%开始选择父体sat=rand();for k=1:NPif sat<=fxa(k)father=k;break;endend%随机选取母体mother=ceil(rand()*NP);nx=x;%单点交叉cutp=ceil(rand()*L);r1=rand();if r1<=pcnx(i,1:cutp)=x(father,1:cutp);nx(i,cutp+1:L)=x(mother,cutp+1:L);r2=rand();%是否变异if r2<pmcum=ceil(rand()*L);nx(i,cum)=~nx(i,cum);endendx=nx;for i=1:NPxdec(i)=dec(a,b,x(i,:),L);end%选择较好的子代fv=-inf;for i=1:NPfitx=fitness(dec(a,b,x(i,:),L));if fitx>fvfv=fitx;xv=dec(a,b,x(i,:),L);endendend土豆学习小组%种群初始化函数function t=Initial(L,NP)t=zeros(NP,L);for i=1:NPfor j=1:Ltemp=rand();t(i,j)=round(temp);endend%解码函数转换成十进制function d=dec(a,b,num,L)i=L-1:-1:0;dd=sum((2.^i).*num);d=a+dd*(b-a)/(2^L-1);其中:dec函数将某个个体转换到【1,7】之间的数000000000000=1;111111111111=7;。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

人工智能遗传算法函数优化目录1引言 (3)1.1 摘要 (3)1.2 背景 (3)2 实验过程 (4)2.1 程序目标 (4)2.2 实验原理及步骤 (4)2.3程序 (5)2.3.1程序理解: (5)2.3.3调试程序: (5)2.4 实验总结 (18)1引言1.1 摘要函数优化是遗传算法的经典应用领域,也是对遗传算法进行性能评价的常用算例。

本文将用一个详细的例子来说明用遗传算法解一个简单参数优化问题的过程。

这里求解的是一个函数的最大值的问题。

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

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

群体经过一个模拟进化的过程:在每一代,相对“好”的解产生,相对“差”的解死亡。

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

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

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

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

变异是通过用一个等于变异率的概率随机地改变被选择染色体上的一个或多个基因。

变异算子的意图是向群体引入一些额外的变化性。

运用遗传算法解题必经的五个步骤:1.对问题潜在解的遗传表达。

2.产生潜在解初始群体的方法。

3.起环境作用的用“适应值”评价解的适应程度的评价函数。

4.改变后代组成的各种遗传算子。

5.遗传算法所使用的各种参数:群体规模、应用遗传算子的概率等。

2 实验过程2.1 程序目标在实验过程中,我们应用遗传算法来模拟一个函数优化的问题。

程序所要解决的问题是求f(x1,x2)=21.5+x1*sin(4pi*x1)+x2*sin(20pi*x2)的最大值,其中-3.0≤x1≤12.1及4.1≤x2≤5.8。

2.2 实验原理及步骤1 )首先确立变量x1的定义域长度为15.1;所要求的小数点以后第四位精度意味着区间[-3.0, 12.1]应该至少被分成15.1*10000个等距区间,即染色体的第一部分需要18位;自变量x2域长度为 1.7,精度要求区间[4.1, 5.8]应该至少被分成1.7*10000个等距区间,即染色体的第二部分需要15位。

所以染色体总长度为33位。

用遗传算法的优化函数f,产生了一个有pop_size = 20个染色体的群体。

所有染色体的33位都是随机初始化。

对每个染色体进行解码并计算解码后的(x1,x2)的适应函数值,eval(vi) (i=1,..,pop_size) = f(x1,x2)。

2)为选择过程建立一个轮盘。

计算群体的总适应值F,并计算每个染色体vi (i=1,..,pop_size)的选择概率pi:pi = eval(vi) / F 和累积概率qi: qi = p1 + .. + pi.3)转动轮盘20次,每次为新群体选择一单个染色体。

生成一个区间[0,1]里的20个数的一个随机序列。

如果一个随机数位于qi于q(i+1)之间,则q(i+1)被选择。

4)对新群体中的个体应用杂交算子。

杂交概率pc = 0.25,所以预计染色体中平均有25%将经历杂交。

杂交按照下面的方法进行:对新群体中的每个染色体,产生在区间[0,1]里的随机数r,并从随机序列中选出r<0.25的染色体进行杂交。

5)对被选择的染色体随机进行配对。

并从区间[1,32]里产生一个随机整数pos。

数字pos表示杂交点的位置。

6)算子变异。

在一位一位基础上执行。

变异概率pm = 0.01,所以我们预计平均将有1%的位经历变异。

整个群体共有m*pop_size = 660位,可以预计平均每代有6.6次变异。

因为每一位都有均等的机会被变异,所以对群体中的每一位可以产生区间[0,1]里的一个随机数r,如果r<0.01,则变异此位。

7)由上面得到最新的向量群体。

对每个染色体进行解码,并计算解码后的(x1,x2)的适应函数值。

选出最好染色体的评价值。

8)准备再一次运行选择过程,继续进行迭代计算,应用遗传算子及评价下一代。

2.3程序2.3.1程序理解:初始化函数:在变量限定的范围内初始化遗传因子的值。

从gadata.txt'这个文件中读取每个变量的上下边界,并且在这个范围内随机初始化产生染色体中的值。

随机值生成函数:多次用到此函数。

评价函数:函数需要用户自己定义一个数学函数式。

population[mem].fitness = 21.5+x[1]*sin(4.0*PI*x[1])+x[2]*sin(20.0*PI*x[2]);记录最优个体(取优函数):前一代的最优成员被存储在数组的最后。

但如果现今这一代的最优成员并没有上一代的好(值小于),则后者(上一代的最优值)会取代本代中最差的成员。

如果当前代的最优值大于上一代的,则将当前代的最优值拷贝出来,否则则用上一代的最优值取代当前代的最差值。

确保我们始终取到最适合的那个值。

选择函数:为的是解决优化模型中的最大问题,确保最优秀的成员始终存活下来。

杂交函数:void Xover(int one, int two)对选择出来的双亲进行杂交。

变异:void mutate(void)某个被选择出来的要进行变异的因子,将会被一个取值范围内的随机量所代替。

报告函数:void report(void)用来报告演算程序的进展。

输入output文件里的数据以逗号相隔。

2.3.3调试程序:写好程序之后,就可以进行调试了。

当在gadat.txt里输入3 5;6 9;7 8;1 6四组数据时,在”galog.txt”文件中可以看到输出的结果。

现附上迭代500次的结果:1, 32.922158615, 23.048467665, 5.9266975712, 32.922158615, 25.219353332, 4.7481252773, 32.922158615, 25.602532313, 4.4710821274, 32.922158615, 26.483624415, 4.7128737915, 34.004917169, 27.171438656, 4.4017050266, 34.004917169, 27.632563061, 4.3429457467, 34.004917169, 28.507499261, 4.1029910808, 34.295500976, 28.367508993, 4.4348759249, 34.295500976, 28.713407029, 3.942327273 。

494, 34.295500976, 34.295500976, 0.000000664495, 34.295500976, 34.295500976, 0.000000664496, 34.295500976, 34.295500976, 0.000000664497, 34.295500976, 34.295500976, 0.000000664498, 34.295500976, 34.295500976, 0.000000664499, 34.295500976, 34.295500976, 0.000000664500, 34.295500976, 34.295500976, 0.000000664Simulation completedvar(0) = 4.654000000var(1) = 8.721000000var(2) = 7.609000000var(3) = 5.980000000Best fitness = 34.295500976附源代码:#include <stdio.h>#include <stdlib.h>#include <math.h>#define TRUE 1#define FALSE 0#define PMUTATION 0.001 #define MAXGENS 500#define POPSIZE 100#define NV ARS 4#define PXOVER 0.8int generation;int cur_best;FILE *galog;FILE *output;struct genotype{double gene[NV ARS];double fitness;double upper[NV ARS];double lower[NV ARS];double rfitness;double cfitness;};struct genotype population[POPSIZE+1]; struct genotype newpopulation[POPSIZE+1]; void initialize(void);double randval(double, double);void evaluate(void);void keep_the_best(void);void elitist(void);void select(void);void crossover(void);void Xover(int,int);void swap(double *, double *);void mutate(void);void report(void);void initialize(void){FILE *infile;int i, j;double lbound, ubound;if ((infile = fopen("gadata.txt","r"))==NULL) {fprintf(galog,"\nCannot open input file!\n");exit(1);}remove("output.dat");for (i = 0; i < NV ARS; i++){fscanf(infile, "%lf",&lbound);fscanf(infile, "%lf",&ubound);for (j = 0; j < POPSIZE; j++){population[j].fitness = 0;population[j].rfitness = 0;population[j].cfitness = 0;population[j].lower[i] = lbound;population[j].upper[i] = ubound;population[j].gene[i] = randval(population[j].lower[i],population[j].upper[i]);}}fclose(infile);}double randval(double low, double high){double val;val = ((double)(rand()%1000)/1000.0)*(high - low) + low;return(val);}void evaluate(void){if ((output = fopen("output.dat","a"))==NULL){exit(1);}int mem;int i;double x[NV ARS+1];double PI = 3.141593;for (mem = 0; mem < POPSIZE; mem++){for (i = 0; i < NV ARS; i++)x[i+1] = population[mem].gene[i];population[mem].fitness = 21.5+x[1]*sin(4.0*PI*x[1])+x[2]*sin(20.0*PI*x[2]);if (population[mem].fitness <40 && population[mem].fitness>35){fprintf(output, "\n%5d, %6.9f, %6.9f, %6.9f ", generation,x[1],x[2],population[mem].fitness);}}fclose(output);}void keep_the_best(){int mem;int i;cur_best = 0;for (mem = 0; mem < POPSIZE; mem++){if (population[mem].fitness > population[POPSIZE].fitness){cur_best = mem;population[POPSIZE].fitness = population[mem].fitness;}}for (i = 0; i < NV ARS; i++)population[POPSIZE].gene[i] = population[cur_best].gene[i]; }void elitist(){int i;double best, worst;int best_mem, worst_mem;best = population[0].fitness;worst = population[0].fitness;for (i = 0; i < POPSIZE - 1; ++i){if(population[i].fitness > population[i+1].fitness){if (population[i].fitness >= best){best = population[i].fitness;best_mem = i;}if (population[i+1].fitness <= worst){worst = population[i+1].fitness;worst_mem = i + 1;}}else{if (population[i].fitness <= worst){worst = population[i].fitness;worst_mem = i;}if (population[i+1].fitness >= best){best = population[i+1].fitness;best_mem = i + 1;}}}if (best >= population[POPSIZE].fitness){for (i = 0; i < NV ARS; i++)population[POPSIZE].gene[i] = population[best_mem].gene[i];population[POPSIZE].fitness = population[best_mem].fitness;}else{for (i = 0; i < NV ARS; i++)population[worst_mem].gene[i] = population[POPSIZE].gene[i];population[worst_mem].fitness = population[POPSIZE].fitness;}}void select(void){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 crossover(void){int i, mem, one;int first = 0;double x;for (mem = 0; mem < POPSIZE; ++mem){x = rand()%1000/1000.0;if (x < PXOVER){++first;if (first % 2 == 0)Xover(one, mem);elseone = mem;}}}void Xover(int one, int two){int i;int point;if(NV ARS > 1){if(NV ARS == 2)point = 1;elsepoint = (rand() % (NV ARS - 1)) + 1;for (i = 0; i < point; i++)swap(&population[one].gene[i], &population[two].gene[i]);}}void swap(double *x, double *y){double temp;temp = *x;*x = *y;*y = temp;}void mutate(void){int i, j;double lbound, hbound;double x;for (i = 0; i < POPSIZE; i++)for (j = 0; j < NV ARS; j++){x = rand()%1000/1000.0;if (x < PMUTATION){lbound = population[i].lower[j];hbound = population[i].upper[j];population[i].gene[j] = randval(lbound, hbound);}}}void report(void){int i;double best_val;double avg;double stddev;double sum_square;double square_sum;double sum;sum = 0.0;sum_square = 0.0;for (i = 0; i < POPSIZE; i++){sum += population[i].fitness;sum_square += population[i].fitness * population[i].fitness;}avg = sum/(double)POPSIZE;square_sum = avg * avg * POPSIZE;stddev = sqrt((sum_square - square_sum)/(POPSIZE - 1));best_val = population[POPSIZE].fitness;fprintf(galog, "\n%5d, %6.9f, %6.9f, %6.9f ", generation, best_val, avg, stddev);printf( "\n%5d, %6.9f, %6.9f, %6.9f ", generation, best_val, avg, stddev);}void main(void){int i;if ((galog = fopen("galog.txt","w"))==NULL){exit(1);}generation = 0;fprintf(galog, "\n generation best average standard \n");printf( "\n generation best average standard \n");fprintf(galog, " number value fitness deviation \n");printf(" number value fitness deviation \n");initialize();evaluate();keep_the_best();while(generation<MAXGENS){generation++;select();crossover();mutate();report();evaluate();elitist();}fprintf(galog,"\n\n Simulation completed\n");printf("\n\n Simulation completed\n");fprintf(galog,"\n\n Simulation completed\n");printf("\n\n Simulation completed\n");for (i = 0; i < NV ARS; i++){fprintf (galog,"\n var(%d) = %3.9f",i,population[POPSIZE].gene[i]);printf ("\n var(%d) = %3.9f",i,population[POPSIZE].gene[i]);}fprintf(galog,"\n\n Best fitness = %3.9f",population[POPSIZE].fitness); fclose(galog);printf("\n\n Best fitness = %3.9f",population[POPSIZE].fitness);printf("\n OK\n");}2.4 实验总结通过这次实验,我发现了遗传算法在某些方面的巨大优势和强大功能;它能够非常快地解决一些非常复杂的问题。

相关文档
最新文档