遗传算法程序代码--多目标优化--函数最值问题
多参数优化遗传算法python

多参数优化遗传算法python遗传算法是一种模拟生物进化过程的优化算法,它可以用于求解多参数优化问题。
在Python中,可以使用适当的库来实现多参数优化遗传算法。
在本文中,将介绍如何使用Python进行多参数优化遗传算法的实现。
首先,需要明确多参数优化问题的定义。
多参数优化问题是在给定目标函数下,找到能够使目标函数取得最大值或最小值的一组参数。
这些参数可能具有不同的取值范围和约束条件。
遗传算法通过对参数空间进行搜索和优化,逐步逼近最优解。
在遗传算法中,需要定义三个基本操作:选择、交叉和变异。
选择操作通过某些方法从当前种群中选择一些个体作为父代,进一步繁殖新的个体。
交叉操作将父代的染色体进行交叉,生成新的个体。
变异操作对某些个体的染色体进行突变,生成新的个体。
这些操作可以根据问题的特性进行定制,以更好地搜索解空间。
在Python中,可以使用遗传算法库DEAP来实现多参数优化遗传算法。
DEAP是一个开源的遗传算法库,提供了各种强大的功能和工具,方便在Python中进行遗传算法的实现。
可以通过pip安装DEAP库。
DEAP库提供了一些基本的工具,例如个体、染色体和种群的定义、选择、交叉和变异操作的实现,以及适应度函数的计算等。
通过使用这些工具,可以很容易地实现多参数优化遗传算法。
首先,需要定义问题的适应度函数。
适应度函数是衡量某个个体在解空间中的优劣程度的指标。
在多参数优化问题中,适应度函数通常是目标函数。
可以根据具体问题的要求进行适当地定义。
接下来,需要定义个体的染色体和参数空间。
个体的染色体是参数的组合。
可以使用DEAP库中的`creator`和`base`模块来定义染色体和参数空间。
例如,可以使用`creator`模块定义一个用于多参数优化问题的染色体:```pythonfrom deap import creator, basecreator.create("FitnessMax", base.Fitness, weights=(1.0,))creator.create("Individual", list,fitness=creator.FitnessMax)```然后,可以使用DEAP库中的`tools`模块定义选择、交叉和变异操作。
多目标遗传算法NSGA-II

在NSGA-II中,我们计算两个属性Sp 和np来帮助我们识别更好的个体。
快速非支配排序
假设种群大小为P,该算法需要计算每个个体p的被支配个数np和该个体支配的解的集合Sp 这两个参数。 遍历整个种群
该算法的伪代码如下:
拥挤度
• 为了使得到的解在目标空间中更加均匀,引入了拥挤度的概念
•为所有个体的拥挤距离初始化零。 •审视所有的个人和目标值。通过用Inf值分配绑定解决方案 来选择它们。 •计算每个目标的第m个最大值和最小值,得到归一化的分 母。 •对第i个个体的m个目标的拥挤距离求和
计算拥挤度是为了保存下来相似程度较低的解,保持解空间的多样性
精英保留策略
1 首先将父代种群Pt和子代种群Qt合成种群Rt 2 根据以下规则从种群Rt生成新的父代种群Rt+1
(1)根据Pareto等级从低到高的顺序,将整层种 群放入父代种群Rt+1中,真到某一层个体不能 全部放入父代种群Rt+1。 (2)将该层个体根据拥挤度从大到小排列,依次 放入父代种群Rt+1中,直到父代种群Rt+1f填满。
单目标优化——》多目标优化
NSGA-II 在常规遗传算法上的改进
• 1 快速非支配算子设计 • 多目标优化问题的设计关键在于求取Pareto最优解集。
• 2 通过优先选择拥挤距离较大的个体
• 3 精英策略选择算子
• NAS中的性能评估也可以是一个多目标问题 • 测试集上的准确率 • 参数数量
遗传算法解决多目标优化问题
多目标优化问题:
• 包含多个可能有冲突的目标函数
NSGA-Ⅱ算法,即带有精英保留策略的快 速非支配多目标优化算法,是一种基于 Pareto最优解的多目标优化算法。
matlab遗传算法求最大值步骤

