最优化原理及应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“最优化原理及应用”
2008200388 姚远1.用C语言,或者Matlab, 或者Fortran等编写一个完整的Simulated Annealing 算法和Genetic 算法的优化程序。
解: 本题采用Matlab语言编写一个完整的SA算法优化程序。在该程序中选用的代价函数为:22
()sin(( 1.5))(6)3
=-+--,初始的C0=1000,每一个阶段的
f x x x
Lk选为20,接受概率设为0.6,迭代的终止条件为e<0.00001(e=1F F
-)。初始值0x的选取范围为[]
-,每次迭代的扰动x
10,10
∇=6。C=C0/k。
f x的趋势如下图所示:
()
经过SA算法得出的结果为:x1=5.6682 f(x)=-3.8854。
程序如下:
%退火算法
clear all
clc
C0=1000;
x0=20*rand(1,1)-10; %取初始值
k=0;
Lk=20;
F=sin((x0-1.5)^2)+(x0-6)^2-3; %代价函数delta_x=6; %扰动
e=1;
epsilon=0.6; %接受概率
i=1;
while (e>0.00001)
k=k+1;
C=C0/k;
for(i=1:Lk)
w=2*rand(1,1)-1;
x1=x0+w*delta_x; %产生一个x1
F1=x1^4-x1^3-15*x1^2+1;
delta_f=F1-F;
e=abs(delta_f);
if (F1 x0=x1; F=F1; X(i)=x1; i=i+1; else prob=exp(-delta_f/C); if (prob>epsilon) x0=x1; F=F1; X(i)=i+1; end end end end x0 F 下面为采用遗传算法的优化程序。该程序中的代价函数与上面的SA算法所用的一致。设定变量的二进制码链长度为10,基因库中的二进制码链个数为10。自变量的取值区间为[] 0,10,设定遗传算法的迭代次数为500。在每次迭代保留基因的选择中分别采用了均值法和轮盘赌的方法,在保留、交换和异化的过程中每次都将最好的基因保留在基因库的最后一行,即精英操作。 经过GA算法得出的结果为:x1=5.6696 f(x)=-3.8851。 从图中我们可以看出SA和GA算法均找到了该代价函数的最小值点。在运行的过程中GA的速度要明显快于SA。 程序如下: %遗传算法 % F=sin((x-1.5)^2)+(x-6)^2-3; 最优化问题的代价函数 % Q=1000-( sin((x-1.5)^2)+(x-6)^2-3); 遗传算法中定义的fitness clc clear all num=10; length=10; total=2^(length)-1; min=-5; %取值区间的长度 max=5; G=100; genome=round(rand(num,length)); %定义自变量的随机二进制编码,长度为length for (k=1:G) X=zeros(1,num); %二进制转化为十进制 for(i=1:num) for(j=length:-1:1) X(i)=X(i)+genome(i,j)*2^(length-j); end X(i)=X(i)/total*(max-min)+min; end for(i=1:num) %计算各变量的fitness Q(i)=1000-(sin((X(i)-1.5)^2)+(X(i)-6)^2-3); end [order,location]=sort(Q); bestgene=location(num); %最好的基因位置 BEST(k,:)=genome(bestgene,:); %最好的基因 % %保留 % q=sum(Q); % vector=(Q/q)*num; % vector=floor(vector); %将品质因数大于均值的gene选出来,保留到下次% j=1; % for (i=1:num) % if (vector(i)==1) % geneupdate(j,:)=genome(i,:); % j=j+1; % end % end % geneupdate(num,:)=BEST(k,:); %保留%使用轮盘赌的筛选方法 q=sum(Q); selectvariable=ceil(q)*rand(1,1); j=1; while (1) a=0; i=1; a=a+Q(i); while (1) if(a i=i+1; a=a+Q(i); else geneupdate(j,:)=genome(i,:); j=j+1; break; end end if(j==num) break; end end geneupdate(num,:)=BEST(k,:);