一、算法原理
坐标轮换法亦称变量轮换法时一种求无约束最优化问题的降维方法.其迭代过程是沿不同的坐标方向轮换地进行搜索.
例 二维极值
设初始点为x0=[1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:
x01=x0+e1*a,式中e1=[0,1]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。
(通过进退法求得极值区间,黄金分割法求得最优步长);
;再换一个变量,同样进行一维搜索,得到最优点x02
x02=x0+e2*a,式中e1=[1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。
(通过进退法求得极值区间,黄金分割法求得最优步长);
;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。
三维极值
设初始点为x0=[1,1,1],先只改变一个变量,其他变量视为常数,进行一维搜索,得到最优点x01:
x01=x0+e1*a,式中e1=[1,0,0]为方向,a为待求步长。通过min f(x0+e1*a)求得最优步长。
(通过进退法求得极值区间,黄金分割法求得最优步长);
;再换一个变量,同样进行一维搜索,得到最优点x02
x02=x0+e2*a,式中e1=[0,1,0]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。
(通过进退法求得极值区间,黄金分割法求得最优步长);
;再换一个变量,同样进行一维搜索,得到最优点x03
x03=x0+e2*a,式中e1=[0,0,1]为方向,a为待求步长。通过min f(x0+e2*a)求得最优步长。
;如此继续下去,直到完成一个循环,即对n个变量都轮换完毕,得到最优点x。
二、算法流程
三、matlab程序
%% 坐标轮换
% syms x1 x2
f=@(x1,x2) x1.^2+x2.^2-x1*x2-10*x1-4*x2+60;
X=ZBLH(f,[0 0],1e-6,100)
function x=ZBLH(f,x0,eps,k)
x0 = x0';
m = length(x0);
n = 1;
syms alfa
while n < k
temp = x0; %作为一个中间变量
for i = 1:m
e=zeros(m,1);
e(i)=1;
x1 = temp + alfa*e;
f_alfa=matlabFunction(eval('f(x1(1),x1(2))'));
% d_alfa=solve(f_alfa);
[~,d_alfa]=huangjin(f_alfa,0,0.1,1000);
temp = temp + d_alfa*e;
end
x1 = temp;
if norm(x0 - x1) < eps
x = x1;
return;
end
x0 = x1;
end
end
function [result,x]=huangjin(f,x0,h0,n)
tol=1e-6;
[a,b]=Min_jintui(f,x0,h0);%进退法寻找搜索区间
x1=min(a,b);
x2=max(a,b);
i=1;
while i < n
%取中间值
a=x1+0.382*(x2-x1);
b=x1+0.618*(x2-x1);
fa=f(a);
fb=f(b);
% 判断fa fb大小,缩小区间
if fa < fb
x2=b;
else
x1=a;
end
if abs(x1-x2) < tol
result=f((x1+x2)/2);
x=(x1+x2)/2;
break;
end
i=i+1;
end
end
%进退法寻找搜索区间
function [a,b]=Min_jintui(f,x1,h0)
%f为函数句柄
%x1为初始点
%h0为步长
x2=x1+h0;
i=1;
if f(x2) < f(x1)
x3=x2+h0;
h=h0;
while f(x3) < f(x2)
x3=x2+h;
h=i*h;
i=i+1;
end
a=x1;
b=x3;
else
Temp=x1;
x1=x2;
x2=Temp;
h=-h0;
x3=x2+h;
while f(x3) < f(x2)
x3=x2+h;
h=i*h;
i=i+1;
end
a=x3;
b=x1;
end
end