一、介绍Matlab是一个高性能的数学计算软件,它集成了许多数学工具箱,其中包括遗传算法工具箱,可以帮助用户利用遗传算法求解最优化问题。
遗传算法是一种模拟生物进化过程的优化方法,通过模拟自然选择、交叉和变异等操作,不断优化解的搜索空间,从而找到最优解。
二、遗传算法求最大值步骤1. 创建遗传算法对象我们需要使用Matlab的遗传算法工具箱中的函数`ga`来创建一个遗传算法对象。
在创建对象时,需要指定优化的目标函数、决策变量的上下界、约束条件等参数,以及遗传算法的种裙大小、进化代数等参数。
例如:```matlaboptions = gaoptimset('Generations', 100, 'PopulationSize', 50); [x, fval, exitflag, output] = ga(fitnessfun, nvars, A, b, Aeq, beq, lb, ub, nonlcon, options);```其中,`fitnessfun`是用户自定义的目标函数,`nvars`是决策变量的个数,`A`, `b`, `Aeq`, `beq`是线性约束条件,`lb`, `ub`是决策变量的上下界,`nonlcon`是非线性约束条件,`options`是遗传算法的参数设置。
2. 编写目标函数用户需要编写自己的目标函数`fitnessfun`,该函数接受决策变量作为输入,并返回一个标量作为目标值。
例如:```matlabfunction y = fitnessfun(x)y = -sum(x.^2);end```在这个例子中,我们希望求解一个多维的最大化问题,因此目标函数返回了决策变量的负平方和作为最优解的评价指标。
3. 运行遗传算法一切准备就绪后,我们可以调用`ga`函数来运行遗传算法,并获取最优解和最优值。
遗传算法会不断进化种裙,直到达到指定的进化代数为止。
多目标遗传优化算法代码

多目标遗传优化算法代码
遗传算法是一种常用的优化算法,它模拟了生物进化的过程,通过种群的进化来寻找最优解。
多目标遗传优化算法是遗传算法的一种扩展,用于解决多目标优化问题。
以下是一个简单的伪代码示例,用于说明多目标遗传优化算法的基本思想:
plaintext.
初始化种群。
计算种群中每个个体的适应度(针对多个目标)。
重复执行以下步骤直到满足终止条件:
选择父代个体。
交叉产生子代个体。
变异子代个体。
计算子代个体的适应度(针对多个目标)。
更新种群。
在实际编写多目标遗传优化算法的代码时,需要根据具体的问
题定义适应度函数、选择算子、交叉算子和变异算子等。
此外,还
需要考虑种群大小、迭代次数、交叉概率、变异概率等参数的设置。
对于具体的实现代码,可以使用Python、Java、C++等编程语
言来编写。
在实际编写代码时,需要根据具体的问题进行适当的调
整和优化,以获得更好的求解效果。
总的来说,多目标遗传优化算法是一种强大的优化工具,可以
用于解决多目标优化问题,但在实际应用中需要根据具体的问题进
行适当的调整和优化。
希望这个简单的伪代码示例能够帮助你理解
多目标遗传优化算法的基本思想。
s q r t 函 数 实 现 算 法

