📄 hock.m
字号:
%HJ模式搜索的改进版
%主要改进在于对好点的搜索,模式移动不变
%改进,即使记录变化的量
x0=[-3;-1;-3;-1]; %初始点
n=4; %参数个数n
E=eye(n); %搜索方向
x=zeros(n,2*n); %搜索点
y=zeros(1,2*n); %d对应搜索点的值
h=1; %初始步长
l=1; %作为点间距离
yc=1; %初始值,
a=1.618; %步长放大因子
b=0.618;
x1=x0;
e=0.001; %截至精度
M=2000; %最大迭代次数
%best=0
%better=0
y1=fm(x1);
tic
for k=1:M
if (l<e|yc<e)
break;
end
while(1)
if b<e
break;
end
for i=1:n %2n个搜索方向,函数值
x2=x1+h*E(:,i);
if fm(x2)<y1
i=i-1;
break;
end
x2=x1-h*E(:,i);
if fm(x2)<y1
i=i-1;
break;
end
end
if i==n
b=0.618*b;
else
break;
end
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
%l=norm(xp-xbest); %只要模式移动100次还没停止,就退出
%if (l<e|abs(ybest-yp)<e)
% break;
%end
end
ybest
xbest
k
toc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -