zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于二进制粒子群算法的背包问题求解- 附代码

算法二进制代码 基于 求解 背包 粒子 问题
2023-09-14 09:06:11 时间

基于二进制粒子群算法的背包问题求解- 附代码


摘要:本文主要介绍二进制粒子群算法,并用其对背包问题进行求解。

1.二进制粒子群算法

在 PSO 算法中,每个优化问题的解都是粒子在搜索空间中的位置,粒子还有一个速度值决定它们飞翔的方向和距离,然后粒子群就追随当前的最优粒子在解空间中搜索。在搜索过程中,每个粒子到目前为止找到的自身的最优位置称为粒子的个体极值 p b e s t pbest pbest​​ ,所有粒子中的最优位置记为全局极值 g b e s t gbest gbest​​ 。设在一个 M M M​​维的搜索空间,粒子 i i i​​的位置表示为 X i = ( x i 1 , x i 2 , . . . , x i M ) X_i=(x_{i1},x_{i2},...,x_{iM}) Xi=(xi1,xi2,...,xiM)​​, 速 度 表 示 为 V i = ( v i 1 , v i 2 , . . . , v i M ) V_i=(v_{i1},v_{i2},...,v_{iM}) Vi=(vi1,vi2,...,viM)​​。粒子i 有一个被优化的函数决定的适应度值,将 X i X_i Xi​​代入目标函数计算出适应度值,根据该值的大小衡量 X i X_i Xi​​的优劣,在找到 p b e s t pbest pbest​​和 g b e s t gbest gbest​​之后,根据公式(1)和(2)来更新自身的速度和位置 。
v i m k + 1 = w v k m k + c 1 r 1 k ( p b e s t , i m k − x i m k ) + c 2 r 2 k ( g b e s t , i m k − x i m k ) (1) v_{im}^{k+1}=wv_{km}^k+c_1r_1^k(p_{best,im}^k-x_{im}^k)+c_2r_2^k(g_{best,im}^k-x_{im}^k)\tag{1} vimk+1=wvkmk+c1r1k(pbest,imkximk)+c2r2k(gbest,imkximk)(1)

x i m k + 1 = x i m k + v i m k + 1 (2) x_{im}^{k+1}=x_{im}^k+v_{im}^{k+1}\tag{2} ximk+1=ximk+vimk+1(2)

式中: x i m k + 1 x_{im}^{k+1} ximk+1​和 v i m k + 1 v_{im}^{k+1} vimk+1​分别为粒子 i i i​在第 k + 1 k+1 k+1​次迭代时在第 m m m​维空间的位置和速度; w w w​ 为惯性权重; c 1 , c 2 c_1,c_2 c1,c2​为加速因子,都是正实数; r 1 , r 2 r_1,r_2 r1,r2​ 为随机产生的一个介于[0,1]之间的随机数;
p b e s t , i m k p_{best,im}^k pbest,imk​为粒子 i i i 至第 k k k 次迭代为止在第 m m m 维空间找到的个体最优粒子位置; g b e s t , i m k g_{best,im}^k gbest,imk​为至第 k k k 次迭代为止在第 m m m​ 维空间找到的群体最优粒子位置。

