【背包问题】基于matlab离散粒子群算法求解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('适应度进化曲线')
  
 - 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
四、运行结果

 
五、matlab版本及参考文献
1 matlab版本
 2014a
2 参考文献
 [1] 包子阳,余继周,杨杉.智能优化算法及其MATLAB实例(第2版)[M].电子工业出版社,2016.
 [2]张岩,吴水根.MATLAB优化算法源代码[M].清华大学出版社,2017.
文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。
原文链接:qq912100926.blog.csdn.net/article/details/119609196
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)