1. 程式人生 > 其它 >【揹包問題】基於粒子群求解揹包問題matlab原始碼

【揹包問題】基於粒子群求解揹包問題matlab原始碼

技術標籤:matlab優化求解

描述

離散二進位制粒子群演算法(Discrete Binary Particle Swarm Optimization Algorithm, BPSO)最初由J.Kennedy和R.C.Eberhart在1997年設計;
PSO主要優化連續實值問題,BPSO主要優化離散空間約束問題;
BPSO是在離散粒子群演算法基礎上,約定位置向量、速度向量均由0、1值構成;
BPSO有很強全域性搜尋能力,但不能收斂於全域性最優值,且隨著演算法迭代搜尋隨機性越來越強,缺乏後期的區域性搜尋能力;

離散二進位制粒子群演算法(BPSO )步驟

初始化粒子位置:按一定策略,生成二進位制編碼;

速度更新公式:速度 x 慣性權重 + (個體最優位置 - 當前位置)x 學習因子1 x 隨機數 + (全域性最優位置 - 當前位置)x 學習因子2 x 隨機數。

位置更新公式:概率對映方式,採用sigmoid函式將速度對映到 [0, 1] 區間作為概率,這個概率就是粒子下一步取值為1的概率;

位置變化的絕對概率:當前位置為0變化為1,當前為1變化為0,這二者被稱為絕對變化;概率表示為:

揹包問題

【揹包問題】

揹包問題(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