【背包问题】基于matlab带权重的贪心萤火虫算法求解0-1背包问题【含Matlab源码 045期】

一、获取代码方式

1 引 言
背包问题 (Knapsack Problem, KP) 是NP-Complete问题, 也是经典的组合优化问题, 背包问题不仅具有重要的理论意义, 同时还有非常重要和广泛的实际应用, 如决策投资、资源分配、货物装载与预算控制等。0-1背包问题是最基本的KP问题。目前求解0-1背包问题的主要算法有动态规划法、近似算法、贪心算法、分支限界法、回溯法、蜂群优化算法、蚁群算法、粒子群算法、遗传算法和人工鱼群算法等以及其他一些新型智能算法。以上算法都在一定程度上提供了求解0-1背包问题的方法, 提高了求解速度, 根据其自身的特点, 对于背包问题的求解有改进的空间。萤火虫算法是由剑桥大学的Yang Xin-She教授在2008年提出的一种基于生物群体智能的启发式算法, 也是一种新型的仿生智能优化算法。本文将贪心算法、自适应权重和变异算子与基本萤火虫算法相结合, 提出一种带权重的贪心萤火虫算法 (WGFA) 。该算法应用于0-1背包问题, 提高了前期全局搜索能力和收敛速度。通过大量仿真实验, 结果表明该算法的求解结果是有改进且可行的。

1 0-1背包问题
0-1背包问题的具体描述如下:假设有n件物品和一个背包, 第i件物品的重量为ωi, 价值为pi (i=1, 2, …, n) , 背包的重量限制为V, 物品i被选择的情况有2种, 一种是被装进背包, 定义变量xi=1, 另一种是不被装进, 变量xi=0。对于一组被选择的物品 (x1, x2, …, xn) , 背包内物品总重量为∑ni=1ωixi, 总价值为∑ni=1pixi。背包问题就是如何决定变量xi (i=1, 2, …, n) 的值, 使其在不超过重量限制的条件下, 背包内的物品总价值最大, 其数学模型可以表示为:
在这里插入图片描述
其中i=1, 2, …, n

2 基本萤火虫算法 (FA)
萤火虫算法 (Firefly Algorithm, FA) [14]是一种启发式算法, 该算法受启发于萤火虫发光的行为。萤火虫发出的荧光, 其主要目的是作为一个信号系统, 以此吸引异性、捕食或作为警戒信号。萤火虫不分性别, 每只萤火虫都可以吸引其他萤火虫, 也可以被其他萤火虫吸引。萤火虫的吸引力和亮度成正比, 对于任意2只萤火虫, 亮度弱的会被亮度较强的吸引并向其移动。然而, 亮度会随着距离的增加而减少, 如果没有找到一只比给定的更亮的萤火虫, 它就会随机移动。

在萤火虫算法中, 每只萤火虫包含亮度、吸引度和位置这3个属性。萤火虫自身亮度I0是由目标函数决定, 萤火虫的位置越好, 相应的亮度越大。2只萤火虫的吸引度随着距离增大而减小, 在荧光传输过程中传播介质对光线有吸收作用, 吸引度大小还和介质吸收因子有关。所以个体的相对亮度可表示为:
I ® =I0e-γr2 (3)
其中, I0为个体在当前位置的亮度, γ为介质吸收因子, r为2只萤火虫的欧氏距离。萤火虫的吸引度β可表示为:
β ® =β0e-γr2 (4)
其中, β0为萤火虫对其距离为0时的吸引度, 萤火虫i被萤火虫j吸引的移动公式为:
在这里插入图片描述
其中, xi、xj是萤火虫i、j的位置, α为步长因子, rand为[0, 1]上均匀分布的随机因子。萤火虫i与萤火虫j的欧氏距离r表示为:
在这里插入图片描述
其中, xi、xj是萤火虫i、j的位置。

3 改进的萤火虫算法 (WGFA)
由于基本萤火虫算法早期收敛速度较快, 易陷入局部最优, 后期收敛速度缓慢且求解精度较低, 为了改善算法的全局搜索能力提高后期搜索精度, 现对基本萤火虫算法进行改进。

3.1 线性递减惯性权重
由于较大的权重因子有利于跳出局部最小点, 便于全局搜索, 而较小的惯性因子则有利于对当前的搜索区域进行精确局部搜索, 以利于算法收敛, 可以采用线性变化的权重, 让惯性权重从最大值ωmax线性递减到ωmin, 随算法迭代次数的变化公式为:
在这里插入图片描述
其中, ωmax、ωmin分别表示ω的最大值和最小值, t表示当前迭代步数, tmax表示最大迭代步数。加入自适应权重, 式 (5) 变为:
在这里插入图片描述
3.2 改进的贪心算法
贪心算法是将所有物品按照价重比 (p/ω) 由大到小排序, 然后从大到小依次装入背包, 直到背包无法装下为止。由于0-1背包问题不一定能将背包装满, 部分空间的闲置会使背包的总价值降低, 于是本文采用一种改进贪心算法, 其算法步骤如算法1。