多目标优化的遗传算法及其改进(浮点数编码),对多个函数进行测试为了解决算法陷入局部最优的现象,本文主要采用以下改进算法:把每一代种群中最优的一定数量的个体,无条件的遗传到下一代中,所以种群的最优适应度一定会随着遗传代数的增加不断升高或者不变(达到最大值时不再变化),通过这种方法可以大大减小遗传算法陷入局部最优的概率。
本文在上一篇的基础上,把单目标优化,扩展到了多目标优化,C语言代码如下:#includestdio.h#includestdlib.h#includemath.h#includetime.h#define M 100 --种群数量#define N 2 --变量个数#define PI 3.1415926#define PC 0.8 --交叉概率#define PM 0.4 --变异概率#define PA 0.01 --交叉因子#define COPYNUM 4struct Nodedouble Pmember[N];double Myfitness; --Myfitness是适应度double Myfitsum; --Myfitsum是适应度占总体适应度的百分比,然后从第一个个体往后累加,主要用于选择操作}Nownode[M],Nextnode[M],TempNode[COPYNUM]; --本代群体和下一代群体,TempNode存放每一代最优的COPYNUM个个体int nodeindex[M]; --交叉时随机配对,存放配对的群体下标double XMIN[N]={-10,-10};--每一个参数的最小值double XMAX[N]={10,10};--每一个参数的最大值double fx(double *x);int sortnode();int copym(int n);int copyn(int n);int calfitsum();int calfitness();double randn(int index);int initpopulation();int assignment(struct Node *node1,struct Node *node2);int copypopulation();int isrepeat(int temp,int n);int crossover();int mutation();int findmaxfit();int diplaynode();double fx(double *x) --根据x计算fxdouble y;int i=0,px[N]={0};y=0.5-(pow(sin(sqrt(pow(x[0],2)+pow(x[1],2))),2)-0.5)-pow ((1+0.001*(pow(x[0],2)+pow(x[1],2))),2);--schaffer函数,通过测试--y=3+pow(x[0],2)-cos(18*x[0])+pow(x[1],2)-cos(18*x[1]);--通过测试--y=4*pow(x[0],2)-2.1*pow(x[0],4)+pow(x[0],6)-3+x[0]*x[1] -4*pow(x[1],2)+pow(x[1],4)+5;--通过测试--y=pow(x[1]-5.1*pow(x[0],2)-(4*PI*PI)+5*x[0]-PI-6,2)+10* (1-1-(8*PI))*cos(x[0])+10;--通过测试--y=x[0]*exp(-pow(x[0],2)-pow(x[1],2))+1;--通过测试--y=sin(sqrt(pow(x[0],2)+pow(x[1],2)))-sqrt(pow(x[0],2)+p ow(x[1],2))+1;--通过测试--y=1.0-4000*(pow(x[0],2)+pow(x[1],2))-cos(x[0])*cos(x[1] -sqrt(2.0))+1;--Griewank函数通过测试--y=pow(x[0],2)-10*cos(2*PI*x[0])+10+pow(x[1],2)-10*cos(2 *PI*x[1])+10;--Rastrigin函数通过测试-*for(i=0;iN;i++)if(x[i]=0)px[i]=1;px[i]=0;y=px[1]*(1+px[0])+fabs(x[0]+50*px[1]*(1-2*px[0]))+fabs(x[ 1]+50*(1-2*px[1]));*---Tripod函数通过测试--y=20+exp(1)-20*exp(-0.2*sqrt((0.5)*(pow(x[0],2)+pow(x[1 ],2))))-exp(0.5*(cos(2*PI*x[0])+cos(2*PI*x[1])));--Ackley函数通过测试--y=100*pow((pow(x[0],2)-x[1]),2)+pow((1-x[0]),2)+1;--Ros enbrock函数范围缩小时可找到,或者把y=1-y改成y=exp(1-y)扩大个体适应度之间的差别--y=pow(x[0],2)+pow(x[1],2)+1;--NDparabola函数通过测试return y;int sortnode()int i,j;struct Node temp;for(i=0;iM;i++)for(j=i;jM;j++)if(Nownode[i].MyfitnessNownode[j].Myfitness)assignment(temp,Nownode[i]);assignment(Nownode[i],Nownode[j]);assignment(Nownode[j],temp);calfitsum();return 0;int copyn(int n)sortnode();for(i=0;in;i++)assignment(Nownode[M-1-i],TempNode[i]);calfitsum();return 0;int copym(int n)sortnode();for(i=0;in;i++)assignment(TempNode[i],Nownode[i]);return 0;int calfitsum()Nownode[0].Myfitsum=Nownode[0].Myfitness;for(i=1;iM;i++)Nownode[i].Myfitsum=Nownode[i].Myfitness+Nownode[i-1].Myf itsum;--每一个Myfitsum都是自己的适应度加上前一个的Myfitsum for(i=0;iM;i++)Nownode[i].Myfitsum=Nownode[i].Myfitsum-Nownode[M-1].Myfi tsum;--每一个Myfitsum除以所有适应度之和,使Myfitsum为0~1之间return 0;int calfitness() --计算适应度值double minfitness,maxfitness,avefitness=0;double temp;minfitness=Nownode[0].Myfitness=fx(Nownode[0].Pmember);maxfitness=minfitness;avefitness=maxfitness;for(i=1;iM;i++)Nownode[i].Myfitness=fx(Nownode[i].Pmember);avefitness+=Nownode[i].Myfitness;if(minfitnessNownode[i].Myfitness)minfitness=Nownode[i].Myfitness;if(maxfitnessNownode[i].Myfitness)maxfitness=Nownode[i].Myfitness;if(minfitness0)--如果有负的适应度值,就把所以的适应度都加上一个数,使适应度全都为正数temp=minfitness;Nownode[0].Myfitness+=-temp;avefitness=Nownode[0].Myfitness;maxfitness=Nownode[0].Myfitness;minfitness=Nownode[0].Myfitness;for(i=1;iM;i++)Nownode[i].Myfitness+=-temp;avefitness+=Nownode[i].Myfitness;if(minfitnessNownode[i].Myfitness)minfitness=Nownode[i].Myfitness;if(maxfitnessNownode[i].Myfitness)maxfitness=Nownode[i].Myfitness;calfitsum();return 0;double randn(int index) --产生XMIN到XMAX之间的随机数returnXMIN[index]+1.0*rand()-RAND_MAX*(XMAX[index]-XMIN[index]);int initpopulation() --初始化种群int i,j;for(i=0;iM;i++)for(j=0;jN;j++)Nownode[i].Pmember[j]=randn(j);calfitness(); --计算适应度return 0;int assignment(struct Node *node1,struct Node *node2)--把node2的值赋值给node1for(j=0;jN;j++)node1-Pmember[j]=node2-Pmember[j];node1-Myfitness=node2-Myfitness;node1-Myfitsum=node2-Myfitsum;int copypopulation() --复制操作int i,num=0;double temp;while(numM)temp=1.0*rand()-RAND_MAX;for(i=1;iM;i++)if(temp=Nownode[0].Myfitsum)assignment(Nextnode[num++],Nownode[0]);--把第一个个体复制到下一代if(temp=Nownode[i-1].Myfitsumtemp=Nownode[i].Myfitsum)--把第i个个体复制到下一代assignment(Nextnode[num++],Nownode[i]);for(i=0;iM;i++)assignment(Nownode[i],Nextnode[i]); --更新本代个体calfitsum();--calfitness(); --计算适应度return 0;int isrepeat(int temp,int n) --产生随机下标判断是否重复for(i=0;in;i++)if(nodeindex[i]==temp)return 1;int crossover()int i,j,temp;double temp_pc;for(j=0;jN;j++)for(i=0;iM;i++) --产生交叉点的下标temp=rand()%M;} while(isrepeat(temp,i));nodeindex[i]=temp;for(i=0;iM;i=i+2)temp_pc=1.0*rand()-RAND_MAX; --如果满足交叉的条件,就开始交叉if(temp_pc=PC)Nownode[nodeindex[i]].Pmember[j]=PA*Nownode[nodeindex[i+1 ]].Pmember[j]+(1-PA)*Nownode[nodeindex[i]].Pmember[j];Nownode[nodeindex[i+1]].Pmember[j]=PA*Nownode[nodeindex[i ]].Pmember[j]+(1-PA)*Nownode[nodeindex[i+1]].Pmember[j];calfitness(); --计算适应度return 0;int mutation() --变异操作int i,j,temp;double k=0.7,temp_pm;for(j=0;jN;j++)for(i=0;iM;i++)temp_pm=1.0*rand()-RAND_MAX;if(temp_pm=PM) --如果满足变异条件,就开始变异temp=rand()%2;if(temp==0)Nownode[i].Pmember[j]=Nownode[i].Pmember[j]+k*(XMAX[j]-No wnode[i].Pmember[j])*1.0*rand()-RAND_MAX;Nownode[i].Pmember[j]=Nownode[i].Pmember[j]-k*(Nownode[i] .Pmember[j]-XMIN[j])*1.0*rand()-RAND_MAX;calfitness(); --计算适应度return 0;int findmaxfit()--找到适应度最大的个体int i,index=0;double temp=0;for(i=0;iM;i++)if(tempNownode[i].Myfitness)index=i;temp=Nownode[i].Myfitness;return index;int displaynode()int i,j;printf("下标t");for(j=0;jN;j++)printf("x%dtt",j+1);printf("适应度tt适应度占比");for(i=0;iM;i++)printf("%dt",i);for(j=0;jN;j++)printf("%.4lftt",Nownode[i].Pmember[j]);printf("%.4lftt%.4lf",Nownode[i].Myfitness,Nownode[i].Myf itsum);return 0;int main()int j,index;double x[2]={0.3432,0.4399};int num=0,num1=0,num2=0;srand(time(NULL));initpopulation();while(T++500)copym(COPYNUM);copypopulation();crossover();mutation();copyn(COPYNUM);index=findmaxfit();printf("下标t");for(j=0;jN;j++)printf("x%dtt",j+1);printf("适应度tt函数值");printf("%dt",index);for(j=0;jN;j++)printf("%.4lftt",Nownode[index].Pmember[j]);x[j]=Nownode[index].Pmember[j];printf("%.4lftt%lf",(Nownode[index].Myfitness),fx(Nownode [index].Pmember));return 0;本文所采用的测试函数主要有以下几个:1.Schaffer函数上述函数在matlab画出图像的代码如下所示:xx=-10:0.1:10;yy=-10:0.1:10;[x,y]=meshgrid(xx,yy);z1=0.5-(sin(sqrt(x.^2+y.^2)).^2-0.5).-((1+0.001*(x.^2+y.^2)) .^2);%Schaffer函数mesh(x,y,z1);set(gca,'fontsize',20);title('Schaffer函数','fontsize',20);z2=x.^2-cos(18*x)+y.^2-cos(18*y)+3;%后面加了3mesh(x,y,z2);title('z2=x^2-cos(18*x)+y^2-cos(18*y)+3','fontsize',20);z3=4*x.^2-2.1*x.^4+x.^6-3+x.*y-4*y.^2+y.^4+5;%后面加了5mesh(x,y,z3);title('z3=4*x^2-2.1*x^4+x^6-3+x*y-4*y^2+y^4+5','fontsize',20 );z4=(y-5.1*x.^2-4-pi-pi+5*x-pi-6).^2+10*(1-1-8-pi)*cos(x)+10;mesh(x,y,z4);title('z4=(y-5.1*x^2-4-pi-pi+5*x-pi-6)^2+10*(1-1-8-pi)*cos(x )+10','fontsize',20);z5=x.*exp(-x.^2-y.^2)+1;mesh(x,y,z5);title('z5=x*exp(-x^2-y^2)+1','fontsize',20);z6=sin(sqrt(x.^2+y.^2)+1e-6).-(sqrt(x.^2+y.^2)+1e-6)+1;mesh(x,y,z6);title('z6=sin(sqrt(x^2+y^2))-(sqrt(x^2+y^2))+1','fontsize',2 0);z7=1-4000*(x.^2+y.^2)-cos(x).*cos(y-sqrt(2))+1;%Griewank函数mesh(x,y,z7);title('Griewank函数','fontsize',20);z8=(x.^2-10*cos(2*pi*x)+10)+(y.^2-10*cos(2*pi*y)+10);%Rastri gin函数mesh(x,y,z8);title('Rastringin函数','fontsize',20);px1=((x)=0);px2=((y)=0);z9=px2.*(1+px1)+abs(x+50*px2.*(1-2*px1))+abs(y+50*(1-2*px2)) ;%Tripod函数mesh(x,y,z9);title('Tripod函数','fontsize',20);z10=20+exp(1)-20*exp(-0.2*sqrt((0.5)*(x.^2+y.^2)))-exp(0.5*( cos(2*pi*x)+cos(2*pi*y)));%Ackley函数mesh(x,y,z10);title('Ackley函数','fontsize',20);z11=100*(x.^2-y).^2+(1-x).^2;%Rosenbrock函数mesh(x,y,z11);title('Rosenbrock函数','fontsize',20);z12=x.^2+y.^2;mesh(x,y,z12);title('NDparabola函数','fontsize',20);在matlab中可以不仅可以画出上述函数的图像,还可以得到函数的最值点,然后用来检测遗传算法得到系统最值点的准确性,以Schaffer函数为例,matlab得到最值点的代码如下所示:f=@(x)-1*(0.5-(sin(sqrt(x(1).^2+x(2).^2)).^2-0.5).-((1+0.001 *(x(1).^2+x(2).^2)).^2));[minx fmin]=fminsearch(f,[1 1]);fminsearch是寻找多变量函数的最小值,这里要寻找最大值,所以把Schaffer函数取相反数。
研究生作业_基于遗传算法优化多元多目标函数的MATLAB实现

