MATLAB–基于PSO算法的0-1背包问题的求解。
在干活的过程中整理下来的,希望有用。
0-1背包问题是与TSP问题相似的优化算法测试问题,具体描述为:有N件物品和一个容量为v的背包。第i件物品的体积是 ,价值是 。求解将哪些物品放入背包可使物品的体积总和不超过背包的容量,且价值总和最大。
在这里,假设物品数为10,背包的容量为300,每件物品的体积为[95,75,23,73,50,22,6,57,89,98],每件物品的价值为[89,59,19,43,100,72,44,16,7,64]。
- 编码
对于这个实际问题时,首先要解决的问题是编码:对每个物品,我们只有拿取或者不拿两种选择,不能选择装入某物品的一部分,也不能装入同一物品多次,也就是说这是一个离散优化问题,种群中的个体采用二进制编码,用0表示不选择该件物品,1表示选择该件物品。
其次要考虑对这个问题建立数学模型,也就是设计适应度函数。问题要求我们在所放物品总体积不超过背包的容量的前提下,价值总和最大。根据每件物品的体积计算物品总体积,当物品总体积小于等于背包容量时,适应度值很好表示,就是物品的价值总和;而当物品总体积大于背包容量时,我们希望此时的适应度值特别小,这样在选择的过程中,就不易取这个解了,这里取适应度值=物品总价值- afa×(物品总体积-背包容量),我们把afa叫做惩罚函数系数,当然我们也可以简单的将当物品总体积大于背包容量时的适应度值设为0。
下面开始介绍MATLAB程序。
- 1.首先设置算法参数
设置:初始种群粒子个数N=100,粒子维数(即二进制编码长度)D=10,最大选代次数为T=200,学习因子 ,惯性权重最大值为 ,惯性权重最小值为 ,速度最大值为 ,速度最小值为 ,惩罚函数系数 。MATLAB程序如下图,这里先给出截图,代码在文章最后给出。