背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码

一、背包问题

1.1背包问题描述

背包问题(Knapsack Problem,KP)是一种重要的组合优化问题,在生活的许多领域都有着十分广泛的应用。背包问题可以描述为:给定一个背包和n种物品,其中,背包的容量为 V V V ,第i 种物品的质量为 c i c_{i} ci ,价值为 p i p_{i} pi ,如何通过物品选择,使得装入背包中的物品总价值最大。其数学模型如下:
f = max ⁡ ∑ i = 1 n p i x i  s.t.  ∑ i = 1 n c i x i ≤ V , i = 1 , 2 , … , n x i = 0 , 1 \begin{array}{ll} & f=\max \sum_{i=1}^{n} p_{i} x_{i} \\ \text { s.t. } & \sum_{i=1}^{n} c_{i} x_{i} \leq V, i=1,2, \ldots, n \\ & x_{i}=0,1 \end{array}  s.t. f=maxi=1npixii=1ncixiV,i=1,2,,nxi=0,1

1.2背包问题测试集

选取9个经典的背包问题测试集,下表中, c c c为物品的质量, p p p为物品的价值, V V V为背包的最大容量。
背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第1张图片
参考文献:
[1]耿亚,吴访升.基于粒子群-模拟退火算法的背包问题研究[J].控制工程,2019,26(05):991-996.DOI:10.14107/j.cnki.kzgc.161767.

二、蜣螂优化算法

蜣螂优化算法(Dung beetle optimizer,DBO)由Jiankai Xue和Bo Shen于2022年提出,该算法主要受蜣螂的滚球、跳舞、觅食、偷窃和繁殖行为的启发所得。
在这里插入图片描述

2.1蜣螂滚球

(1)当蜣螂前行无障碍时,蜣螂在滚粪球过程中会利用太阳进行导航,下图中红色箭头表示滚动方向
在这里插入图片描述
本文假设光源的强度会影响蜣螂的位置,蜣螂在滚粪球过程中位置更新如下:

x i ( t + 1 ) = x i ( t ) + α × k × x i ( t − 1 ) + b × Δ x , Δ x = ∣ x i ( t ) − X w ∣ \begin{aligned} x_{i}(t+1) &=x_{i}(t)+\alpha \times k \times x_{i}(t-1)+b \times \Delta x, \\ \Delta x &=\left|x_{i}(t)-X^{w}\right| \end{aligned} xi(t+1)Δx=xi(t)+α×k×xi(t1)+b×Δx,=xi(t)Xw
其中, t t t表示当前迭代次数, x i ( t ) x_{i}(t) xi(t)表示第 i i i次蜣螂在第t次迭代中的位置信息, k ∈ ( 0 , 0.2 ] k∈(0,0.2] k(0,0.2]为扰动系数, b b b ( 0 , 1 ) (0,1) (0,1) 之间的随机数, α \alpha α取 -1 或 1 , X w X^{w} Xw表示全局最差位置, Δ x \Delta x Δx用于模拟光的强度变化。
其中, α \alpha α的取值采用算法1:
在这里插入图片描述

(2)当蜣螂遇到障碍物无法前进时,它需要通过跳舞来重新调整自己,以获得新的路线。本文使用切线函数来模仿跳舞行为,以此获得新的滚动方向,滚动方向仅考虑为 [ 0 , π ] [0,π] [0,π]之间。
在这里插入图片描述
蜣螂一旦成功确定新的方向,它应该继续向后滚动球。蜣螂的位置更新如下:
x i ( t + 1 ) = x i ( t ) + tan ⁡ ( θ ) ∣ x i ( t ) − x i ( t − 1 ) ∣ x_{i}(t+1)=x_{i}(t)+\tan (\theta)\left|x_{i}(t)-x_{i}(t-1)\right| xi(t+1)=xi(t)+tan(θ)xi(t)xi(t1)
其中, θ \theta θ为偏转角,其取值为 [ 0 , π ] [0,π] [0,π],采用算法2:
在这里插入图片描述

