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

合集下载

遗传算法求函数最小值

遗传算法求函数最小值

遗传算法求函数最小值遗传算法是一种模拟自然界中生物进化过程的计算方法,其基本原理是模拟类比生物的自然选择、交叉和变异过程,以达到求解非线性优化问题的目的。

在本文中,我们将介绍如何使用遗传算法来求解一个简单但典型的非线性函数优化问题。

该函数是 Rosenbrock 函数,它是一个多峰函数,一般用来测试其他优化算法的性能。

Rosenbrock 函数的公式如下:$$f(x,y) = (1-x)^2 + 100(y-x^2)^2$$该函数有一个明显的最小值点 $(1, 1)$,函数值为 0。

我们的目标是使用遗传算法来找到这个最小值点。

以下是遗传算法的基本流程:1. 初始化种群:随机生成一组初始解。

2. 评估适应度:计算种群中每个解的适应度,即 Rosenbrock 函数的值。

适应度越高,表示该解越接近最小值点。

3. 选择育种个体:采用轮盘赌算法从种群中选择一些个体,用于后续的交叉和变异。

4. 交叉:对选择出来的个体进行交叉操作,生成一定数量的新个体。

交叉操作的目的是将两个个体的优良特征互相交换,以产生更好的后代。

5. 变异:对上一步生成的新个体进行变异操作,产生进一步的多样性和探索性。

6. 评估适应度:对新生成的个体进行适应度评估,即 Rosenbrock 函数的值。

7. 替换:选择一部分新生成的个体,替代原来种群中适应度低的个体。

8. 检查停止条件:判断是否满足停止条件,如果是,则输出最优解;否则回到第 3 步。

根据以上基本流程,我们可以逐步开发程序实现。

