基于二进制粒子群算法的背包问题求解- 附代码
基于二进制粒子群算法的背包问题求解- 附代码
摘要:本文主要介绍二进制粒子群算法,并用其对背包问题进行求解。
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,imk−ximk)+c2r2k(gbest,imk−ximk)(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+1≥sigmoid(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,−4≤vimk+1≤4−0.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
wj>0和
c
j
>
0
(
j
=
1
,
2
,
…
,
n
)
c_j >0( j=1,2,…,n)
cj>0(j=1,2,…,n)背包的容量假设为
V
>
0
V >0
V>0如何选择那些物品装入背包可使在背包的容量限制之内所装物品的总价值最大,引入变量
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=1∑n)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=1nwjxj≤Vxj∈{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
相关文章
- C#数据结构与算法揭秘五
- Java实现 蓝桥杯 算法训练 二进制数数
- Java实现 蓝桥杯 算法提高 道路和航路
- Java实现 蓝桥杯VIP 算法训练 开心的金明
- Java实现 蓝桥杯 算法提高 上帝造题五分钟
- Python实现的寻找前5个默尼森数算法示例
- ML之NB:基于NB朴素贝叶斯算法训练20类新闻文本数据集进行多分类预测
- 基于萤火虫算法优化的BP神经网络预测模型(Matlab代码实现)
- 偏振3d算法(两张图形方可建模立体图像)
- 数学建模学习(94):Jaya 算法对定位问题进行寻优
- K-Means(K-均值)聚类算法
- 基于二进制正余弦算法的背包问题求解- 附代码
- 新授粉方式的花授粉算法-附代码
- 1253. 重构 2 行二进制矩阵-贪心算法
- 2369. 检查数组是否存在有效划分-dfs深度优先遍历算法
- Dubbo负载均衡算法
- 2023年中职网络安全竞赛逆向算法任务
- 【设计和算法分析】3、二进制搜索
- 超参数调优——google Vizier采用迁移学习的思想,主要是从之前调参的经验中学习,为新算法提出最佳超参数
- (数据结构)十分钟搞定时间复杂度(算法的时间复杂度)
- 目标检测算法——工业缺陷数据集汇总1(附下载链接)
- CV之FR/Keras之CNN:基于Keras框架和cv2库(调用摄像头)利用卷积神经网络模型(2+1)算法实现实时人脸识别并标注姓名标签
- 试题 算法训练 6-2递归求二进制表示位数
- 基于改进二进制粒子群算法的配电网重构