以下是代码示例:

np = 20;
maxiter = 50;
bounds = [-10, 10; -10, 10];
eps = 1e-6;

glob = zeros(1000, 3);
count = 0;

for i = 1:1000
    [xopt, yopt, fopt] = PSO(@Shubert, np, maxiter, bounds);
    if all(abs(glob(1:count,1) - xopt) > eps | ...
           abs(glob(1:count,2) - yopt) > eps | ...
           abs(glob(1:count,3) - fopt) > eps)
        count = count + 1;
        glob(count,:) = [xopt, yopt, fopt];
    end
end

disp(glob(1:count,:));

解释一下代码:

  • 前三行是设置参数,分别是粒子个数、最大迭代次数、搜索范围。
  • 第四行是设置精度,用于判断两个数是否相等。
  • 第五行定义了一个矩阵glob,用于存储搜索到的最优解。初始时矩阵中所有元素都是0,因为还没有搜索到任何解。
  • 第六行定义了一个计数器count,用于记录已经搜索到的最优解的个数,初始值为0。
  • 从第7行开始,使用一个循环来进行1000次PSO搜索。
  • 在每一次PSO搜索后,判断当前的最优解是否已经在glob矩阵中存在。如果不存在,就将它存入矩阵中。
  • 最后使用disp函数将glob矩阵输出。

需要注意的是,在判断最优解是否已经存在时,使用了all函数和|运算符,这是一种比较高效的方法,可以避免使用循环来逐个判断


原文地址: https://www.cveoy.top/t/topic/cfxD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录