首先,我们定义一个 Rosenbrock 函数的计算函数:```pythondef rosenbrock(x, y):return (1 - x)**2 + 100*(y - x**2)**2```然后,我们随机生成一组初始解,使用 numpy 库生成随机数,x、y 取值范围在 [-3,3]:```pythonimport numpy as npPOPULATION_SIZE = 100 # 种群大小BOUND_LOW, BOUND_HIGH = -3.0, 3.0 # 取值范围populations = np.random.uniform(low=BOUND_LOW, high=BOUND_HIGH,size=(POPULATION_SIZE, 2))```fitness = [rosenbrock(x, y) for x, y in populations]df = pd.DataFrame({'x': populations[:, 0], 'y': populations[:, 1],'fitness': fitness})```然后,我们编写轮盘赌算法选择育种个体的代码。

遗传算法报告

遗传算法报告

遗传算法实验报告一、实验目的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也不一样。

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

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

实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数在及y的最大值。

二、实验容使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。

算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。

定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。

设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。

然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。

1.选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。

但实验时发现结果不好,经过仔细研究之后发现,这里在x、y 取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。

对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。

实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。

2.交叉操作首先是根据交叉概率probCross选择要交叉的个体进行交叉。

这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。

3.变异操作首先是根据变异概率probMutation选择要变异的个体。

变异时先随机生成变异的位置,然后把改位的01值翻转。

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

实验五:遗传算法求解函数最值问题实验
//适应度巒数』为避免负值.把目标函数加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\)

遗传算法实验报告

遗传算法实验报告
遗传算法实验报告
13349035计算机系黄定帮
一、实验背景
遗传算法(Genetic Algorithm)又叫基因进化算法,是一种模拟遗传继承和达尔文适者生存原理的随机搜索算法。由于其结构简单,鲁棒性强,适用于并行处理以及高效实用等特点,对于传统搜索算法难以解决的非线性函数优化等问题具有明显的优势,因而在提出之后立即受到了各国学者的广泛关注,无论是理论研究还是应用研究都成了十分热门的课题。
图1函数的三维图
实验要求:
1.通过修改“演化程序prog.cpp”文件里的代码evaluation函数,将适应值目标函数定义为上述函数。
2.将原程序中的参数改为:种群规模100,迭代次数为500,pc=0.7,pm=0.07。适当修改代码使得该算法运行30次,求平均数。
3.探究参数pc和pm对实验结果的影响:分别设pc=0.1,0.2,0.3….,0.9。pm=0.01,0.02,0.03,…0.09,对每一组参数组合在函数上运行30次,基于30次的平均结果作图进行分析。
int main(void)
{
srand(time(NULL));
int num =0;
int i,j;
if ((galog = fopen("galog.txt","w"))==NULL){ exit(1); }
for( pm =0.01;pm <0.095;pm =pm +0.01)
for( pc=0.1;pc<0.95;pc=pc+0.1){
elitist();
}
sum=sum+population[POPSIZE].fitness;
if(j==29)
fprintf(galog,"%3.4f ",sum/30.0);

遗传算法解决函数优化问题

遗传算法解决函数优化问题

实验一 遗传算法解决函数优化问题一、实验目的1.掌握遗传算法的基本原理和步骤。

2. 复习VB 、VC 的基本概念、基本语法和编程方法,并熟练使用VB 或VC 编写遗传算法程序。

二、实验内容1. 上机编写程序,解决以下函数优化问题:()1021min 100i i i f x x =⎛⎫=≤ ⎪⎝⎭∑X2. 调试程序。

3. 根据实验结果,撰写实验报告。

三、实验原理遗传算法是一类随机优化算法,但它不是简单的随机比较搜索,而是通过对染色体的评价和对染色体中基因的作用,有效地利用已有信息来指导搜索有希望改善优化质量的状态。

标准遗传算法流程图如下图所示,主要步骤可描述如下: ① 随机产生一组初始个体构成初始种群。

② 计算每一个体的适配值(fitness value ,也称为适应度)。

适应度值是对染色体(个体)进行评价的一种指标,是GA 进行优化所用的主要信息,它与个体的目标值存在一种对应关系。

③ 判断算法收敛准则是否满足,若满足,则输出搜索结果;否则执行以下步骤。

④ 根据适应度值大小以一定方式执行复制操作(也称为选择操作)。

⑤ 按交叉概率p c 执行交叉操作。

⑥ 按变异概率p m 执行变异操作。

⑦ 返回步骤②。

图1.1 标准遗传算法流程图四、程序代码#include <stdio.h>#include <math.h>#include <stdlib.h>#include<time.h>#define byte unsigned char#define step 200 //步长#define MAX 50#define N 10 //随机数个数#define Pc 0.74 //被选择到下一代的概率,个数=Pc*N,小于N 下一代数=上一代,不用处理#define Pt 0.25 //交叉的概率,个数=Pt*N 舍,小于N 0~(n2+1)随机数,之后部分开始交叉#define Pm 0.01 //变异的概率,个数=Pm*N*n2 入,小于N 0~(N*(n2+1))随机数/(n2+1)=个体,0~(N*(n2+1))随机数%(n2+1)=该个体基因位置#define n2 15//2的15次方,共16位#define next_t (int)(Pt*N)//交叉个数#define next_m (int)(Pm*N+1)//变异个数向后约等于#define e 0.001//次数限制阈值/*int N=10; //随机数个数float Pc=0.74; //被选择到下一代的概率,个数=Pc*N,小于N 下一代数=上一代,不用处理float Pt=0.25; //交叉的概率,个数=Pt*N 舍,小于N 0~(n2+1)随机数,之后部分开始交叉float Pm=0.01; //变异的概率,个数=Pm*N*n2 入,小于N 0~(N*(n2+1))随机数/(n2+1)=个体,0~(N*(n2+1))随机数%(n2+1)=该个体基因位置*/bytebitary[N][n2+1],bitary0[N][n2+1];//二进制int src1[N];float ShowType(int a);//表现型void BinNum(int a);//二进制位数n2 float fit_func(float a);//适应度void DecToBin (int src,int num);//十进制转二进制void BinToDec (void);//十进制转二进制int selectT(float a,float b[10]);//选择交叉个体int selectM(float a,float b[10]);//选择变异个体void main(void){//范围是[-100,100]*************************** intsrc[N],i=0,j=0,k=0,count=0;//十进制float show[N];//表现型float fit[N],sumfit=0;//适应度float pcopy[N];//优胜劣汰,遗传到下一代的概率fit[i]/总和(fit[i]) float pacc[N];//pcopy[i]累加概率值float prand[N];//随机产生N个0~1的下一代概率int iselect;//根据概率选择到的个体序号int new_select[N];//根据概率选择到的个体int new_T[next_t],new_M[next_m];float min,min1;printf("随机数(原始母体),表现型, 适配值\n");srand( (unsigned)time(NULL) );for(i=0;i<N;i++){src[i]=rand()%32768;//rand()%201-100===>-100~100的十进制随机数随时间递增show[i]=ShowType(src[i]);//转化成表现型fit[i]=fit_func(show[i]);//计算各个适配值(适应度)sumfit=sumfit+fit[i]; //种群的适应度总和printf("%5d, %f, %f\n",src[i],s how[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);//第0代count++;min=sumfit;printf("\n遗传到下一代的概率\n");for(i=0;i<N;i++){pcopy[i]=fit[i]/sumfit;printf("%f, ",pcopy[i]);}// 求选择(被复制)的累加概率,用于轮盘赌产生随机数区域,选择下一代个体printf("\n遗传到下一代的累加概率\n");pacc[0]=pcopy[0];for(i=1;i<N;i++){pacc[i]=pacc[i-1]+pcopy[i];printf("%f, ",pacc[i]);}//每个src[N]都随机取其中一个pcopy,取得的值pcopy[i]跟pcopy概率大小有关//模拟轮盘赌方式选择新一代printf("\n\n新产生的第%d代,表现型, 适配值\n",count);srand( (unsigned)time(NULL) );for(i=0;i<N;i++){prand[i]=(float)( (rand()%101)*0.01 );//0~1的十进制小数,精确到0.01iselect=selectT(prand[i],pacc);new_select[i]=src[iselect];//产生的新一代,十进制show[i]=ShowType(new_select[i]);/ /转化成表现型fit[i]=fit_func(show[i]);DecToBin (new_select[i],i);sumfit=sumfit+fit[i]; //种群的适应度总和printf(" %d %f %f\n",new_selec t[i],show[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);//第1代min1=sumfit;if (min>sumfit){min1=min;min=sumfit;}while(fabs(min-min1)>e&&count<MAX ){//从新一代选择个体交叉printf("\n随机产生交叉个体号");srand( (unsigned)time(NULL) );for(i=0;i<2;i++) //简单起见交叉数设为2{new_T[i]=rand()%N;//0~10的十进制数产生的交叉个体if (i>0)//两个不同个体交叉while(new_T[i]==new_T[i-1])new_T[i]=rand()%N;printf("%d, ",new_T[i]);}srand( (unsigned)time(NULL) );//随机产生交叉位置k=rand()%n2;//0~14的十进制数printf("\n随机产生交叉位置 %d\n",k);printf("\n原编码\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[0]][j]);printf("\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[1]][j]);printf("\n位置%d后交叉编码\n",k);char temp;for(i=k+1;i<n2+1;i++)//交叉{temp=bitary[new_T[0]][i];bitary[new_T[0]][i]=bitary[new_T[ 1]][i];bitary[new_T[1]][i]=temp;}for(j=n2;j>=0;j--)printf("%c",bitary[new_T[0]][j]);printf("\n");for(j=n2;j>=0;j--)printf("%c",bitary[new_T[1]][j]);//从新一代选择个体变异printf("\n随机产生变异个体号");srand( (unsigned)time(NULL) );for(i=0;i<1;i++) //简单起见变异数设为1个{new_M[i]=rand()%N;//0~9的十进制数产生的变异个体k=rand()%(n2+1);//0~15的十进制数printf("%d\n编码位置 %d\n原编码\n",new_M[i],k);for(j=n2;j>=0;j--)printf("%c",bitary[new_M[i]][j]);if(bitary[new_M[i]][k]=='0')//变异取反bitary[new_M[i]][k]='1';elsebitary[new_M[i]][k]='0';printf("\n位置%d变异后编码\n",k);for(j=n2;j>=0;j--)printf("%c",bitary[new_M[i]][j]);}printf("\n");count++;//新的bitary即产生第二代printf("\n新产生的第%d代\n",count);for(i=0;i<N;i++){for(j=n2;j>=0;j--)printf("%c",bitary[i][j]);printf("\n");}BinToDec ();//二进制转十进制 for(i=0;i<N;i++){new_select[i]=src1[i];show[i]=ShowType(src[i]);//转化成表现型fit[i]=fit_func(show[i]);//计算各个适配值(适应度)sumfit=sumfit+fit[i]; //种群的适应度总和printf("%5d, %f, %f\n",src1[i], show[i],fit[i]);}printf("\n第%d代适配总值\n%f\n",count,sumfit);if (sumfit<min){min1=min;min=sumfit;}}printf("\n\n\n*****************\n over\n*****************\n",sumfit);}//////////////////////////子函数////////////////float ShowType(int a){float temp;temp=(float)(a*200.0/32767-100);/ /(2的15次方减1)=32767return temp;}float fit_func(float a){float temp;temp=a*a;return temp;}void DecToBin (int src,int num){int i;//注意负数的补码if (src<0){src=(int)pow(2,16)-abs(src);}for (i=0;i<=n2;i++){bitary[num][i]='0';bitary0[num][i]='0';if(src){bitary[num][i]=(src%2)+48;bitary0[num][i]=(src%2)+48;src=(int)(src/2);}}}void BinToDec (void){int i,j;for(i=0;i<N;i++){src1[i]=0;for(j=0;j<n2+1;j++){src1[i]=src1[i]+(bitary[i][j]-48) *(int)pow(2,j);}}}int selectT(float a,float b[10]) {int i;for(i=0;i<N;i++){if (a<b[i])return i;}return -1;} 五、实验结果分析:随机性大,精度不高六、实验心得理论指导实践,在实践中得以提高。

用遗传算法求解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 , y ) x y , 5.12 x 5.12 De Jong函数: f ( x , y ) 100( y x ) ( x 1) x , y [ 2.048, 2.048] Goldstein--price函数: f ( x , y ) [1 ( x y 1) (1 9 1 4 x 3 y 1 4 x 6 xy 3 x )]
2 4 6 2 4 5
2 2 6
f 4 ( x , y ) ( x y 11) ( x y 7) x , y [ 6, 6]
2 2 2
5
5
7
i 1
i 1
2
2
8
6 x y 10
2 2
15
2012-7-20
运行结果
函数 最优值 最差值 平均值 实际最优值 0 0 3 f1(x) f2(x) f3(x) -1.2207e-008 2.2631e-006 3 1.2207e-005 1.9232e-004 3.0001 6.6530e-006 8.9500e-005 3
f4(x)
f5(x) f6(x) f7(x) f8(x)
6.8081e-008
-1.0316 -0.1848 -186.7308 -2.1188
2.2219e-005
-1.0309 -0.1848 -186.7012 -2.1188
8.5730e-006
-1.0143 -0.1848 -186.7291 -2.1188
F (1) F ( 2 ) F ( i 1) ada_sum * rand F(1) F ( 2 ) F ( i )

蜂群算法在函数优化问题中的应用

蜂群算法在函数优化问题中的应用

摘要:函数优化是算法应用中的基本问题,蜂群算法作为遗传算法与生物种群习性特征相结合的新算法,比较适合于此类问题的求解。

本文首先对蜂群算法进行了简单的描述,设计出基于蜜蜂婚配过程的计算机实现的同等模型。

使用实例测试蜂群算法的运行效果,并将其结果与基本遗传算法的结果进行比较。

实验结果表明,蜂群算法全局搜索能力强,具有较快较好的发现最优解的能力。

关键词:蜂群算法;遗传算法;函数优化中图分类号:tp18 文献标识码:a 文章编号:1009-3044(2016)19-0149-03bee colony algorithm for function optimization( bengbu navy petty office academy,bengbu 233012, china)在人工智能的遗传算法领域中,有许多算法是通过对一些社会性昆虫的模拟而产生的,通过模拟蚂蚁的行为而产生的蚁群算法就是基于群体的成功的优化算法,此方法在解决许多复杂的组合问题中是成功的,研究和发展的前景也很好[1]。

众所周知,蜜蜂和蚂蚁都是智能程度很高的物种,但目前为止,还很少有人试图模拟蜜蜂的生活过程并将其中好的智能模式运用于优化和搜索之中。

在本文中,我们就介绍和分析这种发展于蜜蜂的婚配过程的蜂群算法。

遗传算法是在达尔文的进化论和孟德尔的遗传学基础上提出的一种优化求解算法。

它通过对原始的基因组进行编码,再选择、交叉、变异等操作,进行整体性的信息交换,依据适者生存的原则,逐步淘汰种群差的特性。

遗传算法在函数优化问题上取得比较好的效果[2]。

本文提出了一种通过模拟蜜蜂的婚配过程而产生的基于二进制编码的蜂群算法。

并在函数优化问题上进行了仿真实验,实验结果证实了蜂群算法的有效性和可行性。

1 蜜蜂种群特点蜂群算法是受到对蜜蜂的婚配行为的研究的启发而提出的一种搜索优化算法[3]。

为了清楚地说明蜂群算法的原理,我们先大概地介绍一下蜜蜂的种群特点及婚配过程。

关于遗传算法的实验报告

关于遗传算法的实验报告

关于遗传算法的实验报告一、实验目的:理解和掌握遗传算法的应用及意义,能用一门自己擅长的语言实现遗传算法的基本功能,在此基础上进一步理解和巩固对遗传算法的重要,以便在今后的学习和工作中能有效的运用和借鉴!需要指出的是遗传算法并不是能保证所得到的就是最佳的答案但通过一定的方法可以将误差控制在一定的范围内!二、实验原理和题目:1.遗传算法是一种基于空间搜索的算法,它通过自然选择、遗传、变异等操作以及达尔文的适者生存的理论,模拟自然进化过程来寻找所求问题的答案。

其求解过程是个最优化的过程。

一般遗传算法的主要步骤如下:(1)随机产生一个确定长度的特征字符串组成的初始种群。

(2)对该字符串种群迭代地执行下面的步骤a和步骤b,直到满足停止准则为止:a计算种群中每个个体字符串的适应值;b应用复制、交叉和变异等遗传算子产生下一代种群。

(3)把在后代中表现的最好的个体字符串指定为遗传算法的执行结果,即为问题的一个解。

2.通过编码、设置种群、设置适应度函数、遗传操作、解码产生需要的解。

f(x)=x*sin(x)+1,x∈[0,2π],求解f(x)的最大值和最小值。

三、实验条件硬件:微型计算机。

语言:本实验选用的为C++语言。

四、实验内容:建造针对f(x)的遗传算法程序,然后进行运行求解。

五、实验步骤:1. 确定基本功能:本实验是实现f(x)的最大值和最小值的求解。

2. 对f(x)进行编码:用一个二进制矢量表示一个染色体,由染色体来代表变量x的实数值,这里精度取小数点后6位数,变量x的域长为2π,整个区间被分为2π*1000000个等长的区间。

由于2π*1000000在23位二进制数的表示范围呢,所以,编码长度为23位。

3. 设计适应度函数:由于要求f(x)的最值,所以适应度函数可根据f(x)做适当的改变。

最大值:f(x)=x*sin(x)+5;最小值:f(x)=1/(x*sin(x)+5 );4. 针对f(x)的设计并且实现遗传算法程序:遗传操作主要包括复制、交叉和变异。

遗传算法求解函数最大值最小值

遗传算法求解函数最大值最小值

遗传算法是一种模拟自然选择和遗传机制的优化搜索算法,它能够通过模拟生物进化的过程来寻找最优解。

在数学和计算领域,遗传算法被广泛应用于求解函数的最大值和最小值问题。

1. 遗传算法的基本原理遗传算法是一种基于裙体的优化算法,它模拟了自然界中的优胜劣汰和随机性变异的过程。

其基本原理包括遗传、变异、选择和适应度评价。

1.1 遗传:遗传算法通过模拟生物的交配过程来产生新的个体,其中将两个个体的染色体交叉并产生新的后代。

1.2 变异:遗传算法引入随机性的变异操作,以增加搜索空间的多样性,使算法不至于陷入局部最优解。

1.3 选择:个体的适应度评价后,根据一定的选择策略选择出部分个体作为下一代的种裙,通常适应度高的个体有更大的概率被选择。

1.4 适应度评价:遗传算法通过适应度函数对个体进行评价,以确定个体在种裙中的适应度。

适应度函数通常是需要优化的函数。

2. 遗传算法在求解函数最大值和最小值问题中的应用遗传算法作为一种全局搜索算法,具有寻找函数最大值和最小值的能力。

对于一个给定的函数,遗传算法能够在较短的时间内找到该函数的全局最优解。

2.1 函数最大值求解:对于函数的最大值求解问题,可以将函数的负值作为适应度函数,通过遗传算法来求解负值最小化的问题,从而达到求解函数最大值的目的。

2.2 函数最小值求解:对于函数的最小值求解问题,则可以直接将函数的值作为适应度函数,通过遗传算法来求解函数最小值问题。

3. 遗传算法在实际应用中的优势遗传算法作为一种全局搜索算法,在求解函数最大值和最小值问题中具有以下优势:3.1 并行性:遗传算法能够并行处理多个个体,从而加速搜索过程,尤其适合于复杂的高维优化问题。

3.2 全局搜索能力:遗传算法不容易陷入局部最优解,能够在较短的时间内找到函数的全局最优解。

3.3 适应性强:遗传算法能够适应不同类型的函数和问题,具有较强的通用性。

4. 遗传算法在求解函数最大值和最小值问题中的应用实例以下是一些实际应用中遗传算法在求解函数最大值和最小值问题中的应用实例:4.1 Rosenbrock函数最小值求解:Rosenbrock函数是一个经典的优化测试函数,遗传算法在求解Rosenbrock函数的最小值时具有良好的表现。

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

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

实验五:遗传算法求解函数最值问题实验一、实验目的使用遗传算法求解函数在及y的最大值。

二、实验内容使用遗传算法进行求解,篇末所附源代码中带有算法的详细注释。

算法中涉及不同的参数,参数的取值需要根据实际情况进行设定,下面运行时将给出不同参数的结果对比。

定义整体算法的结束条件为,当种群进化次数达到maxGeneration时停止,此时种群中的最优解即作为算法的最终输出。

设种群规模为N,首先是随机产生N个个体,实验中定义了类型Chromosome表示一个个体,并且在默认构造函数中即进行了随机的操作。

然后程序进行若干次的迭代,在每次迭代过程中,进行选择、交叉及变异三个操作。

1.选择操作首先计算当前每个个体的适应度函数值,这里的适应度函数即为所要求的优化函数,然后归一化求得每个个体选中的概率,然后用轮盘赌的方法以允许重复的方式选择选择N个个体,即为选择之后的群体。

但实验时发现结果不好,经过仔细研究之后发现,这里在x、y 取某些值的时候,目标函数计算出来的适应值可能会出现负值,这时如果按照把每个个体的适应值除以适应值的总和的进行归一化的话会出现问题,因为个体可能出现负值,总和也可能出现负值,如果归一化的时候除以了一个负值,选择时就会选择一些不良的个体,对实验结果造成影响。

对于这个问题,我把适应度函数定为目标函数的函数值加一个正数,保证得到的适应值为正数,然后再进行一般的归一化和选择的操作。

实验结果表明,之前的实验结果很不稳定,修正后的结果比较稳定,趋于最大值。

2.交叉操作首先是根据交叉概率probCross选择要交叉的个体进行交叉。

这里根据交叉参数crossnum进行多点交叉,首先随机生成交叉点位置,允许交叉点重合,两个重合的交叉点效果互相抵消,相当于没有交叉点,然后根据交叉点进行交叉操作,得到新的个体。

3.变异操作首先是根据变异概率probMutation选择要变异的个体。

变异时先随机生成变异的位置,然后把改位的01值翻转。

遗传算法试验报告

遗传算法试验报告

智能优化计算课程试验报告实验要求:用遗传算法解决下面函数的极小值问题:遗传算法的具体实施策略不限,最好用MATLAB,上交内容包括源程序和运行结果实验内容:目标函数是一个含有30维变量的复杂型超越函数,决定使用MA TLAB7.0下的遗传函数工具箱来寻找函数最小值。

一.函数编辑在m文件下编辑目标函数:function y =fun(x);y = zeros(size(x,1),1); %产生一个列向量,(种群数)*1,作为预留解空间[xSize, Dim] = size(x); %xSize:种群数; Dim:变量x的维数indices = repmat(1:Dim, xSize, 1); %生成函数中i的空间矩阵,(种群数)*(变量维数)y = sum(((x.^2) / 4000)')' - prod(cos(x ./ sqrt(indices))')' + 1; %函数表达式,此处均采用矩阵点乘的形式二.遗传算法参数设置通过gatool(遗传算法工具箱)设置参数,运行程序,选择合适参数。

Number of variables(变量维数):30Population size:100Initial range:[-600;600]Selection function (选择函数): tournament(锦标赛); tournament size:2Mutation function (变异函数): Uniform(); Rate:0.05Crossover function: Intermediate; Ratio: 0.05Generrations: 5000; Stall generations: Inf; Stall time limite: InfFitness function is vectorized: on其余均为工具箱默认参数。

三.运行程序将设置好参数的算法程序运行30次运行,最佳运行结果为:3.4937e-010x1~x30取值:1.0e-004 *-0.0097 0.0017 0.0587 -0.0250 0.0765 0.0391 -0.0824 0.0653 -0.0539 -0.3470 -0.1078 0.4388 0.0223 0.0363 0.0003 0.0228 -0.0481 -0.4491 -0.5006 -0.2514 0.0608 -0.1022 0.3454 0.11460.0768 -0.0203 0.0910 -0.0571 0.0065 -0.138450010001500200025003000350040004500500005001000GenerationF i t n e s s v a l ue Best: 3.4999e-010 Mean: 15.0886010203040506070809010005001000Fitness of Each Individual四.保存遗传算法程序将在工具箱中编辑好的算法导出为m 函数并保存:function [X,FVAL,REASON,OUTPUT,POPULATION,SCORES] = untitled%% This is an auto generated M file to do optimization with the Genetic Algorithm and % Direct Search Toolbox. Use GAOPTIMSET for default GA options structure.%%Fitness functionfitnessFunction = @fun;%%Number of Variablesnvars = 30;%Start with default optionsoptions = gaoptimset;%%Modify some parametersoptions = gaoptimset(options,'PopInitRange' ,[-600 ; 600 ]);options = gaoptimset(options,'PopulationSize' ,100);options = gaoptimset(options,'Generations' ,5000);options = gaoptimset(options,'StallGenLimit' ,Inf);options = gaoptimset(options,'StallTimeLimit' ,Inf);options = gaoptimset(options,'PlotInterval' ,30);options = gaoptimset(options,'SelectionFcn' ,{ @selectiontournament 2 }); options = gaoptimset(options,'CrossoverFcn' ,{ @crossoverintermediate 0.05 }); options = gaoptimset(options,'MutationFcn' ,{ @mutationuniform 0.05 });options = gaoptimset(options,'Display' ,'off');options = gaoptimset(options,'PlotFcns' ,{ @gaplotbestf });options = gaoptimset(options,'Vectorized' ,'on');%%Run GA[X,FVAL,REASON,OUTPUT,POPULATION,SCORES] = ga(fitnessFunction,nvars,options);以上结果亦可在m文件中直接运行获得。

Rosenbrock函数的极大值0-1编码的遗传算法

Rosenbrock函数的极大值0-1编码的遗传算法

%Rosenbrock函数的极大值0-1编码的GA算法%初始参数Size=80;G=100;CodeL=10;umax=2.048;umin=-2.048;E=round(rand(Size,2*CodeL)); %生成初始种群%主程序for k=1:1:Gtime(k)=k;for s=1:1:Sizem=E(s,:);y1=0;y2=0;%解码方法m1=m(1:1:CodeL);for i=1:1:CodeLy1=y1+m1(i)*2^(i-1);endx1=(umax-umin)*y1/1023+umin;m2=m(CodeL+1:1:2*CodeL);for i=1:1:CodeLy2=y2+m2(i)*2^(i-1);endx2=(umax-umin)*y2/1023+umin;F(s)=100*(x1^2-x2)^2+(1-x1)^2;end%****** Step 1 : 选择最优个体 ******BestJ(k)=max(F); %记录每一代中最大个体的函数值fi=F; %适应度函数[Oderfi,Indexfi]=sort(fi); %按照适应度大小排序Bestfi=Oderfi(Size); %Oderfi中最后一个即是最大的适应度BestS=E(Indexfi(Size),:); %记录每一代中最优个体的0-1编码bfi(k)=Bestfi; %记录每一代中最优个体的适应度%****** Step 2 : 选择与复制操作******fi_sum=sum(fi);fi_Size=(Oderfi/fi_sum)*Size; %计算个体相对适应度fi_S=floor(fi_Size); %对80个个体依据相对适应度进行划分等级kk=1;for i=1:1:Sizefor j=1:1:fi_S(i) %选择等级高的个体,等级越高被选次数越多TempE(kk,:)=E(Indexfi(i),:);kk=kk+1; %选择进入下一代个体的个数,显然不够80个个体endend%************ Step 3 : 交叉操作 ************pc=0.60;n=ceil(20*rand);for i=1:2:(Size-1)temp=rand;if pc>temp %交叉条件TempE(i,n:end)=E(i+1,n:end);TempE(i+1,n:end)=E(i,n:end);endendTempE(Size,:)=BestS; %最优个体保留E=TempE; %种群替换%************ Step 4: 变异操作 **************%pm=0.001;%pm=0.001-[1:1:Size]*(0.001)/Size; %自适应变异概率%pm=0.0; %没有变异pm=0.1; %较大的变异概率for i=1:1:Sizefor j=1:1:2*CodeLtemp=rand;if pm>temp %变异条件if TempE(i,j)==0TempE(i,j)=1;elseTempE(i,j)=0;endendendendTempE(Size,:)=BestS; %保留当代最优个体E=TempE; %种群替换end%*************** 结果输出 *****************Max_Value=BestfiBestSx1x2figure(1);plot(time,BestJ);xlabel('Times');ylabel('Best J');figure(2);plot(time,bfi);xlabel('times');ylabel('Best F');。

遗传算法函数优化程序设计报告

遗传算法函数优化程序设计报告
struct population //定义群体结构
{
int x[20];
double x1,x2;
double fit;
double sumfit;
}p[M];
population maxDivivual={0,0,0,0}; //最大适应值个体
void initial(population *); //初始化函数
存放从1到19的一个随机整数用来确定交叉的位置存放从0到m的一个随机且与当前pi中i不同的整数用来确定交叉的对象srandtime0
遗传算法函数优化程序设计报告
自研112班 麻世博 2201100387
题目:Rosenbrock函数的全局最大值计算。f(x1,x2) = 100 (x12-x2)2+ (1-x1)2;
cout<<"-------------------------"<<endl;
cout<<"群体大小:"<<M<<"迭代世代数:"<<T<<"交叉概率:"<<pc<<"变异概率:"<<pm<<endl;
cout<<"maxDivivual: "<<"x1:"<<maxDivivual.x1<<" x2:"<<maxDivivual.x2<<"值: "<<maxDivivual.fit<<endl;
void print(population *); //显示函数
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

华中师范大学计算机科学系
实验报告书
实验题目:用遗传算法求解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
绪论:
无约束的函数优化是应用范围广泛的一类函数优化问题,随着对这类问题逐渐深入的研究,到目前为止,人们已经提出了许多无约束最优化的方法,例如:导数的梯度法,牛顿法,共轭梯度法等多种方法。

本次实验通过遗传算法求解Rosenbrock函数的最大值,进一步对遗传算法的思想和过程有所了解,为以后相关领域的学习奠定基础。

Rosenbrock函数基本概念:
Rosenbrock函数是无约束最优化理论与方法中一个非常经典的检验问题。

它是衡量无约束算法优劣的一个重要工具,而最速下降法、共轭梯度法、牛顿法及拟牛顿法是4种经典的无约束优化的求解方法,通过分析Rosenbrock函数的性质, 对利用不同方法求解Rosenbrock问题的数值结果进行分析,有利于进一步理解无约束优化方法, 对它们各自不同的特性有更全面的掌握。

Rosenbrock函数算法流程图:
遗传算法简介:
遗传算法GA(ongenetic algorithms)是60年代中期,美国的Michigan大学的John Holland在Fraser和Bremermann等人的工作的基础上提出的位串编码技术。

这种编码既适合与变异又适合于交配(即杂交,交叉)操作,并且强调讲交配作为主要的遗传操作。

遗传算法的基本思想是基友Darwin进化论和Mendel遗传学说的。

操作对象是一群二进制串(称为染色体,个体)即种群(population)。

每个染色体都对应于问题的一个解。

从初始种群出发,采用基于适应值比例的选择策略在当前种群中选择个体,使用交叉和变异操作来产生下一代种群。

如此一代代的进化下去,直到满足期望的终止条件。

近年来,GA在组合优化求解,机器学习,人工生命等领域已显示了她的应用前景和潜力,通过对此次实验的学习,进一步深入理解了遗传算法的原理及过程,对以后的在相关领域的学习打下了基础。

基本概念:
遗传算法GA(ongenetic algorithms)操作的基本对象是染色体或个体(Chromosome),每个染色体是一个知识结构,代表求解问题的一个可能解,染色体通常用字符串来表示,若干长度的串称之为构成染色体的基因。

群体或种群(population)是由一组染色体所构成,他描述GA搜索的遗传空间,在搜索过程中,用适应度函数来评价每个染色体的优劣,其值越大(适应度大),相应染色体所代表的解越优,适应度函数的选择是能有效地指导搜索空间沿着面向优化参数组合方向逐渐逼近最佳参数组合,而不会导致不收敛或陷入局部最优。

基本操作:
编码(Encoding)操作是将问题解的表示变换遗传空间解的表示,即用字符串或位串构造染色体,其反向操作为解码(Decoding)。

选择(Selection)操作是从群体中选择出较适应环境的个体,这些选中的个体用于繁殖下一代,故有时也称这一操作为再生操作(Reproduction)。

选择用于繁殖下一代的个体时是根据个体对环境的适应度而确定其繁殖量的,故而有时也称非均匀再生(differential reproduction)。

交叉(Crossover)操作在选中用于繁殖下一代的个体中,对两个不同个体的相同位置的基因进行交换,从而产生新的个体。

变异(Mutationg)操作是在选中的个体中,对个体中的某些基因执行异向转化。

在串中,如果某位基因为1,产生变异时就是把它变成0;反之则由0变成1。

算法实现的步骤:
采用GA的实现步骤如下:
1.个体编码:用一定比特数的0,1二进制码对自变量进行编码形成基因码链,每一个码链代表一个个体;
2.产生初始的群体:产生初始群体的方法通常有两种:一种是完全随机的方法产生的,适合于对问题的解无任何先验知识的情况;另一种是将某些先验知识转变为必须满足的一组要求,然后在满足这些要求的解中再随机地选取样本,t=0;随机产生n个个体形成一个初始群
体Q(t),该群体代表优化问题的一些可能解的集合。

3.适应度评价函数:按编码规则,将群体Q(t)中的每一个个体的基因码所对应的自变量取值(Xi,Yi,Zi)代入目标函数,算出其函数值Fi,i=1,2,...,n,Fi越大,表示该个体有较高的适应度,更适合于f所定义的生存环境,适应度Fi为群体进化提供了依据;
4.选择:按一定概率从群体Q(t)中选出m个个体,作为双亲用于繁殖后代,产生新的个体加入下一个群体Q(t+1)中;
5.交叉(重组):对于选中的用于繁殖的每一对个体,选择一种交叉方法,产生新的个体;
6.变异:以一定概率Qm从群体Q(t+1)中随机选取若干个个体,对于选中的个体,进行变异;
7.对产生新一代的群体返回步骤3在进行评价,交叉,变异如此循环往复,使群体中个体的适应度和平均适应度不断提高,直至最优个体的适应度达到某一限制或最有个体的适应度和群体的平均适应度不再提高,则迭代过程收敛,算法结束。

遗传算法流程图如下:
实验结果:。

相关文档
最新文档