2.2蜣螂繁殖

在这里插入图片描述

在自然界中,雌性蜣螂将粪球被滚到适合产卵的安全地方并将其隐藏起来,以此为后代提供一个安全的环境。受此启发,因而提出了一种边界选择策略以此模拟雌性蜣螂产卵的区域:
L b ∗ = max ⁡ ( X ∗ × ( 1 − R ) , L b ) U b ∗ = min ⁡ ( X ∗ × ( 1 + R ) , U b ) \begin{array}{l} L b^{*}=\max \left(X^{*} \times(1-R), L b\right) \\ U b^{*}=\min \left(X^{*} \times(1+R), U b\right) \end{array} Lb=max(X×(1R),Lb)Ub=min(X×(1+R),Ub)
其中, X ∗ X^{*} X表示当前最优位置, L b ∗ L b^{*} Lb U b ∗ U b^{*} Ub分别表示产卵区的下限和上限, R = 1 − t / T m a x R=1−t/T_{max} R=1t/Tmax T m a x T_{max} Tmax表示最大迭代次数, L b Lb Lb U b Ub Ub分别表示优化问题的下限和上限。
雌性蜣螂一旦确定了产卵区,就会选择在该区域育雏球产卵。每只雌性蜣螂在每次迭代中只产生一个卵,可以看出,产卵区的边界范围是动态变化的,主要由R值决定。因此,育雏球的位置在迭代过程中也是动态的,其定义如下:
B i ( t + 1 ) = X ∗ + b 1 × ( B i ( t ) − L b ∗ ) + b 2 × ( B i ( t ) − U b ∗ ) B_{i}(t+1)=X^{*}+b_{1} \times\left(B_{i}(t)-L b^{*}\right)+b_{2} \times\left(B_{i}(t)-U b^{*}\right) Bi(t+1)=X+b1×(Bi(t)Lb)+b2×(Bi(t)Ub)
其中, B i ( t ) B_{i}(t) Bi(t)表示第t次迭代中第 i个育雏球的位置信息, b 1 b_{1} b1 b 2 b_{2} b2均为1×D的随机向量,D表示优化问题的维度。
产卵区的选择如算法3所示:
在这里插入图片描述

2.3蜣螂觅食

在这里插入图片描述
雌性蜣螂所产的卵会逐渐长大,一些已经成熟的小蜣螂会从地下出来寻找食物,小蜣螂的最佳觅食区建模如下:
L b b = max ⁡ ( X b × ( 1 − R ) , L b ) U b b = min ⁡ ( X b × ( 1 + R ) , U b ) \begin{array}{l} L b^{b}=\max \left(X^{b} \times(1-R), L b\right) \\ U b^{b}=\min \left(X^{b} \times(1+R), U b\right) \end{array} Lbb=max(Xb×(1R),Lb)Ubb=min(Xb×(1+R),Ub)
其中, X b X^{b} Xb表示全局最优位置, L b b L b^{b} Lbb U b b U b^{b} Ubb分别表示最佳觅食区的下限和上限。

小蜣螂的位置更新如下:
x i ( t + 1 ) = x i ( t ) + C 1 × ( x i ( t ) − L b b ) + C 2 × ( x i ( t ) − U b b ) x_{i}(t+1)=x_{i}(t)+C_{1} \times\left(x_{i}(t)-L b^{b}\right)+C_{2} \times\left(x_{i}(t)-U b^{b}\right) xi(t+1)=xi(t)+C1×(xi(t)Lbb)+C2×(xi(t)Ubb)
其中, x i ( t ) x_{i}(t) xi(t)表示第t次迭代中第i只小蜣螂在的位置, C 1 C_{1} C1是服从正态分布的随机数, C 2 C_{2} C2为(0,1)的随机向量。

2.4蜣螂偷窃

在这里插入图片描述

另一方面,一些蜣螂从其他蜣螂那里偷粪球,盗贼蜣螂的位置更新如下:

