粒子群算法理解+求解01背包问题

最近在学群体优化算法,做个学习笔记吧,本人蒟蒻,有不对的地方还情多多包涵。

1.粒子群算法的理解。

        粒子群算法是一种智能优化算法,模拟的是鸟内捕食行为。假设有一群鸟,在一个区域内觅食,这个区域内只有一个食物(最优解),但是每个鸟只知道自己距食物的距离,还有靠食物最近的鸟的距离(群体最优解),这样,他们的觅食行为就收到三个方面的约束。

     (1)距离食物最近的鸟的位置,这样所有的其他鸟都会向这只鸟靠拢,即所有点都会向当前全局最优解学习,靠拢。

     (2)光有全局最优解,最后得到的解最优也只能是初始状态的最优解,因此,每个鸟在靠近全局最优解的过程中也会计算自己与食物之间的距离,有可能在某一时刻,自己的距离比全局最优解还近,那么更新全局最优解,同时变更群体的学习方向。这就是个体最优解。

     (3)自身惯性。这是粒子继承先前速度的能力。一个较大的惯性有助于全局搜索,而一个较小的惯性有助于局部搜索。因此,在平常设计中,我们将惯性w设置为动态惯性,确保前期全局搜索能力强,但在后期局部搜索能力强,从而提高算法精度。

       所以,假设在一个D维的搜索空间中,由n个粒子组成的种群X=(X1,X2....Xn),其中第i个粒子向量表示为Xi=(Xi1,Xi2....Xin)^{^{T}},表示粒子在D维搜索空间的位置,第i个粒子的速度为Vi=(vi1,vi2,vi3.....vin)^{^{T}},个体极值为Pi=(pi1,pi2....pin)^{^{T}},种群极值为Pg=(pi1,pi2....pin)^{^{T}};

则速度更新公式为

V_{id}^{k+1}=wV_{id}^{k}+c1r1(P_{id}^{k}-X_{id}^{k})+c2r2(P_{gd}^{k}-X_{id}^{k})

X_{id}^{k+1}=X_{id}^{k}+V^{_{id}^{k+1}}

其中,w为惯性权重,k为迭代次数,Vid为粒子的速度;c1和c2为非负常数,也叫作加速度因子;r1和r2为【0,1】的分布随机数。

2.粒子群算法的求解过程。

这里我们以01背包问题为例来模拟粒子群算法。01背包问题是著名的非线性寻优问题,适应度由价格和体积决定,而质量是总约束条件。整个算法流程看代码吧,很清晰易懂的。

     

clear;
clc;
close all;

a=[95,4,60,32,23,72,80,62,65,46];        %物品体积
c=[55,10,47,5,4,50,8,61,85,87];          %物品价值
b=269;                                    %背包重量

%初始化种群
Dim=10;           %维度
xSize=20;         %种群数
maxgen=30;        %迭代次数
c1=0.7;
c2=0.7;           %加速因子
w=0.8;            %定义惯性因子
%
A=repmat(a,xSize,1);      %将a扩展成30*10的矩阵
C=repmat(c,xSize,1);      %c扩展为30*10的矩阵
x=round(rand(xSize,Dim)); %随机一个30*10的矩阵
v=rand(xSize,Dim)         %随机一个30*10的速度矩阵
xbest=zeros(xSize,Dim);   %单个粒子的初始最佳位置
fxbest=zeros(xSize,1);    %xbext的适应度
gbest=zeros(1,Dim);       %全局最优解
fgbest=0;                 %全局最优解的适应度
%
%寻找粒子群最优位置和单个粒子
iter=0;
while iter<maxgen
    iter=iter+1;
    fx=sum((C.*x)');         %粒子适应度,即背包内物品的价格
    sx=sum((A.*x)');         %限制函数,背包内物品的体积
    for i=1:xSize
        if sx(i)>269
            fx(i)=0;         %超过体积,适应度为0
        end
    end
    for i=1:xSize
        if fxbest(i)<fx(i)   %当粒子适应度大于最佳适应度时,替代
            fxbest(i)=fx(i);
            xbest(i,:)=x(i,:);
        end
    end
    if fgbest<max(fxbest)
        [fgbest,g]=max(fxbest);
        gbest=xbest(g,:)     %当存在粒子的最佳适应度fxbext(i)大于种群最佳适应度fgbext(i)时,替代
    end
    for i=1:xSize
        if x(i,:)==gbest
            x(i,:)=round(rand(1,Dim));     %当某个粒子的位置为最佳位置时,重新赋值,以防止陷入局部最优解
        end
    end
    R1=rand(xSize,Dim);
    R2=rand(xSize,Dim);
    v=v*w+c1*R1.*(xbest-x)+c2*R2.*(repmat(gbest,xSize,1)-x);%速度迭代公式产生新的速度
    x=x+v;          
    for i=1:xSize   %更新粒子群的位置
        for j=1:Dim
            if x(i,j)<0.5
                x(i,j)=0;
            else x(i,j)=1;   %粒子的位置只有(0,1)两种状态
            end
        end
    end
end

fgbest
sgbest=sum((a.*gbest)')
disp(gbest);

  最后的结果中,gbest的结果,0代表没选,1代表选。

  • 5
    点赞
  • 78
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
粒子群算法(Particle Swarm Optimization, PSO)是一种启发式优化算法,常用于求解优化问题。对于 01 背包问题,可以将每个粒子看作一个可行解,粒子的位置表示背包中各个物品的选择情况,速度表示粒子在搜索空间中移动的方向和速度。粒子的适应度函数即为背包问题的价值函数。 具体实现步骤如下: 1. 初始化粒子群,随机生成一组初始解。 2. 计算每个粒子的适应度函数值,即背包问题的价值函数。 3. 找出当前粒子群中的最优解和全局最优解。 4. 根据当前的最优解和全局最优解来更新每个粒子的速度和位置。 5. 重复执行步骤 2~4,直到达到设定的停止条件。 PSO 算法的更新公式如下: $$v_{i,j} = wv_{i,j} + c_1r_1(p_{i,j}-x_{i,j}) + c_2r_2(g_j-x_{i,j})$$ $$x_{i,j} = x_{i,j} + v_{i,j}$$ 其中,$v_{i,j}$ 表示第 $i$ 个粒子在第 $j$ 个维度上的速度,$x_{i,j}$ 表示第 $i$ 个粒子在第 $j$ 个维度上的位置,$p_{i,j}$ 表示第 $i$ 个粒子历史最优位置,$g_j$ 表示全局最优位置,$r_1$ 和 $r_2$ 是两个随机数,$c_1$ 和 $c_2$ 是两个常数,$w$ 是惯性权重,可以逐渐减小以增加搜索的局部性。 对于 01 背包问题,可以将每个粒子的位置表示为一个 0/1 数组,表示每个物品是否被选择。每次更新位置时,需要保证每个粒子的位置都是合法的,即背包容量不超过限制。可以通过惩罚函数的方式来保证位置的合法性,将超出背包容量限制的位置的适应度函数值设为一个极小值。 PSO 算法的优点是易于实现,收敛速度快,但也存在着过早收敛和局部最优解等问题。可以通过调整算法的参数和增加多样性来解决这些问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值