算法1 改进的贪心算法
Step1 把n件物品按照价值密度由小到大依次对物品排序编号, 排序结果存于一个数组l[]中, l[i]为价值密度第i大的物品编号。
Step2 计算当前解对应的背包重量coresV。
Step3 如果coresV>V, 令l[i]=1 (i=1, 2, …, n) , 若xl[i]=1, 置xl[i]=0, 且coresV=coresV-wl[i]。
Step4 如果coresV>V, 令i=i+1, 继续Step3, 否则, 执行Step5。
Step5 将未装入背包的物品i (i=1, 2, …, k) 按价值密度由大到小依次对物品排序编号, 排序结果存于一个数组rest[]中, rest[i]为价值密度第i大的物品编号。
Step6 将物品i (i=1, 2, …, k) 按价值密度由大到小依次装入背包, 令xrest[i]=1 (i=1, 2, …, k) , 且coresV=coresV+ωrest[i]。
Step7 如果背包重量coreV<V, 令i=i+1, 继续执行Step6, 否则, coresV=coresV-ωrest[i], 且置xrest[i]=0, 执行Step6, 直至i=k。
Step8 输出萤火虫算法的解。

算法1可编码表示如下:
在这里插入图片描述
3.3 变异算法
变异为遗传算法的搜索算子, 变异操作[19]主要是为了维持种群多样性, 提高局部的随机搜索能力, 其基本内容是对种群中个体串的某些基因座上的基因值进行变动, 变异算子的操作分3步:

  1. 对种群内所有个体以一定变异概率进行判断是否进行变异。
  2. 对进行变异的个体随机选择变异位置进行变异。
  3. 对种群中每代最优个体进行变异操作, 以增加种群多样性。

3.4 改进萤火虫算法求解0-1背包问题的实施步骤
将线性递减惯性权重策略融入到萤火虫的位置更新公式中, 利用变异算子对最优个体进行扰动, 同时将改进贪心算法对种群中不可行解进行修复, 得到一种求解0-1背包问题的改进萤火虫算法, 其算法流程如算法2。

算法2 改进的萤火虫算法
Step1 初始化算法参数, 萤火虫种群个数为m, 步长因子α, 最大吸引度β0, 介质吸收因子γ, 最大权重值ωmax, 最小权重值ωmin, 变异概率pm, 最大迭代次数itermax。随机产生一个m×n的0-1矩阵作为萤火虫初始位置, n为物品个数。
Step2 对种群使用改进贪心算法修复, 使不可行解变为可行解, 并使可行解尽量增加其价值。计算目标函数值作为萤火虫最大荧光亮度l0, 记录最优位置vbest。
Step3 按照式 (3) 与式 (4) 分别计算萤火虫的相对亮度I和吸引度β, 并根据相对亮度I的大小确定萤火虫的移动方向, 按照式 (6) 计算萤火虫i与萤火虫j的距离。
Step4 根据式 (7) 计算每一代的权重, 按照式 (8) 对萤火虫的位置进行更新。将处于最优位置的萤火虫进行随机扰动。
Step5 对种群进行变异操作, 加大种群的全局搜索能力。将新种群离散化, 对于萤火虫分量xij>0.5, 令xij=1, 否则xij=0。
Step6 判断是否满足终止条件, 若是, 输出最优位置和最优解, 否则转到Step2, 进入下一次搜索。

算法2的流程图如图1所示。
在这里插入图片描述
图1 算法2流程图

二、部分源代码

%求解0-1背包问题的改进萤火虫群算法(WGFA)
%设置参数:步长因子alpha=0.5,吸引度beta0=1,介质吸收因子gama=1%萤火虫的亮度即目标函数值
clc
clear all
%% 
%初始化参数
alpha=0.2;      % 步长因子Randomness 0--1
gamma=1.0;      % 介质吸收因子
beta0=1.0;       %最大吸引度
wmax=1;wmin=0.05;%权重,用于计算线性递减惯性权重
Pm=0,01;%变异概率

%使用文献中案例1的参数
W=[95 4 60 32 23 72 80 62 65 46];%物品重量
P=[55 10 47 5 4 50 8 61 85 87];%物品价值
V=269;%背包最大容量
n=size(W,2);%物品个数
iter_max=30;%迭代次数
M=30;%萤火虫种群个数
runtime=100;%运行次数
xn=round(rand(M,n));%随机生成初始解

三、运行结果

在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
[3]任静敏,潘大志.带权重的贪心萤火虫算法求解0-1背包问题[J].计算机与现代化. 2019,(05)

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

猜你喜欢

转载自blog.csdn.net/TIQCmatlab/article/details/124933907