一、背包问题简介

1 背包问题概述

假设我们需要从许多物品(通常称作项目)中选择一些来填充一个背包。存在n个不同项目可以使用,每个项目j具有重量(weight)和价值(cost)。背包可以承重的上限是V。问题是如何寻找项目的最优子集从而在满足背包承重约束的基础上最大化总价值。价值,重量和承重是正整数。

设为二进制变量。如果项目j被放入背包,则=1,否则=0。背包问题的数学描述如下:

【背包问题】基于matlab遗传算法结合贪婪算法求解背包问题【含Matlab源码 791期】_背包问题

这种问题就是所谓0-1背包问题(0-1 knapsack problem),带有一个简单约束的纯整数规划,是一类非常重要的整数规划问题。

2 贪婪算法求解背包问题

贪婪算法属于一步式启发算法,即每采用一个贪婪准则便做出一个不可撤回的决策。用贪婪算法求解背包问题的特点是每一步迭代选一物品入包,直到无法再装。该算法没有在两个可行解之间比较选择,算法结束时得到一个可行解。

常用的贪婪准则是价值密度(价值重量比)贪婪算法,这种选择准则为:从剩余物品中选择可装入包的值最大的物品,这也是通常所使用的贪婪策略,因为它是一个直觉上的近似的解。

3 基于贪婪算法的混合遗传算法求解背包问题

将贪婪算法与遗传算法相结合构成的混合遗传算法,通过遗传算法的择优,不断重复执行选择、杂交和变异以及贪婪算法的修正这样一个过程,所求解将不断进化越来越接近最优解。

(1)基因编码

基因编码将n个的值顺序排列,就可构成背包问题的遗传编码。即我们使用的是等长度的二进制编码方法,编码串中1表示将对应的物品放入背包中,0表示不将其放入。

例如“11100111000000000000……00000011”就代表一个解,它表示将第1,2,3,6,7,8,…n-1,n号物品放入背包中,其他的物品则不放入。

(2)编码修复

上述基因编码的方案虽然比较直观,但对于任意一个编码串,或者由交叉,变异所产生的任意一个个体,由于它们不一定满足约束条件,就不一定表示可行解,也就是说这种编码方案会产生很多无效染色体。对于这些不满足约束条件的基因编码串,我们可以利用贪婪算法的思想进行修复。修复的基本思想为:

在的所有物品中,将价值重量比()最小的物品取出,直到满足背包的容量约束为止。由此可产生一些新的基因编码串,并且这些新编码串总是相对来说质量比较好的,特别是它们肯定满足问题的约束条件。

(3)适应度函数

由于对每个个体使用贪婪算法修正已保证了不会产生无效染色体,所以在进行个体适应度评价时无须引入罚函数项,而是直接用目标函数值作为适应度函数值,即:

【背包问题】基于matlab遗传算法结合贪婪算法求解背包问题【含Matlab源码 791期】_背包问题_02

4 算法步骤

【背包问题】基于matlab遗传算法结合贪婪算法求解背包问题【含Matlab源码 791期】_matlab_03

二、部分源代码

clc;
clear;close all;
c=[80 82 85 70 72 70 66 50 55 25 50 55 40 48 50 32 22 60 30 32 40 38 35 32 25 28 30 22 50 30 45 30 60 50 20 65 20 25 30 10 20 25 15 10 10 10 4 4 2 1];
value=[220 208 198 192 180 180 165 162 160 158 155 130 125 122 120 118 115 110 105 101 100 100 98 96 95 90 88 82 80 77 75 73 72 70 69 66 65 63 60 58 56 50 30 20 15 10 8 5 3 1];
g=value./c;%价值重量比
m1=1000;%总重量约束值
v = 2*rand(50,50)-1;
v=hardlim(v);

三、运行结果

【背包问题】基于matlab遗传算法结合贪婪算法求解背包问题【含Matlab源码 791期】_动态规划_04

【背包问题】基于matlab遗传算法结合贪婪算法求解背包问题【含Matlab源码 791期】_matlab_05

四、matlab版本及参考文献

1 matlab版本

2014a

2 参考文献

[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.

[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

3 备注

简介此部分摘自互联网,仅供参考,若侵权,联系删除