上述 PSO 算法主要是针对于连续函数优化问题的。二进制粒子群算法中,将粒子每一维位置
x i m x_{im} xim和粒子最优的个体值都限定为 0 或 1 ,而对粒子的速度不加限制。根据速度大小来选择在粒子对应位置上为 0 或者 1 ,速度大一些,则表示对应位置选 1 的概率大,速度较小则意味着对应位置可能会选 0 。其基本公式如式(3)所示:
{ x i m k + 1 = 1 , r i m k + 1 < s i g m o i d ( v i m k + 1 ) x i m k + 1 = 0 , r i m k + 1 ≥ s i g m o i d ( v i m k + 1 ) (3) \begin{cases} x_{im}^{k+1}=1,r_{im}^{k+1}<sigmoid(v_{im}^{k+1})\\ x_{im}^{k+1}=0,r_{im}^{k+1}\geq sigmoid(v_{im}^{k+1}) \end{cases}\tag{3} {ximk+1=1,rimk+1<sigmoid(vimk+1)ximk+1=0,rimk+1sigmoid(vimk+1)(3)
式(3)中的 r i m k + 1 r_{im}^{k+1} rimk+1为随机产生的介于[0,1]之间的随机数为防止 s i g m o i d ( v i m k + 1 ) sigmoid(v_{im}^{k+1}) sigmoid(vimk+1)函数饱和,本文中将粒子的速度设定在[-4,4 ]范围内,对应的 s i g m o i d ( v i m k + 1 ) sigmoid(v_{im}^{k+1}) sigmoid(vimk+1)函数为:
s i g m o i d ( v i m k + 1 ) = { 0.98 , v i m k + 1 > 4 1 1 + e x p ( − v i m k + 1 ) , − 4 ≤ v i m k + 1 ≤ 4 − 0.98 , v i m k + 1 < − 4 (4) sigmoid(v_{im}^{k+1})=\begin{cases} 0.98,v_{im}^{k+1}>4\\ \frac{1}{1+exp(-v_{im}^{k+1})} ,-4\leq v_{im}^{k+1}\leq4\\ -0.98,v_{im}^{k+1}<-4 \end{cases}\tag{4} sigmoid(vimk+1)=0.98,vimk+1>41+exp(vimk+1)1,4vimk+140.98,vimk+1<4(4)

2.背包问题

背包问题的一般提法为:已知 n n n 个物品 s 1 , s 2 , . . . , s n s_1,s_2,...,s_n s1,s2,...,sn 的重量及其价值分别为 w j > 0 w_j >0 wj0 c j > 0 ( j = 1 , 2 , … , n ) c_j >0( j=1,2,…,n) cj0j1,2,,n背包的容量假设为 V > 0 V >0 V0​如何选择那些物品装入背包可使在背包的容量限制之内所装物品的总价值最大,引入变量 x j x_j xj
x j = { 1 , 物 品 放 入 背 包 0 , 否 则 (5) x_j=\begin{cases}1,物品放入背包\\ 0,否则\end{cases}\tag{5} xj={1,0,(5)
则该问题的数学模型为:
m a x ( ∑ j = 1 n ) c j x j (6) max(\sum_{j=1}^n)c_jx_j\tag{6} max(j=1n)cjxj(6)
约束条件:
{ ∑ j = 1 n w j x j ≤ V x j ∈ { 0 , 1 } , j = 1 , 2 , . . . , n (7) \begin{cases} \sum_{j=1}^nw_jx_j\leq V \\ x_j\in\{0,1\},j=1,2,...,n \end{cases} \tag{7} {j=1nwjxjVxj{0,1},j=1,2,...,n(7)

3.实验结果

背包问题的实验数据如下:

 C = [72,490,651,833,833,489,359,337,267,441,...
    70,934,467,661,220,329,440,774,595,98,424,...
    37,807,320,501,309,834,851,34,459,111,...
    253,159,858,793,145,651,856,400,...
    285,405,95,391,19,96,273,152,...
    473,448,231];
W = [438,754,699,587,789,...
    912,819,347,511,287,541,784,676,198,...
    572,914,988,4,355,569,144,272,531,...
    556,741,489,321,84,194,483,205,607,...
    399,747,118,651,806,9,607,121,...
   370,999,494,743,967,718,397,...
   589,193,369];
V = 11258;

二进制粒子群的参数如下:

%% 二进制粒子群求解
dim = length(C);%维度
pop = 50;%种群数量
MaxIter = 500;%迭代次数
Vmax = 4;%速度范围
Vmin = -4;%速度范围
fobj = @(x) fun(x,C,W,V);%适应度函数

最终结果:

请添加图片描述

背包存放结果为:0 0 1 1 1 0 0 1 0 1 0 1 0 1 0 0 0 1 1 0 1 0 1 1 1 1 1 1 0 1 0 0 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 1
总价值为:15955

4.参考文献

[1]李超文,何正友,张海平,高辉.基于二进制粒子群算法的辐射状配电网故障定位[J].电力系统保护与控制,2009,37(07):35-39.

[1]马慧民,叶春明,张爽.二进制改进粒子群算法在背包问题中的应用[J].上海理工大学学报,2006(01):31-34.

5.Matlab