這週上完最優化算法,又跑去問了問老師Dogleg算法上的疑問,應該說是解決了上篇日誌《DoglegMethod——“狗腿”算法(上)》的疑問,也糾正了我對於信賴域方法的一些錯誤的看法。
DoglegMethod——“狗腿”算法(上)的算法是錯誤的,因爲對信賴域方法的理解就有問題,雖然我覺得那個算法也是合理的,也是可以做最優解搜索的,a*=0.995其實就是做一個信賴域的收縮,但不是跟Dogleg一致的,下面給出Dogleg的真正算法,Dogleg是信賴域章節的算法,所以對於信賴域的更新部分肯定少不了。(僅僅修改Dogleg.m中while循環的部分,也就是迭代部分)
while iter < maxiter
rey = [rey, f(x)];
rex1 = [rex1, x(1)];
rex2 = [rex2, x(2)];
if sum(abs(g(x))) < 0.00001
break;
end
iter = iter + 1;
du = -g(x)' * g(x) * g(x) / (g(x)' * B(x) * g(x));
dB = -B(x)^-1 * g(x);
a = 2;
if du'*du > trustRegionBound*trustRegionBound;
a = trustRegionBound / sqrt((du'*du));
else if dB'*dB > trustRegionBound*trustRegionBound
a = sqrt((trustRegionBound*trustRegionBound - du'*du) / ((dB-du)'*(dB-du))) + 1;
end
end
if a < 1
d = a * du;
else
d = du + (a - 1) * (dB - du);
end
%更新信賴域
p = (f(x)-f(x+d))/(q(x,zeros(2,1))-q(x,d));
if p > 0.75 && sqrt(abs(d'*d) - trustRegionBound) < 0.001
trustRegionBound = min(2 * trustRegionBound, 10000);
else if p < 0.25
trustRegionBound = sqrt(abs(d'*d)) * 0.25;
end
end
if p > 0
x = x + d;
end
end
大家可以參考袁亞湘老師的《最優化理論與方法》,裏面講的很清楚,不得不感嘆老書寫的就是好。但是這個算法我覺得還是有很多問題的,之後我會在(下)篇中介紹我發現的問題,或者說是我程序的問題。