📄 hj11.m
字号:
%HJ模式搜索的改进版
%主要改进在于对好点的搜索,模式移动不变
%改进,即使记录变化的量
tic
%x0=[-3;-1;-3;-1]; %初始点
%n=4; %参数个数n
x0=[-1.2;1.0];
n=2;
E=eye(n); %搜索方向
x=zeros(n,2*n); %搜索点
y=zeros(1,2*n); %d对应搜索点的值
h=1; %初始步长
l=1; %作为点间距离
yc=1; %初始值,
a=1.618; %步长放大因子
x1=x0;
e=0.00001; %截至精度
M=2000; %最大迭代次数
%best=0
%better=0
for i=1:n %2n个搜索方向,函数值
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
ybest=y(1); %最好点,初始化
ybetter=y(1); % 次好点
xbest=x(:,1);
xbetter=x(:,1);
for k=1:M
%if (l<e|yc<e)
if (h<e)
break;
end
for i=1:n %2n个搜索方向,函数值
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
%bes仅仅在开始时没有值,经过一轮迭代后,就不用重新赋值
%故不需要总赋值
%ybest=y(1); %最好点
%ybetter=y(1); % 次好点
%xbest=x(:,1);
%xbetter=x(:,1);
for i=2:2*n %查找最好点、次好点,并记录相应的函数值
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; %根据最好点和次好点新产生的点
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); %模式移动
yp=fm(xp);
if yp<ybest;
x1=xbest;
xbest=xp;
y1=ybest;
ybest=yp;
l=norm(xbest-x1); %点间距离
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;
%l=0.382*l;
h=0.382*l; %取0。382效果最好,或大或小,均不好
break;
else
a=0.5*a;
end
end
end
end
ybest
xbest
k
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -