这是最近学习的第二个寻优算法,我查了查资料,据说速度很慢,网上有很多对其进行改进的优化算法。相比于黄金分割优化算法,它的优点是精度相对较高。
1. 代码实现思路
(注:这个老师没有具体讲,其中算法的判断条件是我网上找到的,思路也是自己按照自己想法写的,自取时请谨慎)
2. 具体代码
(1)Fibonacci算法
function[Optx,Opty,ValueRange,IteNum,OptTime]=opt_fibonacci(a0,b0,delta)
% fibonacci算法,速度较慢,但是精度比黄金分割算法高
% 关键步骤在fibonacci数列的构造
% 参数设置:delta--精度设置;[a,b]--初始搜索区间;区间更新为[A(i),B(i)];
% 输出为:Optx--寻优结果(最终区间的均值);Opty--优化函数的最优值;ValueRange--最优解所在区间;
% IteNum--迭代次数;OptTime--代码执行时间
% 插值点分别用u和v表示;
% 该代码需要在phi函数变化时进行修改
tic
% 1.构建fibonacci数列
[F,N]=Fibonacci(a0,b0,delta);
% 2. 寻优
A = zeros(N+1,1);
B = zeros(N+1,1);
u = zeros(N+1,1);
v = zeros(N+1,1);
A(1) = a0;
B(1) = b0;
for i = 1:N-2
u(i) = A(i)+(F(N-i-1)/F(N-i+1))*(B(i)-A(i));
v(i) = A(i)+(F(N-i)/F(N-i+1))*(B(i)-A(i));
if phi(u(i))<phi(v(i))
A(i+1) = A(i);
B(i+1) = v(i);
else
A(i+1) = u(i);
B(i+1) = B(i);
end
end
% 3. 结果输出
IteNum = i;
Optx = (A(i)+B(i))/2;
Opty = phi(Optx);
ValueRange = [A(i) B(i)];
toc;
OptTime = toc;
function[y]=phi(x)
%函数定义,根据我们的需求进行修改
y = 1-21.6*x-3*x.^2;
end
end
(2)Fibonacci数列构建代码
function[F,N]=Fibonacci(a1,b1,precision)
% Fibonacci序列的构造,可用于斐波那契优化算法
% 输出应用:Fn=F(N+1);n=N;
F(1) = 1;
F(2) = 1;
i = 2;
while (1/F(i))*(b1-a1)>precision
F(i+1) = F(i)+F(i-1);
i = i+1;
end
N = i-1;
end
-----------------------------------------------谦虚学习分割线------------------------------------------------------------
我本科电力专业的,所以代码可能写得不是那么好,如果大家使用过程中出现什么问题,欢迎不吝赐教!