?? hjr.m
字號(hào):
%HJ模式搜索的改進(jìn)版
%主要改進(jìn)在于對(duì)好點(diǎn)的搜索,模式移動(dòng)不變
%改進(jìn),即使記錄變化的量
%采用隨機(jī)產(chǎn)生點(diǎn)來(lái),搜索‘好點(diǎn)’
x0=[-3;-1;-3;-1]; %初始點(diǎn)
n=4; %參數(shù)個(gè)數(shù)n
%E=eye(n); %搜索方向
x=zeros(n,2*n); %搜索點(diǎn)
y=zeros(1,2*n); %d對(duì)應(yīng)搜索點(diǎn)的值
h=1; %初始步長(zhǎng)
l=1; %作為點(diǎn)間距離
yc=1; %初始值,
a=1.618; %步長(zhǎng)放大因子
x1=x0;
e=0.00000001; %截至精度
M=2000; %最大迭代次數(shù)
%best=0
%better=0
E=rand(n,2+n)-0.5; %隨機(jī)產(chǎn)生2n個(gè)點(diǎn)
for i=1:2+n
x(:,i)=x1+h*E(:,i);
y(i)=fm(x(:,i));
end
ybest=y(1); %最好點(diǎn)
ybetter=y(1); % 次好點(diǎn)
xbest=x(:,1);
xbetter=x(:,1);
tic
for k=1:M
if (l<e|yc<e)
break;
end
%for i=1:n %2n個(gè)搜索方向,函數(shù)值
% x(:,2*i-1)=x1+h*E(:,i);
% x(:,2*i)=x1-h*E(:,i);
% y(2*i-1)=fm(x(:,2*i-1));
% y(2*i)=fm(x(:,2*i));
%end
E=rand(n,2+n)-0.5; %隨機(jī)產(chǎn)生2n個(gè)點(diǎn)
for i=1:2+n
x(:,i)=x1+h*E(:,i);
y(i)=fm(x(:,i));
end
%ybest=y(1); %最好點(diǎn)
%ybetter=y(1); % 次好點(diǎn)
%xbest=x(:,1);
xbetter=x(:,1);
for i=2:2+n %查找最好點(diǎn)、次好點(diǎn),并記錄相應(yīng)的函數(shù)值
if y(i)<ybetter
if y(i)<ybest
ybetter=ybest;
xbetter=xbest;
ybest=y(i);
xbest=x(:,i);
else
ybetter=y(i);
xbetter=x(:,i);
end
end
end
%xtemp=xbest+xbetter; %根據(jù)最好點(diǎn)和次好點(diǎn)新產(chǎn)生的點(diǎn)
%ytemp=fm(xtemp);
%if ytemp<ybest
% xbest=xtemp;
%end
j=0;
while(j<10*n)
%for j=1:100
j=j+1;
xp=xbest+a*(xbest-x1); %模式移動(dòng)
yp=fm(xp);
if yp<ybest;
x1=xbest;
xbest=xp;
y1=ybest;
ybest=yp;
l=norm(xbest-x1); %點(diǎn)間距離
yc=abs(ybest-y1); %y的改變量
%l=norm(xp-xbest);
%if (abs(ybest-yp)<e)
% break;
% end
else
%l=norm(xp-xbest);
if (l<e|yc<e)
break;
end
if a<=0.3
a=1.618;
x1=xbest;
%h=0.382*h;
h=0.5*l;
break;
else
a=0.5*a;
end
end
end
%l=norm(xp-xbest); %只要模式移動(dòng)100次還沒(méi)停止,就退出
%if (l<e|abs(ybest-yp)<e)
% break;
%end
end
tic
ybest
xbest
k
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -