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

330 阅读6分钟

一、背包问题简介

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.