粒子群算法和遗传算法求多元函数的最大值、最小值对比

本文详细介绍了粒子群算法和遗传算法在寻优问题中的应用。针对目标函数的最大值和最小值求解,粒子群算法通过初始化、速度和位置更新来迭代寻找最优解,而遗传算法则通过初始化、编码、选择、交叉和变异步骤实现。文章提供了一个具体案例,展示了如何使用粒子群算法分别求解目标函数的最大值和最小值,并给出了相应的代码实现。同时,简要提到了遗传算法的基本流程。
摘要由CSDN通过智能技术生成

目录

前言

1.粒子群算法寻优

1.1 求目标函数最大值

1.2 求目标函数最小值

2.遗传算法寻优


前言

个人认为粒子群算法和遗传算法思想都很接近,都是一个通过对比去寻找最优解的过程,如果对比我比你的"好",那么我便取代你的思想。

遗传算法的主要步骤为初始化、编码、通过比叫去选择和交叉以及变异几个过程。

粒子群算法的主要步骤为初始化、粒子速度和位置更新、通过比对极值更新几个过程。

Pi表示个体极值位置更新(所有粒子自己本身在迭代过程中搜索的位置,如:第i个粒子在迭代中的数据为Pi(i,:)),Pg表示群体极值位置(1个粒子),Xi表示当代种群所有粒子的位置。

注:应该先速度更新,再位置更新!

下面我们采用同一个例子对其求最大值和最小值的分析

1.粒子群算法寻优

由于粒子群需要初始化位置和速度,这里暂定位置范围/x自变量取值范围为[pi/2  10],速度[-0.5 0.5],这里采用动态惯性权重,推荐读者先把我的上篇文章进行阅读:

粒子群算法PSO求解最大值和最小值案例(超详细注释)_Mr. 邹的博客-CSDN博客

1.1 求目标函数最大值

适应度函数:

function y = fobj(x)
%x    输入粒子的位置
%y    输出粒子适应度值
y = -5*sin(x(1))*sin(x(2))*sin(x(3))*sin(x(4))*sin(x(5))-...
sin(5*x(1))*sin(5*x(2))*sin(5*x(3))*sin(5*x(4))*sin(5*x(5))+8;

主程序(运行文件):

clear all
clc
%参数
p = struct('popsize',50,'T',500,'c1',2,'c2',2,'w_init',0.9,'w_end',0.4,'vmax',0.5,'vmin',-0.5);
lb = pi/2;ub = 10;%位置范围
dim = 5;       %维度/变量个数
N = p.popsize; %种群大小/规模
T = p.T;       %迭代/搜索次数
c1 = p.c1;     %个体加速度因子
c2 = p.c2;     %群体加速度因子
% 初始化
v = rand(N,dim);%定义初始时刻粒子速度为0
%  v = p.vmax*rand(N,dim);%不定义为0也可以
x = (ub - lb)*rand(N,dim) + lb;%初始化粒子位置
for i = 1:N
    fitness(i) = fobj(x(i,:));%取目标函数为适应度函数
end
[bestf,index] = max(fitness);%求目标函数最小值,也是适应度函数的最小值
gbest = x(index,:);%全局最优的一个粒子位置
pbest = x;%pbest指当代所有粒子的位置
pfitness = fitness;%个体适应度值,即将所有粒子的位置代入适应度函数求得
% 迭代寻优
t = 1;
while t<T
    % 计算惯性因子
    w = (p.w_init - p.w_end)*(T-t)/T + p.w_end;
    for i = 1:N
        % 更新速度
        v(i,:) = w*v(i,:) + c1*rand*(pbest(i,:) - x(i,:)) + c2*rand*(gbest - x(i,:));
        Flagvmax = v(i,:)>p.vmax;
        Flagvmin = v(i,:)<p.vmin;
        v(i,Flagvmax) = p.vmax;
        v(i,Flagvmin) = p.vmin;
        % 更新位置
        x(i,:) = x(i,:) + v(i,:);
        Flagub = x(i,:)>ub;
        Flaglb = x(i,:)<lb;
        v(i,Flagub) = ub;
        v(i,Flaglb) = lb;
    end
    % 计算适应度值
    for i = 1:N
        fitness(i) = fobj(x(i,:));
    end
    % 更新gbest
    if bestf < max(fitness)
        [bestf,index] = max(fitness);
        gbest = x(index,:);
    end
    % 更新pbest
    for i = 1:N
        if pfitness(i) < fitness(i)
            pfitness(i) = fitness(i);
            pbest(i,:) = x(i,:);
        end
    end
    C(t) = bestf;
    t = t+1;
end
plot(C)

寻优结果:

1.2 求目标函数最小值

只需将上述程序稍作修改即可:

[bestf,index] = min(fitness);%求目标函数最小值,也是适应度函数的最小值




    if bestf > min(fitness)%如果前一代找到的最优解>当前种群中某个最小值,那么当前最优值取为该最小值
        [bestf,index] = min(fitness);



        if pfitness(i) > fitness(i)

2.遗传算法寻优

在上篇博客上已经介绍,这里不再复述了

遗传算法、遗传算法库函数ga和gamultiobj、遗传算法工具箱GADS实例介绍_Mr. 邹的博客-CSDN博客

  • 5
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
粒子群算法可以用于求解多元函数最大值问题。下面是一个简单的例子,展示如何使用粒子群算法求解多元函数最大值: 假设要求解多元函数为: ``` f(x1, x2) = -x1^2 - x2^2 + 2*x1 + 3*x2 ``` 其中,x1和x2是自变量。下面是使用粒子群算法求解函数的伪代码: ``` 初始化粒子群的位置和速度; while (未达到停止条件) do for each 粒子 i do 计算该粒子当前的适应度(即函数值); 如果该适应度优于历史最优适应度,则更新历史最优适应度和位置; 如果该适应度优于当前邻域的适应度,则更新邻域最优适应度和位置; 根据历史最优和邻域最优位置来更新速度和位置; end for end while 返回历史最优位置。 ``` 在上面的伪代码中,需要确定一些参数,例如粒子数量、速度范围、停止条件等。具体参数的设置需要根据实际情况和经验来确定。 下面是一个使用Matlab实现粒子群算法求解多元函数最大值的例子: ``` fun = @(x) -x(1)^2 - x(2)^2 + 2*x(1) + 3*x(2); % 要求解多元函数 nvars = 2; % 自变量的个数 lb = [-10,-10]; % 自变量的下限 ub = [10,10]; % 自变量的上限 options = optimoptions('particleswarm', 'SwarmSize', 100, 'MaxIterations', 200); % 设置粒子群算法的参数 [x,fval] = particleswarm(fun, nvars, lb, ub, options); % 调用粒子群算法求解最大值 ``` 在上面的例子中,我们使用Matlab自带的particleswarm函数来实现粒子群算法。我们设置粒子数量为100,最大迭代次数为200次。最后,使用particleswarm函数求解函数最大值,并将结果保存在x和fval中。 需要注意的是,粒子群算法求解结果可能不是全局最优解,而是局部最优解。如果需要求解全局最优解,可以尝试使用其他优化算法,例如遗传算法或者差分进化算法
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. 邹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值