最优化原理及应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,:);

相关文档
最新文档