粒子群优化,原理与Matlab实现

基本原理

  考虑每个迭代有 N N N个粒子(一般设置10 ~ 30个),每个粒子有 D D D个维度(视具体问题而定),则对每一个粒子的更新都应该是 D D D维度的:
{ x i = ( x i 1 , x i 2 , ⋯ x i D ) , i = 1 , 2 , ⋯   , N v i = ( v i 1 , v i 2 , ⋯ v i D ) , i = 1 , 2 , ⋯   , N \left\{ \begin{array}{l} {x_i} = \left( {{x_{i1}},{x_{i2}}, \cdots {x_{iD}}} \right),i = 1,2, \cdots ,N\\ {v_i} = \left( {{v_{i1}},{v_{i2}}, \cdots {v_{iD}}} \right),i = 1,2, \cdots ,N \end{array} \right. {xi=(xi1,xi2,xiD),i=1,2,,Nvi=(vi1,vi2,viD),i=1,2,,N

  速度的求解,以及新粒子的求解,如下所示:
{ v i ( t + 1 ) = w v i ( t ) + c 1 r 1 ( t ) [ p i ( t ) − x i ( t ) ] + c 2 r 2 ( t ) [ p g ( t ) − x i ( t ) ] x i ( t + 1 ) = x i ( t ) + v i ( t + 1 ) \left\{ \begin{array}{l} {v_i}(t + 1) = w{v_i}(t) + {c_1}{r_1}(t)\left[ {{p_i}(t) - {x_i}(t)} \right] + {c_2}{r_2}(t)\left[ {{p_g}(t) - {x_i}(t)} \right]\\ {x_i}(t + 1) = {x_i}(t) + {v_i}(t + 1) \end{array} \right. {vi(t+1)=wvi(t)+c1r1(t)[pi(t)xi(t)]+c2r2(t)[pg(t)xi(t)]xi(t+1)=xi(t)+vi(t+1)

其中, w w w为惯性权重,取值范围0.5 ~ 0.9; r 1 , r 2 r_1,r_2 r1,r2为0~1之间的随机数; c 1 c_1 c1为局部最优权重,取值范围0.1 ~ 2.0; c 2 c_2 c2为全局最优权重,取值范围0.1 ~ 2.0; p i p_i pi为局部最优解; p g p_g pg为全局最优解。

matlab源码

  使用粒子群算法对Rosenbrock问题进行求解。Rosenbrock函数是一个用来测试最优化算法性能的非凸函数,由Howard Harry Rosenbrock在1960年提出,也称为Rosenbrock山谷函数、Rosenbrock香蕉函数、香蕉函数。Rosenbrock函数的定义为:
f ( x , y ) = ( 1 − x ) 2 + 100 ( y − x 2 ) 2 f\left( {x,y} \right) = {\left( {1 - x} \right)^2} + 100{\left( {y - {x^2}} \right)^2} f(x,y)=(1x)2+100(yx2)2

matlab源码,自写代码

clc; clear;

% 参数设定
n_particles = 30;    % 粒子数量
n_iterations = 100;  % 迭代次数
dim = 2;             % Rosenbrock函数的维度为2
c1 = 2;              % 学习因子
c2 = 2;              % 学习因子
w = 0.9;             % 惯性权重
x_min = -5;          % 搜索空间的最小值
x_max = 5;           % 搜索空间的最大值
v_max = 0.1 * (x_max - x_min); % 最大速度

% 初始化粒子的位置和速度
particles = x_min + (x_max - x_min) .* rand(n_particles, dim);
velocities = -v_max + 2 * v_max .* rand(n_particles, dim);
p_best = particles; % 个体最优位置
p_best_score = inf(n_particles, 1); % 个体最优值
g_best = []; % 全局最优位置
g_best_score = inf; % 全局最优值

% 主循环
for iteration = 1:n_iterations
    for i = 1:n_particles
        % 计算粒子的适应度值
        fitness = (1 - particles(i, 1))^2 + 100 * (particles(i, 2) - particles(i, 1)^2)^2;

        % 更新个体最优
        if fitness < p_best_score(i)
            p_best(i, :) = particles(i, :);
            p_best_score(i) = fitness;
        end

        % 更新全局最优
        if fitness < g_best_score
            g_best = particles(i, :);
            g_best_score = fitness;
        end
    end

    % 更新粒子的速度和位置
    for i = 1:n_particles
        velocities(i, :) = w * velocities(i, :) + c1 * rand() * (p_best(i, :) - particles(i, :)) ...
            + c2 * rand() * (g_best - particles(i, :));
        velocities(i, :) = min(max(velocities(i, :), -v_max), v_max); % 限制速度
        particles(i, :) = particles(i, :) + velocities(i, :);
        particles(i, :) = min(max(particles(i, :), x_min), x_max); % 限制位置在搜索空间内
    end
end

% 输出结果
disp('全局最优位置:');
disp(g_best);
disp('全局最优值:');
disp(g_best_score);

在这里插入图片描述

matlab源码,调用particleswarm

% Rosenbrock函数
fun = @(x)(1 - x(1))^2 + 100 * (x(2) - x(1)^2)^2;

% 选项设定
options = optimoptions('particleswarm','SwarmSize',30,'MaxIterations',100);

% 搜索空间的边界
lb = [-5, -5]; % 下界
ub = [5, 5]; % 上界

% 使用particleswarm函数找到最小值
[x,fval] = particleswarm(fun,2,lb,ub,options);
% [x,fval,exitflag,output] = particleswarm(fun,2,lb,ub,options);

% 输出结果
disp('全局最优位置:');
disp(x);
disp('全局最优值:');
disp(fval);

在这里插入图片描述

matlab源码,自写代码+画图展示

clc;clear;
% 参数设定
n_particles = 30;    % 粒子数量
n_iterations = 100;  % 迭代次数
dim = 2;             % Rosenbrock函数的维度为2
c1 = 2;              % 学习因子
c2 = 2;              % 学习因子
w = 0.9;             % 惯性权重
x_min = -5;          % 搜索空间的最小值
x_max = 5;           % 搜索空间的最大值
v_max = 0.1 * (x_max - x_min); % 最大速度

% 初始化粒子的位置和速度
particles = x_min + (x_max - x_min) .* rand(n_particles, dim);
velocities = -v_max + 2 * v_max .* rand(n_particles, dim);
p_best = particles; % 个体最优位置
p_best_score = inf(n_particles, 1); % 个体最优值
g_best = []; % 全局最优位置
g_best_score = inf; % 全局最优值

% 用于绘图的Rosenbrock函数网格
x_range = x_min:0.1:x_max;
y_range = x_min:0.1:x_max;
[X, Y] = meshgrid(x_range, y_range);
Z = (1 - X).^2 + 100 * (Y - X.^2).^2;

% 创建GIF文件
gif_filename = 'N5_opt_PSO_self4.gif';

% 主循环
for iteration = 1:n_iterations
    fitness_values = zeros(n_particles, 1); % 用于存储每个粒子的适应度值
    for i = 1:n_particles
        % 计算粒子的适应度值
        fitness = (1 - particles(i, 1))^2 + 100 * (particles(i, 2) - particles(i, 1)^2)^2;
        fitness_values(i) = fitness; % 存储适应度值

        % 更新个体最优
        if fitness < p_best_score(i)
            p_best(i, :) = particles(i, :);
            p_best_score(i) = fitness;
        end

        % 更新全局最优
        if fitness < g_best_score
            g_best = particles(i, :);
            g_best_score = fitness;
        end
    end

    % 绘制Rosenbrock函数的三维图和粒子的位置
    figure(1);
    surf(X, Y, Z, 'EdgeColor', 'none', 'FaceAlpha', 0.5);
    hold on;
    scatter3(particles(:, 1), particles(:, 2), fitness_values, 'r*');
    title(['Iteration ', num2str(iteration)]);
    xlabel('x');
    ylabel('y');
    zlabel('Fitness');
    hold off;
    drawnow;

    % 获取当前图形的帧
    frame = getframe(1);
    im = frame2im(frame);
    [imind,cm] = rgb2ind(im,256);

    % 写入GIF文件
    if iteration == 1
        imwrite(imind,cm,gif_filename,'gif', 'Loopcount',inf, 'DelayTime',0.2);
    elseif iteration <= 5 || mod(iteration,5) == 0
        imwrite(imind,cm,gif_filename,'gif','WriteMode','append', 'DelayTime',0.2);
    end

    % 更新粒子的速度和位置
    for i = 1:n_particles
        velocities(i, :) = w * velocities(i, :) + c1 * rand() * (p_best(i, :) - particles(i, :)) ...
            + c2 * rand() * (g_best - particles(i, :));
        velocities(i, :) = min(max(velocities(i, :), -v_max), v_max); % 限制速度
        particles(i, :) = particles(i, :) + velocities(i, :);
        particles(i, :) = min(max(particles(i, :), x_min), x_max); % 限制位置在搜索空间内
    end
end

imwrite(imind,cm,gif_filename,'gif','WriteMode','append', 'DelayTime',2);  % 静止2秒

% 输出结果
disp('全局最优位置:');
disp(g_best);
disp('全局最优值:');
disp(g_best_score);

在这里插入图片描述

请添加图片描述

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
求解最优化问题一直是遗传算法的经典应用领域,但是对于不同的最优化问题,遗传算法往往要重新设计“交叉”、“变异”算子,甚至要开发新的进化操作;另外遗传算法不容易理解、操作复杂、大多数情况下效率比较低。所以,寻求新的解决最优问题的算法一直是研究热点。对约束优化问题的求解,已有许多算法被提出。传统的方法有梯度映射法、梯度下降法、惩罚函数法、障碍函数法等,但是单纯使用这些方法不是效率很低就是适用范围有限。而进化计算由于其求解过程不依赖于目标函数的解析性质,同时又能以较大的概率收敛于全局最优解,所以用进化算法求解约束优化问题已是一个很有意义的研究方向。用进化计算求解约束优化问题时,最基本的思想就是:首先设法把个体带入可行域,然后再在可行域内找到尽可能好的解。求解约束优化问题最困难的主要是对约束条件的处理。目前,使用最广泛的对约束条件的处理方法是惩罚函数法。基于惩罚函数的进化算法一般来说都包含有许多惩罚系数,在实际应用时,只有正确设置这些系数才可能获得可行解,而要获得适当的惩罚系数则需要大量的实验为基础。在科学实践、工程系统设计及社会生产和经济发展中还有一类很常见到优化问题:多目标优化问题,因此研究多目标优化问题具有十分重要的意义。由于多目标优化问题不存在唯一的全局最优解,所以求解多目标优化问题实际上就是要寻找一个解的集合。传统的多目标优化方法是将多目标问题通过加权求和转化为单目标问题来处理的。但是,这种方法要求对问题本身有很强的先验认识,难以处理真正的多目标问题。进化计算由于其是一种基于种群操作的计算技术,可以隐并行的搜索解空间中的多个解,并能利用不同解之间的相似性来提高其并发求解的效率,因此进化计算比较合求解多目标优化问题。 粒子群优化(Particle Swarm Optimization, PSO)经济论文www.youzhiessay.com。 算法是由Kennedy和Eberhart于1995年提出的一种优化算法。它是对生物群体的社会行为进行的一种模拟,它最早源于对鸟群觅食行为的研究。在生物群体中存在着个体与个体、个体与群体间的相互作用、相互影响的行为,这种行为体现的是一种存在于生物群体中的信息共享的机制。PSO算法就是对这种社会行为的模拟,即利用信息共享机制,使得个体间可以相互借鉴经验,从而促进整个群体的发展。 PSO算法和遗传算法(Genetic Algorithm,GA)类似,也是一种基于迭代的优化工具,系统初始化为一组随机解,通过某种方式迭代寻找最优解。但PSO没有GA的“选择”、“交叉”、“变异”算子,编码方式也比GA简单。并且很多情况下要比遗传算法更有效率,所以基于粒子群算法处理优化问题中的是一个很有意义的研究方向。由于PSO算法容易理解、易于实现,所以PSO算法发展很快。在函数优化、系统控制、神经网络训练等领域得到广泛应用。 因此,本文在PSO算法基础上对PSO算法处理优化问题的能力及基于PSO算法,毕业论文网www.594wm.com,求解约束优化问题和多目标优化问题进行了深入研究。主要体现在以下几个方面:第一、介绍了有关粒子群优化算法的背景知识,阐述了算法产生的基础。 接着讨论了粒子群优化算法的发展和基本原理,并给出了算法的流程。通过对算法公式和参数设置进行的综合分析以及和其它优化算法进行比较,给出了粒子群优化算法实际使用时的指导原则。并讨论了算法在一些领域中的成功应用。第二、就粒子群优化算法在求解最优化问题中的应用,对无约束和有约束最优化问题分别设计了基于粒子群优化算法的不同的求解方法。对于无约束优化问题,本文直接用目标函数作为适应度函数,采用实数编码。对于约束优化问题,本文采用一种惩罚函数作为粒子群优化算法的适应度函数。 对两种问题分别应用了不同的测试函数对其进行了测试,结果表明了粒子群优化算法求解最优化问题的可行性。第三、针对约束优化问题本文在引入了半可行域的概念的基础上提出了竞争选择的新规则,并改进了基于竞争选择和惩罚函数的进化算法的适应度函数。并且本文规定了半可行解性质:半可行解优于不可行解,但劣于可行解。在半可行域内个体可直接用目标函数来评价。第四、结合粒子群优化算法本身的特点,本文设计了选择算子对半可行域进行操作,从而提出了利用PSO算法求解约束优化问题的新的进化算法。 第五、由于多目标优化问题和单目标优化问题是有本质的区别的:前者一般是一组或几组连续解的集合,而后者只是单个解或一组连续的解,所以PSO算法不能直接应用于多目标优化问题。因此本文对PSO全局极值和个体极值选取方式做了改进,提出了最优解评估选取的PSO算法,用于对多目标优化问题的非劣最优解集的搜索。实验结果证明了算法的有效性。粒子群算法的收敛性、基于粒子群算法求解不连续、多可行域的约束优化问题、基于粒子群算法求解高维多目标优化问题是本文的后续研究工作。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值