以下代码使用 PSO 算法进行优化,并过滤重复的最优解,并将结果存储到矩阵中。

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,:));

代码解释如下:

  1. 设置参数

    • np: 粒子数量
    • maxiter: 最大迭代次数
    • bounds: 搜索范围
    • eps: 精度,用于判断两个数是否相等
  2. 定义矩阵

    • glob: 存储搜索到的最优解的矩阵,初始值为全零矩阵
    • count: 记录已经搜索到的最优解的个数,初始值为0
  3. 循环搜索

    • 使用 for 循环进行 1000 次 PSO 搜索
    • 每次搜索后,使用 if 语句判断当前最优解是否已经存在于 glob 矩阵中
      • all(abs(glob(1:count,1) - xopt) > eps | ... abs(glob(1:count,2) - yopt) > eps | ... abs(glob(1:count,3) - fopt) > eps) 使用 all 函数和 | 运算符高效地判断三个数是否都与已有解不同
  4. 存储结果

    • 如果最优解不存在于 glob 矩阵中,则将其存入矩阵
    • count 计数器加 1
  5. 输出结果

    • 使用 disp 函数输出 glob 矩阵,其中包含所有不重复的最优解

注意:

  • 代码中假设 PSO 函数已定义,用于执行粒子群优化算法
  • @Shubert 代表目标函数,需根据具体情况替换
  • 该代码使用 all 函数和 | 运算符判断最优解是否重复,这是一种高效的方法,可以避免使用循环逐个判断。

该代码可以帮助您在使用 PSO 算法进行优化时,过滤重复的最优解,并存储搜索结果。您可以根据实际情况调整参数和代码,以满足您的需求。


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

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