南京航空航天大学共 8 页第 1 页学院:航空宇航学院姓名: 魏德宸基于遗传算法优化多元多目标函数的MATLAB实现0.引言现实生活中的很多决策问题都要考虑同时优化若干个目标,而这些目标之间有时是彼此约束,甚至相互冲突,这样就需要从所有可能的方案中找到最合理、最可靠的解决方案。
而遗传算法是模拟达尔文的遗传选择和自然淘汰的生物进化过程的一种新的迭代的全局优化搜索算法,它能够使群体进化并行搜寻多个目标,并逐渐找到问题的最优解。
1.问题描述变量维数为5,含有2个优化目标的多目标优化问题表达式如下对于该问题,利用权重系数变换法很容易求出最优解,本题中确定f1和f2的权重系数都为0.5。
2.遗传算法2.1遗传算法简述遗传算法的基本原理是通过作用于染色体上的基因寻找好的染色体来求解问题,它需要对算法所产生的每个染色体进行评价,并基于适应度值来选择染色体,使适应性好的染色体有更多的繁殖机会,在遗传算法中,通过随机方式产生若干个所求解问题的数字编码,即染色体,形成初始种群;通过适应度函数给每个个体一个数值评价,淘汰低适应度的个体,选择高适应度的个体参加遗传操作,经过遗产操作后的个体集合形成下一代新的种群,对这个新的种群进行下一轮的进化。
2.2遗传算法的过程遗传算法的基本过程是:1.初始化群体。
2.计算群体上每个个体的适应度值3.由个体适应度值所决定的某个规则选择将进入下一代个体。
4.按概率Pc进行交叉操作。
5.按概率Pm进行变异操作。
6.没有满足某种停止条件,则转第2步,否则进入第7步。
7.输出种群中适应度值最优的染色体作为问题的满意解或最优界。
8.遗传算法过程图如图1:图1 遗传算法过程图3.遗传算法MATLAB代码实现本题中控制参数如下:(1)适应度函数形式FitnV=ranking(ObjV)为基于排序的适应度分配。
(2)交叉概率取为一般情况下的0.7,变异概率取其默认值.(3)个体数目分别为2000和100以用于比较对结果的影响。
matlab多目标优化遗传算法

