【背包问题】粒子群求解背包问题【Matlab 208期】

一、简介

1.1 描述
离散二进制粒子群算法(Discrete Binary Particle Swarm Optimization Algorithm, BPSO)最初由J.Kennedy和R.C.Eberhart在1997年设计;
PSO主要优化连续实值问题,BPSO主要优化离散空间约束问题;
BPSO是在离散粒子群算法基础上,约定位置向量、速度向量均由0、1值构成;
BPSO有很强全局搜索能力,但不能收敛于全局最优值,且随着算法迭代搜索随机性越来越强,缺乏后期的局部搜索能力;
1.2 离散二进制粒子群算法(BPSO )步骤
初始化粒子位置:按一定策略,生成二进制编码;
速度更新公式:速度 x 惯性权重 + (个体最优位置 - 当前位置)x 学习因子1 x 随机数 + (全局最优位置 - 当前位置)x 学习因子2 x 随机数。
【背包问题】粒子群求解背包问题【Matlab 208期】
位置更新公式:概率映射方式,采用sigmoid函数将速度映射到 [0, 1] 区间作为概率,这个概率就是粒子下一步取值为1的概率;
【背包问题】粒子群求解背包问题【Matlab 208期】
位置变化的绝对概率:当前位置为0变化为1,当前为1变化为0,这二者被称为绝对变化;概率表示为:
【背包问题】粒子群求解背包问题【Matlab 208期】
背包问题
【背包问题】

背包问题(Knapsack problem)是一种组合优化的NP完全问题。

问题描述为:给定一组物品,每种物品都有自己的重量weight和价格value,在限定的总重量内,我们如何选择,才能使得物品的总价格最高。
【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;

%0-1背包问题:对于n个体积为aj、价值分别为cj的物品,如何将它们装入总体积为b的背包中,使得所选物品的总价值最大。
%n=10
%aj=[95, 4, 60, 32, 23, 72, 80, 62, 65, 46]
%cj=[55, 10, 47, 5, 4, 50, 8, 61, 85, 87]
%b=269
%
%
a=[95 4 60 32 23 72 80 62 65 46];%物品的体积
c=[55 10 47 5 4 50 8 61 85 87];%物品的价值
b=269;%背包的重量限制
%
%
%初始化程序:
Dim=10;%粒子的维数
xSize=20;%种群数  
MaxIt=30;%最大迭代次数
c1=0.7;
c2=0.7;%定义加速因子
w=0.8;%定义惯性因子
%
% web -browser http://www.ilovematlab.cn/thread-12680-1-1.html
 
A=repmat(a,xSize,1);%将a扩展成一个30*10的矩阵
C=repmat(c,xSize,1);%将c扩展成一个30*10的矩阵
x=round(rand(xSize,Dim));%随机取一个30*10的0/1矩阵作为粒子的初始位置
v=rand(xSize,Dim);%粒子的初始速度
xbest=zeros(xSize,Dim);%单个粒子的初始最佳位置
fxbest=zeros(xSize,1);%xbest的适应度
gbest=zeros(1,Dim);%粒子群的初始最佳位置
fgbest=0;%gbest的适应度
%
%
%粒子群最优位置和单个粒子最优位置的选定
%迭代循环算法:
iter=0;
while iter<MaxIt
    iter=iter+1;
    fx=sum((C.*x)');%计算粒子群的适应度,即背包内物品的价值
    sx=sum((A.*x)');%限制函数,背包内物品的体积
    for i=1:xSize
        if sx(i)>269
            fx(i)=0;%当被包内物品的体积超过限制时,将期适应度设置为1
        end
    end
    for i=1:xSize
        if fxbest(i)<fx(i)
            fxbest(i)=fx(i);
            xbest(i,:)=x(i,:);%当粒子的适应度fx(i)大于其最佳适应度时fxbest(i),用其替代原来粒子的最佳适应度,并记下此解
        end
    end
    if fgbest<max(fxbest)
        [fgbest,g]=max(fxbest);
        gbest=xbest(g,:);%当存在粒子的最佳适应度fxbest(g)大于种群的最佳适应度时,用其替代原来种群的最佳适应度,并记下此解
    end
    for i=1:xSize
        if x(i,:)==gbest
            x(i,:)=round(rand(1,Dim));%为防止算法陷入局部最优,若某个粒子的位置等于种群最佳位置,将对该粒子的位置重新初始化赋值
        end
    end
    R1=rand(xSize,Dim);
    R2=rand(xSize,Dim); 
    v=v*w+c1*R1.*(xbest-x)+c2*R2.*(repmat(gbest,xSize,1)-x);%用速度迭代公式产生新的速度
    x=x+v;%更新粒子群的位置
    for i=1:xSize
        for j=1:Dim
            if x(i,j)<0.5
                x(i,j)=0;
            else x(i,j)=1;
            end
        end
    end%由于粒子的位置只有(0,1)两种状态,此处以0.5为分界点对函数值进行离散化
end
%
%
fgbest
sgbest=sum((a.*gbest)')
gbest

四、备注

完整代码或者代写添加QQ912100926

上一篇:leetcode 208. 实现 Trie (前缀树)


下一篇:springboot-HTTPS 加密网站