1 引言
背包问题是运筹学中一个典型的组合优化难题, 有着广泛的应用背景, 如货物装载问题, 选址问题等。由于此问题比较简单典型, 因此评价算法优劣常常以此问题作为的测试对象进行研究。背包问题属于NP问题, 目前求解的方法有精确方法 (如动态规划、递归法、回溯法、分支限界法等
2 背包问题数学模型
背包问题的描述有许多种形式, 最典型的是0-1背包问题。0-1背包问题是指:给定n种物品和一个背包, 物品i的质量是ci, 其价值为pi, 背包的质量容量为C, 如何选择物品, 使得装入背包中物品的总价值最大。其数学模型为
3 基本粒子群优化算法
粒子群优化 (PSO, particle swarm optimization) 算法是一种进化计算技术, 最早是由Kennedy与
PSO是模拟鸟群的捕食行为, 设想这样一个场景:一群鸟在随机搜索食物。在这个区域里只有一块食物。所有的鸟都不知道食物在那里。但是他们知道当前的位置离食物还有多远, 那么找到食物的最优策略是什么呢?最简单有效的就是搜寻目前离食物最近的鸟的周围区域。PSO从这种模型中得到启示并用于解决优化问题。PSO中, 每个优化问题的解都是搜索空间中的一只鸟, 称为“粒子"。所有的例子都有一个由被优化的函数决定的适应值, 每个粒子还有一个速度决定他们飞翔的方向和距离, 然后粒子们就追随当前的最优粒子在解空间中搜索。PSO初始化为一群随机粒子 (随机解) , 然后通过迭代找到最优解。在每一次迭代中, 粒子通过跟踪两个极值来更新自己。一个是粒子本身所找到的最优解, 称为个体极值pbest;另一个极值是整个种群目前找到的最优解, 称为全局极值gbest, 另外也可以不用整个种群而只是用其中一部分为粒子的邻居, 那么在所有邻居中的极值就是局部极值。
在找到这2个最优值时, 每个粒子根据如下的公式来更新自己的速度和新的位置:
其中vk是粒子的速度向量;xk是当前粒子的位置;pbestk粒子本身所找到的最优解的位置;gbestk整个种群目前找到的最优解的位置;c0, c1, c2表示群体认知系数, c0一般取介于 (0, 1) 之间的随机数, c1, c2取 (0, 2) 之间的随机数。vk+1是vk, pbestk-xk和gbestk-xk矢量的和。在每一维粒子的速度都会被限制在一个最大速度vmax (vmax>0) , 如果某一维更新后的速度超过用户设定的vmax, 那么这一维的速度就被限定为vmax, 即若vk>vmax时, vk=vmax或vk<-vmax时, vk=-vmax。
4 解0-1背包问题的混合粒子群算法
首先把原约束方程作为罚函数项加入到原目标中, 变成无约束的优化问题, 即
其中M为一充分大的正数。
背包问题的解用向量X= (x1, x2, …, xn) T表示, 粒子群算法的本质是利用个体极值信息和全局极值两个信息, 来指导粒子下一步迭代位置。对于0-1背包问题, 若按基本粒子群算法, 其速度难于表达, 故采用遗传算法
1) 交叉策略A
a.两串old1和old2交叉, 在第二个串old2中随机选择一个交叉区域;
b.将old1的相应的交叉区域由old2交叉区域代替。
例如两父串为
old1=1 0 0 1 0 1 1 1 1 0 0 1,
old2=0 1 1 0 1 0 1 0 1 1 0 0。
交叉区域为0 1 0 1 1, 交叉后为
new1=1 0 0 1 0 0 1 0 1 1 0 1。
2) 交叉策略B
a.随机产生k个1到n的整数j1, j2, …, jk;
b.将old1的j1, j2, …, jk的位置数值由old2相应的部分代替。
具体变异操作可以采用下面三种:
1) 变异策略A
a.在解空间 (x1, x2, …, xn) T中随机选择一块区域, 如 (xi, xi+1, …, xj) T;
如原来解为1 0 0 1 0 1 1 1 1 0 0 1, 随机产生区域为1 1 0 0, 则变异操作后的解为
1 0 0 1 0 1 1 0 0 1 1 1。
2) 变异策略B
a.在解空间 (x1, x2, …, xn) T中随机选择一块区域, 如 (xi, xi+1, …, xj) T;
b. (xi, xi+1, …, xj) T取随机值。
3) 变异策略C
a.在解空间 (x1, x2, …, xn) T中随机选择一个1到n的整数j;
b.xj←
如原来解为1 0 0 1 0 1 1 1 1 0 0 1, 随机产生整数为4, 则变异操作后的解为1 0 0 0 0 1 1 1 1 0 0 1。
解0-1背包问题的混合粒子群算法hybrid-PSO如下:
1) 设定粒子数np, 规定迭代次数nmax, 随机产生np个初始解X0;
2) 根据当前位置根据式 (4) 计算适应值l0, 设置当前适应值为个体极值plbest, 当前位置为个体极值位置pxbest, 根据各个粒子的个体极值plbest, 找出全局极值glbest和全局极值位置gxbest;
3) While (迭代次数<规定迭代次数nmax) do
4) for j=1∶np
5) 第j个粒子位置X0 (j) 与gxbest交叉得到X′1 (j) ;
6) X′1 (j) 与pxbest交叉得到X1 (j) ;
7) 对X1 (j) 进行变异操作;
8) 根据当前位置计算适应值l1;
9) 如果l1 (j) <plbest (j) , 则pxbest (j) =X1 (j) , plbest (j) =l1 (j) ;
10) End
11) 根据各个粒子的个体极值plbest, 找出全局极值glbest和全局极值位置gxbest;
12) X0←X1;
13) End
14) 输出全局极值glbest和全局极值位置gxbest。
该粒子群算法的时间复杂性估算如下:以交叉时间和变异操作花费最多, 变异操作的时间与交叉操作时间相近, 里面循环需要作O (3np) 交叉 (或变异) 操作, 外循环执行nmax次, 所以时间复杂性大约为O (3npnmax) 。
5 数值仿真与分析
《5.1各种策略比较》
5.1各种策略比较
采用文献
《表1 各种策略结果比较 (np=10, nmax=10)》
表1 各种策略结果比较 (np=10, nmax=10)
Table 1 Comparison results of strategies with np=10 and nmax=10
算法 |
平均值 /元 |
最好解 /元 |
最差解 /元 |
最好解 的次数 |
|
交叉策略A |
261.29 | 295 | 201 | 6 | |
交叉策略B |
265.92 | 295 | 205 | 4 | |
交叉策略A |
变异策略A |
280.91 | 295 | 237 | 15 |
变异策略B |
280.49 | 295 | 231 | 13 | |
变异策略C |
285.40 | 295 | 246 | 28 | |
交叉策略B |
变异策略A |
279.18 | 295 | 222 | 15 |
变异策略B |
282.87 | 295 | 232 | 14 | |
变异策略C |
283.62 | 295 | 210 | 18 |
《表2 各种策略结果比较 (np=20, nmax=30) 》
表2 各种策略结果比较 (np=20, nmax=30)
Table 2 Comparison results of strategies with np=20 and nmax=30
算法 |
平均值 /元 |
最好解 /元 |
最差解 /元 |
最好解 的次数 |
|
蚁群算法 |
287 | 295 | 277 | 64 | |
交叉策略A |
275.62 | 295 | 265 | 12 | |
交叉策略B |
270.78 | 295 | 245 | 8 | |
交叉策略A |
变异策略A |
275.52 | 295 | 245 | 19 |
变异策略B |
294.80 | 295 | 287 | 90 | |
变异策略C |
294.98 | 295 | 294 | 98 | |
交叉策略B |
变异策略A |
293.00 | 295 | 279 | 44 |
变异策略B |
293.1 | 295 | 255 | 47 | |
变异策略C |
293.27 | 295 | 284 | 42 |
从表1和表2可以看出, 只进行交叉操作的2个算法, 效果比较差。效果最好的是交叉策略A和变异策略C的组合算法最好。并且交叉策略A比交叉策略B简单, 变异策略C也比变异策略A和变异策略B简单。变异策略A和变异策略B, 由于变异的位数多, 增加了部分差的解, 因此效果不如变异方法C。随着粒子数和最大迭代次数增加, 计算效果变好, 但其运算量也将增大。另外这里的交叉操作与遗传算法的交叉操作不同, 遗传算法随机选择2个解进行交叉, 而粒子群交叉操作是对每个粒子进行交叉操作, 并且与个体极值和全局极值进行交叉, 考虑了优生的思想, 因此效果比传统的遗传效果好。
5.2与其他算法比较
针对背包问题, 对递归算法、回溯方法和蚁群算法进行了比较, 采用文献
《表3 各种算法的平均运行时间比较》
表3 各种算法的平均运行时间比较
Table 3 Comparison of average run time of algorithms
n |
5~9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
回溯方法[5] /s |
<0.001 | 0.240 | 2 | 3 | 7 | 16 | 33 | 42 | 88 | 190 | 393 | 620 |
蚁群算法[5] /ms |
<1 | <1 | <1 | <1 | <1 | <1 | <1 | <1 | 40 | 50 | 56 | 66 |
递归算法/ms |
<60 | 60 | 70 | 110 | 130 | 150 | 180 | 230 | 300 | 460 | 640 | 1 060 |
交叉策略A和变异策略C 的粒子群算法/ms |
<50 | 50 | 65 | 78 | 84 | 96 | 100 | 120 | 130 | 170 | 180 | 200 |
《5.3应用实例》
5.3应用实例
求解背包问题有着广泛的应用前景, 在理论上, 可以解决整数规划问题;在实践中, 资源分配、投资问题、货物装运、预算控制、项目选择等实际问题均可归结为背包问题, 其求解效率将直接影响社会生产力。下面举一应用在投资问题的实例, 投资问题是指某企业将投资n种项目, 项目i需投资ci元, 可得收益pi元, 总投资为C元, 如何投资项目最合理?其数学模型就是式 (1) , 实质就是背包问题。具体数据如下n=7, {c1, c2, …, c7}={3, 4, 3, 3, 15, 13, 16}元, {p1, p2, …, p7}={12, 12, 9, 15, 90, 26, 112}元, C=35元。分别用蚁群算法、遗传退火算法和交叉策略A和变异策略C的粒子群算法运行, 每个算法运行100次, 结果如表4所示。粒子数np=20, 最大迭代次数nmax=30。表4可见, 交叉策略A和变异策略C的粒子群算法运行的效率较高。
《表4 各种算法结果比较》
表4 各种算法结果比较
Table 4 Comparison results of algorithm
算法 |
平均值 /元 |
最好解 /元 |
最差解 /元 |
最好解 的次数 |
蚁群算法 |
210.42 | 217 | 202 | 84 |
遗传退火进化算法[3] |
215.65 | 217 | 211 | 87 |
交叉策略A和变异策 略C的粒子群算法 |
216.97 | 217 | 214 | 99 |
6 结论
提出的粒子群优化算法不仅可以解决背包问题, 对于整数规划问题, 对该算法作适当修改, 也可适用。粒子群优化算法 (PSO) 是起源对简单社会系统的模拟, 擅长连续问题的优化, 笔者尝试采用粒子群算法解决离散优化问题。PSO研究处于初期, 还有许多问题值得研究, 如算法的收敛性、理论依据等。但从当前的粒子群算法的应用效果
参考文献
[1] 王晓东.计算机算法设计与分析[M].北京:电子工业出版社, 2001.92~168
[2] 王凌.智能优化算法及其应用[M].北京:清华大学出版社, 2001.17~59
[3] 金慧敏, 马良.遗传退火进化算法在背包问题中的应用[J].上海理工大学学报, 2004, 26 (6) :561~564
[4] 马良, 王龙德.背包问题的蚂蚁优化算法[J].计算机应用, 2001, 21 (8) :4~5
[5] 于永新, 张新荣.基于蚁群系统的多选择背包问题优化算法[J].计算机工程, 2003, 29 (20) .75~76, 84
[8] 李爱国, 覃征, 鲍复民, 等.粒子群优化算法[J].计算机工程与应用, 2002, 38 (21) :1~3
[9] 杨维, 李歧强.粒子群优化算法综述[J].中国工程科学, 2004, 6 (5) :87~94