matlab多目标优化遗传算法Matlab多目标优化遗传算法引言:多目标优化是在现实问题中常见的一种情况,它涉及到在多个目标函数的约束下,寻找一组最优解,从而使得多个目标函数达到最优状态。
遗传算法是一种常用的优化方法,它模拟了自然界中的遗传和进化过程,通过不断迭代、选择和交叉变异等操作,逐步搜索最优解。
本文将介绍如何使用Matlab中的遗传算法工具箱来实现多目标优化。
多目标优化问题描述:在传统的单目标优化问题中,我们寻找的是一组参数,使得目标函数的值最小或最大。
而在多目标优化问题中,我们需要考虑多个目标函数的最优化。
具体来说,我们假设有m个目标函数,目标向量为f(x)=(f1(x), f2(x), ..., fm(x)),其中x是决策变量向量。
我们的目标是找到一组解x∗,使得f(x∗)在所有可行解中最优。
然而,由于多目标问题中的目标函数之间往往存在冲突,即改善一个目标函数的同时可能会导致其他目标函数的恶化,导致不存在一个唯一最优解。
因此,我们常常追求一组非劣解,即无法通过改变解的一个目标值而不改变其他目标值。
Matlab多目标优化遗传算法工具箱:Matlab提供了一个强大的工具箱,即Multiobjective Optimization Toolbox,可用于解决多目标优化问题。
该工具箱基于遗传算法,并结合了其他优化策略和算子,能够高效地搜索多目标优化问题的非劣解集合。
使用Matlab多目标优化遗传算法工具箱的步骤如下:1. 定义目标函数:根据具体问题,编写目标函数,输入为决策变量向量,输出为目标函数向量。
2. 设置优化参数:包括种群大小、迭代次数、交叉概率、变异概率等。
3. 定义决策变量的上下界:根据问题的约束条件,设置决策变量的取值范围。
4. 运行遗传算法:使用Matlab中的gamultiobj函数来运行多目标优化遗传算法,得到非劣解集合。
5. 分析结果:根据具体问题,分析非劣解集合,选择最优解。
实验五:遗传算法求解函数最值问题实验

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\)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
函数最值问题:F=X2+Y2-Z2,clearclc%%初始化pc=0.9; %交叉概率pm=0.05; %变异概率popsize=500;chromlength1=21;chromlength2=23;chromlength3=20;chromlength=chromlength1+chromlength2+chromlength3;pop=initpop(popsize,chromlength);% 产生初始种群for i=1:500[objvalue]=calobjvalue(pop); %计算目标函数值[fitvalue]=calfitvalue(objvalue);%计算个体适应度[newpop]=selection(pop,fitvalue);%选择[newpop1]=crossover(newpop,pc) ; %交叉[newpop2]=mutation(newpop1,pm) ;%变异[newobjvalue]=newcalobjvalue(newpop2); %计算最新代目标函数值[newfitvalue]=newcalfitvalue(newobjvalue); % 计算新种群适应度值[bestindividual,bestfit]=best(newpop2,newfitvalue); %求出群体中适应值最大的个体及其适应值y(i)=max(bestfit); %储存最优个体适应值pop5=bestindividual; %储存最优个体n(i)=i; %记录最优代位置%解码x1(i)=0+decodechrom(pop5,1,21)*2/(pow2(21)-1);x2(i)=decodechrom(pop5,22,23)*6/(pow2(23)-1)-1;x3(i)=decodechrom(pop5,45,20)*1/(pow2(20)-1);pop=newpop2;end%%绘图figure(1)%最优点变化趋势图i=1:500;plot(y(i),'-b*')xlabel('迭代次数');ylabel('最优个体适应值');title('最优点变化趋势');legend('最优点');grid on[z index]=max(y); %计算最大值及其位置PO=n(index) %最优个体的位置X=x1(index)Y=x2(index)Z=x3(index)F=zfunction [bestindividual,bestfit]=best(newpop2,newfitvalue)% 求出群体中最大得适应值及其个体%遗传算法子程序%Name: best.m[px,py]=size(newpop2);bestindividual=newpop2(1,:);bestfit=newfitvalue(1);for i=2:pxif newfitvalue(i)>bestfitbestindividual=newpop2(i,:);bestfit=newfitvalue(i);endendfunction [fitvalue]=calfitvalue(objvalue)% 计算个体的适应值%遗传算法子程序%Name:calfitvalue.mfitvalue=objvalue;function [objvalue]=calobjvalue(pop)% 计算目标函数值%遗传算法子程序%Name: calobjvalue.mtemp1=decodechrom(pop,1,21); %将pop每行转化成十进制数相当于X'temp2=decodechrom(pop,22,23);temp3=decodechrom(pop,45,20);x1=temp1*2/(pow2(21)-1); %将二值域中的数转化为变量域的数相当于十进制的Xx2=temp2*6/(pow2(23)-1)-1;x3=temp3*1/(pow2(20)-1);objvalue=x1.^2+x2.^2-x3.^2; %计算目标函数值function [newpop1]=crossover(newpop,pc)%交叉%遗传算法子程序%Name: crossover.m[px,py]=size(newpop);newpop1=zeros(size(newpop));for i=1:2:px-1po=rand(1);if po<pccpoint=round(rand*py); %随机寻找交叉点newpop1(i,:)=[newpop(i+1,1:cpoint),newpop(i,cpoint+1:py)]; %相邻两个染色体在交叉点位置交叉newpop1(i+1,:)=[newpop(i,1:cpoint),newpop(i+1,cpoint+1:py)];elsenewpop1(i,:)=newpop(i,:);%不产生新染色体newpop1(i+1,:)=newpop(i+1,:);endendfunction pop2=decodebinary(pop)% 将二进制数转化为十进制数(1)%遗传算法子程序%Name: decodebinary.m%产生[2^n 2^(n-1) ... 1] 的行向量,然后求和,将二进制转化为十进制[px,py]=size(pop); %求pop行和列数for i=1:pypop1(:,i)=2.^(py-i).*pop(:,i);endpop2=sum(pop1,2); %求pop1的每行之和function pop2=decodechrom(pop,spoint,length)% decodechrom.m函数的功能是将染色体(或二进制编码)转换为十进制,参数spoint表示待解码的二进制串的起始位置% (对于多个变量而言,如有两个变量,采用20为表示,每个变量10为,则第一个变量从1开始,另一个变量从11开始。
)% 参数1ength表示所截取的长度。
%Name: decodechrom.mpop1=pop(:,spoint:spoint+length-1);pop2=decodebinary(pop1);function pop=initpop(popsize,chromlength)% 初始化(编码)% initpop.m函数的功能是实现群体的初始化,popsize表示群体的大小,chromlength表示染色体的长度(二值数的长度),% 长度大小取决于变量的二进制编码的长度。
%遗传算法子程序%Name: initpop.mpop=round(rand(popsize,chromlength));% rand随机产生每个单元为{0,1} 行数为popsize,列数为chromlength的矩阵,% round对矩阵的每个单元进行圆整。
这样产生的初始种群。
function [newpop2]=mutation(newpop1,pm)% 变异%Name: mutation.m[px,py]=size(newpop1);newpop2=zeros(px,py);for i=1:pxps=rand;if ps<pmmpoint=round(rand*py);if mpoint<=0mpoint=1;endif newpop1(i,mpoint)==0newpop1(i,mpoint)=1;elsenewpop1(i,mpoint)=0;endelseendendnewpop2=newpop1;function [newpop2]=mutation(newpop1,pm) % 变异%Name: mutation.m[px,py]=size(newpop1);newpop2=zeros(px,py);for i=1:pxps=rand;if ps<pmmpoint=round(rand*py);if mpoint<=0mpoint=1;endif newpop1(i,mpoint)==0newpop1(i,mpoint)=1;elsenewpop1(i,mpoint)=0;endelseendendnewpop2=newpop1;function [newobjvalue]=newcalobjvalue(newpop2)% 计算目标函数值,最新代%遗传算法子程序%Name: newcalobjvalue.mtemp1=decodechrom(newpop2,1,21); %将pop每行转化成十进制数相当于X'temp2=decodechrom(newpop2,22,23);temp3=decodechrom(newpop2,45,20);x1=temp1*2/(pow2(21)-1); %将二值域中的数转化为变量域的数相当于十进制的X x2=temp2*6/(pow2(23)-1)-1;x3=temp3*1/(pow2(20)-1);newobjvalue=x1.^2+x2.^2-x3.^2; %计算目标函数值function [newpop]=selection(pop,fitvalue)%选择操作objvalue=calobjvalue(pop);fitvalue=calfitvalue(objvalue);totalfit=sum(fitvalue); %求适应度值之和pfitvalue=fitvalue/totalfit; %单个个体被选择的概率if pfitvalue<0pfitvalue==0;endmfitvalue=cumsum(pfitvalue); %如fitvalue=[1 2 3 4],则cumsum(fitvalue)=[1 3 6 10] [px,py]=size(pop);ms=sort(rand(px,1)); %从小到大排列fitin=1;newin=1;newpop=zeros(px,py);while newin<=pxif mfitvalue(fitin)>ms(newin)newpop(newin,:)=pop(fitin,:);newin=newin+1;elsefitin=fitin+1;endend。