【背包问题】离散粒子群算法求解0-1背包问题【含Matlab源码 1342期】

在这里插入图片描述

⛄一、背包问题简介

1【背包问题】
背包问题(Knapsack problem)是一种组合优化的NP完全问题。
问题描述为:给定一组物品,每种物品都有自己的重量weight和价格value,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
2【0-1背包问题】
对每个物品i 只有 装入/不装入背包 两种情况。
我们有n种物品,物品j的重量为wj,价格为pj。
我们假定所有物品的重量和价格都是非负的。背包所能承受的最大重量为W。
如果限定每种物品只能选择0个或1个,则问题称为0-1背包问题。
令V(i,j)表示前i个物品中能够装入容量为j的背包中的物品价值最大值,则可得到动态规划函数:
V(i,0) = V(0,j)=0; //把前i个物品装入容量为0的背包 和 把0个物品装入容量为j的背包,价值均为0
V(i,j) = V(i-1,j) j<wi //如果第i个物品的重量大于背包容量wi>j,则装入前i个物品得到的最大价值和装入前i-1个物品得到的最大价值相同,即物品i不装入背包
V(i,j) = max{ V(i-1,j),V(i-1,j-wi)+vi } j>wi // 1.如果把第i个物品装入背包,则背包中物品的价值=把前i-1个物品装入容量为j-wi背包中的价值加上第i个物品的价值vi; 2. 如果第i个物品没有装入背包,则背包中价值=前i-1个物品装入容量为j的背包中所取得的价值。 取二者中价值较大者。
step 1:只装入前1个物品,确定各种情况下的背包能够得到的最大价值;
step 2:只装人前2个物品,确定各种情况下的背包能够得到的最大价值;.
step n:…
最后V(n,C)便是容量为C的背包中装入n个物品时取得的最大价值。
为了得到V(n,C) 需想前推到V(n-1,C)。如果V(n,C)>V(n-1,C),则第n个物品装入背包,前n-1个物品装入容量为C-wn的背包中;否则,第n个物品没有被装入背包,前n-1个物品被装入容量为C的背包中。
直到确定第一个物品是否被装入背包中。
得到:
当 V(i,j)= V(i-1,j), xi = 0;
当 V(i,j) > V(i-1,j), xi = 1,j = j-wi;

⛄二、离散粒子群算法简介

1 什么是离散粒子群算法?
普通粒子群算法(Particle Swarm Optimization Algorithm,PSO)的粒子初始位置、更新速度都是连续函数,与之对应,位置和速度更新均为离散值的算法是离散PSO算法(Discrete Particle Swarm Optimization Algorithm, DPSO);
一般就是在跟新粒子位置后,对粒子进行离散点处理;
比如:你的粒子的离散点是0到9的整数。那么对每个粒子更新位置后,比如是在(0,1)范围内的随机数。那么就(0,0.1)范围令其值为0;(0.1,0.2)范围令其值为1;…(0.9.1)范围令其值为9。当然初始位置值也需要这样处理。参考

2 什么是离散二进制粒子群算法?
离散二进制粒子群算法(Discrete Binary Particle Swarm Optimization Algorithm, BPSO)最初由J.Kennedy和R.C.Eberhart在1997年设计;
PSO主要优化连续实值问题,BPSO主要优化离散空间约束问题;
BPSO是在离散粒子群算法基础上,约定位置向量、速度向量均由0、1值构成;
BPSO有很强全局搜索能力,但不能收敛于全局最优值,且随着算法迭代搜索随机性越来越强,缺乏后期的局部搜索能力;

3 离散二进制粒子群算法步骤
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4 实验步骤
参考:离散二进制粒子群算法分析
第一步:确定测试的基准函数;
第二步:测试某个粒子的平均速度迭代变化,某个粒子取1的平均概率迭代变化;某个粒子改变概率迭代变化;某个粒子到最优粒子距离的迭代变化;
第三步:提出改进的粒子群算法,改进点为概率函数;按照第二步进行实验;
第四步:提出改进的基于遗传算法的二进制PSO算法;进行显著性分析,测试最小平均适应度值和标准方差;

⛄三、部分源代码

%%%%%%%%%%离散粒子群算法解决0-1背包问题%%%%%%%%%%%
%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%
clear all; %清除所有变量
close all; %清图
clc; %清屏
N=100; %群体粒子个数
D=10; %粒子维数
T=200; %最大迭代次数
c1=1.5; %学习因子1
c2=1.5; %学习因子2
Wmax=0.8; %惯性权重最大值
Wmin=0.4; %惯性权重最小值
Vmax=10; %速度最大值
Vmin=-10; %速度最小值
V = 300; %背包容量
C = [95,75,23,73,50,22,6,57,89,98]; %物品体积
W = [89,59,19,43,100,72,44,16,7,64]; %物品价值
afa = 2; %惩罚函数系数

%%%%%%%%%初始化种群个体(限定位置和速度)%%%%%%%%%%
x=rand(N,D); %随机获得二进制编码的初始种群
v=rand(N,D) * (Vmax-Vmin)+Vmin;
%%%%%%%%%%%初始化个体最优位置和最优值%%%%%%%%%%%%
p=x;
pbest=ones(N,1);
for i=1:N
pbest(i)= func4(x(i,:),C,W,V,afa);
end
%%%%%%%%%%%%初始化全局最优位置和最优值%%%%%%%%%%%
g=ones(1,D);
gbest=eps;
for i=1:N
if(pbest(i)>gbest)
g=p(i,:);
gbest=pbest(i);
end
end
gb=ones(1,T);
%%%%%%%按照公式依次迭代直到满足精度或者迭代次数%%%%%%%
for i=1:T
for j=1:N
%%%%%%更新个体最优位置和最优值%%%%%%%%%%%%%
if (func4(x(j,:),C,W,V,afa)>pbest(j))
p(j,:)=x(j,:);
pbest(j)=func4(x(j,:),C,W,V,afa);
end
%%%%%%%%%%更新全局最优位置和最优值%%%%%%%%%
if(pbest(j)>gbest)
g=p(j,:);
gbest=pbest(j);
end
%%%%%%%%%%计算动态惯性权重值%%%%%%%%%%%%%
for ii=1:D
if (v(j,ii)>Vmax) | (v(j,ii)< Vmin)
v(j,ii)=rand * (Vmax-Vmin)+Vmin;
end
end
vx(j,:)=1./(1+exp(-v(j,:)));
for jj=1:D
if vx(j,jj)>rand
x(j,jj)=1;
else
x(j,jj)=0;
end
end
end
%%%%%%%%%%%%%记录历代全局最优值%%%%%%%%%%%%

g %最优个体
figure
plot(gb)
xlabel(‘迭代次数’);
ylabel(‘适应度值’);
title(‘适应度进化曲线’)

⛄四、运行结果

在这里插入图片描述
在这里插入图片描述

⛄五、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
[2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.

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

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Matlab领域

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值