x i ( t + 1 ) = X b + S × g × ( ∣ x i ( t ) − X ∗ ∣ + ∣ x i ( t ) − X b ∣ ) x_{i}(t+1)=X^{b}+S \times g \times\left(\left|x_{i}(t)-X^{*}\right|+\left|x_{i}(t)-X^{b}\right|\right) xi(t+1)=Xb+S×g×(xi(t)X+ xi(t)Xb )
其中, x i ( t ) x_{i}(t) xi(t)表示在第t次迭代中第i个盗贼蜣螂的位置,g为服从正态分布的1×D随机向量,S为常数。

2.5DBO描述

滚球蜣螂、繁殖蜣螂、觅食蜣螂和偷窃蜣螂的比例分布如下:
在这里插入图片描述
DBO算法描述如下:
在这里插入图片描述
参考文献:Xue, J., Shen, B. Dung beetle optimizer: a new meta-heuristic algorithm for global optimization. J Supercomput (2022). https://doi.org/10.1007/s11227-022-04959-6

三、蜣螂优化算法求解背包问题

完整代码:https://mbd.pub/o/bread/Y52XmJxw

% 背包问题,共包含9个数据集,修改Function_name即可测试不同数据集
close all
clear 
clc
SearchAgents_no=30; % 种群大小
Function_name='F5'; %F1-F9
Max_iteration=500; % 最大迭代次数
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);%获取数据集信息
[fMin,bestX,DBO_curve]=DBO(SearchAgents_no,Max_iteration,lb,ub,dim,fobj);%算法求解
ShowResult;%显示结果

3.1数据集1求解结果

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第2张图片
所求得的背包总价值 : 295
背包的理论最大容量 : 269
所求得的背包的容量 : 269
算法选取的物品序号 : 2 3 4 8 9 10
算法选取的物品质量 : 4 60 32 62 65 46
算法选取的物品价值 : 10 47 5 61 85 87

3.2数据集2求解结果背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第3张图片

所求得的背包总价值 : 481.0694
背包的理论最大容量 : 375
所求得的背包的容量 : 354.9607
算法选取的物品序号 : 3 5 7 8 10 11 12 14 15
算法选取的物品质量 : 47.9873 74.6605 51.3535 1.49846 16.5899 44.5692 0.4669 57.1184 60.7166
算法选取的物品价值 : 58.5009 82.284 71.0501 30.3995 14.7313 98.8525 11.9083 53.1663 60.1764

3.3数据集3求解结果背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第4张图片

所求得的背包总价值 : 1024
背包的理论最大容量 : 878
所求得的背包的容量 : 871
算法选取的物品序号 : 1 2 3 4 5 6 7 8 9 10 11 12 13 15 17 19 20
算法选取的物品质量 : 92 4 43 83 84 68 92 82 6 44 32 18 56 25 70 14 58
算法选取的物品价值 : 44 46 90 72 91 40 75 35 8 54 78 40 77 61 75 75 63

3.4数据集4求解结果

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第5张图片
所求得的背包总价值 : 9765
背包的理论最大容量 : 10000
所求得的背包的容量 : 9766
算法选取的物品序号 : 1 2 3 4 5 6 8 9 16 17
算法选取的物品质量 : 983 982 981 980 979 978 976 972 969 966
算法选取的物品价值 : 981 980 979 978 977 976 974 970 976 974

3.5数据集5求解结果背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第6张图片

所求得的背包总价值 : 2983
背包的理论最大容量 : 1000
所求得的背包的容量 : 997
算法选取的物品序号 : 1 2 4 5 7 9 10 11 12 13 14 16 17 19 23 24 25 26 28 32 35 37 40 41 44 45 47 48
算法选取的物品质量 : 80 82 70 72 66 55 25 50 55 40 48 32 22 30 35 32 25 28 22 30 20 20 10 20 10 10 4 4
算法选取的物品价值 : 220 208 192 180 165 160 158 155 130 125 122 118 115 105 98 96 95 90 82 73 69 65 58 56 20 15 8 5

