优化问题的测试函数

当你提出了一种新的优化算法后,你需要和别人之前提出的算法来进行PK看你的算法有没有提高,那么如何证明你的算法比较优秀呢?
可以给把算法套在测试函数上,看谁的运行时间更短,求得测试函数的适应度更好

一、四种常见的测试函数

二、利用粒子群算法进行测试

用测试函数对算法进行测试的方法其实就是把目标函数改成我们想要的测试函数,下面我们来看一下代码中需要修改的地方

1.修改变量个数

以Sphere函数为例,这里的维数是30维,也就是变量个数。

n = 1000; % 粒子数量
narvs = 30; % 变量个数

2.修改上下界

根据Sphere函数的取值范围进行修改

vmax = 30*ones(1,30); % 粒子的最大速度
x_lb = -100*ones(1,30); % x的下界
x_ub = 100*ones(1,30); % x的上界

3.计算适应度

这里的适应度其实就是测试函数的值

fit = zeros(n,1);  % 初始化这n个粒子的适应度全为0
for i = 1:n  % 循环整个粒子群,计算每一个粒子的适应度
    fit(i) = Obj_fun3(x(i,:));   % 调用Obj_fun3函数来计算适应度
end 

4.绘制最佳适应度的变化图

figure(2) 
plot(fitnessbest)  % 绘制出每次迭代最佳适应度的变化图
xlabel('迭代次数');
disp('最佳的位置是:'); disp(gbest)
disp('此时最优值是:'); disp(Obj_fun3(gbest))

如图所示,我们这里的迭代次数设置为了1000,但其实我们在100次前就进行收敛了,后面的900次迭代都没什么用;
因此为了节省迭代的时间,需要对迭代方法进行改进,当迭代多次以后,最佳适应度没发生变化,就可以退出迭代了

三、改进--自动退出迭代循环

当粒子已经找到最佳位置后,再增加迭代次数只会浪费计算时间,那么我们能否设计一个策略,能够自动退出迭代呢?
我们可以设置一个计数器,每次计算出来最佳适应度后,都计算该适应度和上一次迭代时最佳适应度的变化量(取绝对值)。判断这个变化量和是否足够小,如果足够小,则说明这一次迭代并没有找到更好的值,因此则计数器加1;否则计数器清0。当计数器超过某个值,说明经历过多次迭代都没有找到更好的适应度,应该推出循环

1.代码实现

(1)变量初始化

Count = 0; % 计数器初始化为0
max_Count = 30;  % 最大计数值初始化为30
tolerance = 1e-6;  % 函数变化量容忍度,取10^(-6)

(2)添加临时变量

因为我们要比较新的最佳适应度与上一步的最佳适应度,但是新的最佳适应度在我们的算法中是已经被覆盖了的,所以我们要在其覆盖之前创造一个新的临时变量储存其数据
tem = gbest; % 将上一步找到的最佳位置保存为临时变量

(3)进入判断语句

delta_fit = abs(Obj_fun3(gbest) - Obj_fun3(tem));   % 计算相邻两次迭代适应度的变化量
    if delta_fit < tolerance  % 判断这个变化量和“函数变化量容忍度”的相对大小,如果前者小,则计数器加1
        Count = Count + 1;
    else
        Count = 0;  % 否则计数器清0
    end   
    if Count > max_Count  % 如果计数器的值达到了最大计数值
        break;  % 跳出循环
posted @ 2024-08-20 16:12  卢宇博  阅读(24)  评论(0编辑  收藏  举报