无约束最优化方法的一般步骤可以总结如下:
- 选择初始点,这一点越靠近局部极小点越好;
- 已取得某设计点,选择一个设计方向,沿此方向搜索,函数值需是下降的,是下降方向;
- 从出发,沿方向进行搜索,确定步长因子,得到新的设计点,并满足,具有这种性质的算法,称为下降算法。可以由一维搜索方法来确定最优步长因子;
- 若新点满足迭代计算终止条件,则停止迭代,作为,否则返回2步继续迭代搜索。
可以看出无约束优化算法的关键几点:初始值,方向设计,步长因子,终止条件。其中搜索方向是各种无约束方法的主要特征。
无约束优化法可以通过有无使用梯度信息分为直接法和间接方法。其中,直接法,即只需要计算,比较函数值来确定迭代方向和步长的方法。其优点是不需要函数有较好的解析性质。适用范围广,可靠性较高。而在工程实际中,函数形式往往比较复杂,不易求导数,直接法比较适合采用。缺点相对利用导数信息的间接法收敛速度慢。
坐标轮换法
坐标(变量)轮换法是最简单最易理解的直接方法。其由D‘esopo于1959年提出,其基本思想是把含有n个变量的优化问题轮换转为单变量的优化问题,即每次沿某一个坐标轴进行一维搜索的问题。算法步骤:
已知目标函数,终止限.
- 任选取初始点作为第一轮迭代的初始点,;
- 置搜索方向依次为:
- 按照下式求最优步长并进行迭代计算:
- 如果,即转第5步,如果,则转第3步;
- 收敛性准则为,如满足迭代终止条件,停止迭代,输出最优解;若不满足,则令转到第3步。
Algorithm 1 坐标轮换法
function [x_min,f_min] = CoordinateRotationMethod(func,x0,options)
if nargin<3
options.tol = 1e-12;
options.iterNum = 1000;
options.bracketMethod = '';
options.linearSrcMethod = '';
options.plot2.Flag = 0;
options.plot2.x = [];
options.plot2.y = [];
options.plot2.z = [];
end
tol = options.tol;
iterNum = options.iterNum;
plot2 = options.plot2;
if length(x0)~=2
plot2.Flag = 0;
end
x_min = x0;
f_min = func(x0);
E = eye(length(x0));
xk = x0;
f_pre = func(xk);
f = f_pre+1e10;
if plot2.Flag == 1
figure,subplot(1,2,1),axis equal, hold on;
contourf(plot2.x,plot2.y,plot2.z,30,'linestyle','-')
colormap('jet');
tempf =f_pre;
end
while(iterNum)
for i=1:1:length(x0)
d = E(:,i);
lamdaFuncH = @(lamda)(func(xk+lamda.*d));
[a,b,c] = bracketAdvanceBack(lamdaFuncH,0,0.01);
lamda = GoldSection(lamdaFuncH,a,c,1e-12);
xk1 = xk + lamda.*d;
f =func(xk1);
if plot2.Flag == 1
tempf = [tempf,f];
subplot(1,2,1),plot([xk(1),xk1(1)],[xk(2),xk1(2)],'-ro','LineWidth',2);
subplot(1,2,2),plot(tempf,'-b.','LineWidth',2); grid on;
axis([0,60,0,func(x0)]);
xlabel('Step');
ylabel('Objective Function Value');
pause(0.1)
end
xk = xk1;
iterNum = iterNum - 1;
end
if abs(f-f_pre)<tol||iterNum == 0
x_min = xk;
f_min = f;
break;
else
f_pre = f;
end
end
坐标轮换法逻辑简单,易于掌握,但计算效率低,对维数较高的优化问题更为突出,通常用于低维优化问题;此外,这种方法的收敛效果很大程度上取决于目标函数的等值线的形状:
等值线为椭圆族,其长短轴与坐标轴平行时,收敛很快,即的维度步数即可收敛;
当椭圆族的长短轴与坐标轴斜交时,迭代次数将大大增加,收敛速度慢;
当目标函数等值线出现“脊线”时,沿坐标轴方向搜索不能使得函数值有所下降,坐标轮换法在求优过程中将失败,这类函数对于坐标轮换法就是病态函数。