3.5数据集6求解结果

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第7张图片
所求得的背包总价值 : 15807
背包的理论最大容量 : 11258
所求得的背包的容量 : 11257
算法选取的物品序号 : 2 3 4 5 8 10 12 13 14 18 19 21 22 23 26 27 28 30 31 34 35 38 39 40 41 43 48 49
算法选取的物品质量 : 754 699 587 789 347 287 784 676 198 4 355 144 272 531 489 321 84 483 205 747 118 9 607 121 370 494 589 193
算法选取的物品价值 : 490 651 833 883 337 441 934 467 661 774 595 424 37 807 309 834 851 459 111 858 793 856 400 285 405 391 473 448

3.7数据集7求解结果

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第8张图片
所求得的背包总价值 : 8295
背包的理论最大容量 : 2400
所求得的背包的容量 : 2397
算法选取的物品序号 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 47 50 52 53 56 57 59
算法选取的物品质量 : 135 133 130 11 128 123 20 75 9 66 105 43 18 5 37 90 22 85 9 80 70 17 60 35 57 35 61 40 8 50 32 40 72 35 100 2 7 19 28 10 22 27 30 88 68 12 11 20 4 3 10
算法选取的物品价值 : 350 310 300 295 290 287 283 280 272 270 265 251 230 220 215 212 207 203 202 200 198 196 190 182 181 175 160 155 154 140 132 125 110 105 101 92 83 77 75 73 72 70 69 66 45 36 31 27 19 10 4

3.8数据集8求解结果

背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第9张图片
所求得的背包总价值 : 4851
背包的理论最大容量 : 1173
所求得的背包的容量 : 1168
算法选取的物品序号 : 1 2 3 4 5 6 7 8 9 10 11 12 14 15 17 18 19 23 24 25 26 28 29 30 31 32 34 36 38 39 43 45 46 49 50 54 56 62 63 65 67 72 77
算法选取的物品质量 : 40 27 5 21 51 16 42 18 52 28 57 34 43 52 53 42 47 16 2 12 9 23 56 3 39 16 36 5 48 23 22 10 16 40 1 32 35 2 23 50 11 6 4
算法选取的物品价值 : 199 194 193 191 189 178 174 169 164 164 161 158 154 152 149 142 131 124 122 119 116 113 111 110 109 100 94 82 81 80 77 74 72 69 68 56 54 36 34 32 29 22 5

3.9数据集9求解结果背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第10张图片

所求得的背包总价值 : 14793
背包的理论最大容量 : 3820
所求得的背包的容量 : 3796
算法选取的物品序号 : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 48 49 50 51 52 53 54 55 56 57 58 60 61 62 63 64 66 67 68 69 70 71 72 74 76 77 78 79 83 87 91 96 97 98 99 100
算法选取的物品质量 : 54 95 36 18 4 71 83 16 27 84 88 45 94 64 14 80 4 23 75 36 90 20 77 32 58 6 14 86 84 59 71 21 30 22 96 49 81 48 37 28 6 84 19 55 88 38 52 79 55 70 53 64 99 61 86 1 64 60 42 45 34 22 37 33 1 78 43 85 24 32 57 23 8 10 95 6 6 13 8 26 5 9
算法选取的物品价值 : 297 295 293 292 291 289 284 284 283 283 281 280 279 277 276 275 273 264 260 257 250 236 236 235 235 233 232 232 228 218 217 214 211 208 205 204 203 201 196 194 193 193 192 191 190 187 184 184 184 181 179 176 173 172 171 160 128 114 113 107 105 101 100 99 98 97 94 94 93 80 73 72 63 63 56 48 35 15 12 11 6 5

四、参考代码

文件夹内包含9个背包问题的所有代码,点击main.m即可运行。
背包问题:蜣螂优化算法(Dung beetle optimizer,DBO)求解背包问题(Knapsack Problem,KP)提供Matlab代码_第11张图片

你可能感兴趣的:(背包问题,单目标应用,MATLAB,matlab,背包问题,蜣螂优化算法,NP-hard问题)