粒子群算法求解0-1背包问题
目錄
一、粒子群算法的概念
二、粒子群算法分析
三、粒子群算法種類
1.基本粒子群算法
2.標(biāo)準(zhǔn)粒子群算法
3.壓縮粒子群算法
4.離散粒子群算法
四、粒子群算法流程
五、例題
一、粒子群算法的概念
??粒子群優(yōu)化算法(PSO:Particle swarm optimization) 是一種進(jìn)化計算技術(shù)(evolutionary computation)。源于對鳥群捕食的行為研究。粒子群優(yōu)化算法的基本思想:是通過群體中個體之間的協(xié)作和信息共享來尋找最優(yōu)解.
??PSO的優(yōu)勢:在于簡單容易實現(xiàn)并且沒有許多參數(shù)的調(diào)節(jié)。目前已被廣泛應(yīng)用于函數(shù)優(yōu)化、神經(jīng)網(wǎng)絡(luò)訓(xùn)練、模糊系統(tǒng)控制以及其他遺傳算法的應(yīng)用領(lǐng)域。
二、粒子群算法分析
??粒子群算法通過設(shè)計一種無質(zhì)量的粒子來模擬鳥群中的鳥,粒子僅具有兩個屬性:速度和位置,速度代表移動的快慢,位置代表移動的方向。每個粒子在搜索空間中單獨的搜尋最優(yōu)解,并將其記為當(dāng)前個體極值,并將個體極值與整個粒子群里的其他粒子共享,找到最優(yōu)的那個個體極值作為整個粒子群的當(dāng)前全局最優(yōu)解,粒子群中的所有粒子根據(jù)自己找到的當(dāng)前個體極值和整個粒子群共享的當(dāng)前全局最優(yōu)解來調(diào)整自己的速度和位置。下面的動圖很形象地展示了PSO算法的過程:
三、粒子群算法種類
1.基本粒子群算法
假設(shè)在一個維的目標(biāo)搜索空間中,有個粒子組成一個群體,其中第i個粒子表示為一個維的向量:
第i個粒子的飛行速度也是一個D維的向量,記為
第i個粒子迄今為止搜索到最優(yōu)位置稱為個體極值,記為
整個粒子群迄今位置搜索到的最優(yōu)位置為全局極值,記為
在找到這兩個最優(yōu)值是,粒子根據(jù)如下公式來更新自己的速度和位置
2.標(biāo)準(zhǔn)粒子群算法
帶有慣性權(quán)重的改進(jìn)粒子群算法,該算法能夠保證較好 的收斂效果。?
慣性權(quán)重表示在多大程度上保留原來的速度:w越大,則全局收斂能力較強,局部收斂能力較弱;在0.8~1.2之間時,粒子群算法有更快收斂速度,當(dāng),算法容易陷入局部極值
在算法開始時可給賦予較大正值,隨著搜索進(jìn)行,可以線性地使主鍵減小。目前,采用較多的動態(tài)慣性權(quán)重值時Shi提出的線性遞減權(quán)值策略,其表達(dá)式如下?
3.壓縮粒子群算法
利用約束因子控制系統(tǒng)行為的最終收斂。壓縮因子更新公式。
式中為壓縮因子
4.離散粒子群算法
基本粒子群算法時在連續(xù)域中搜索函數(shù)極值,下面是一種離散二進(jìn)制版的粒子群算法。在此離散粒子群方法中,將離散問題空間映射到連續(xù)粒子運動空間,并適當(dāng)求改粒子群算法來求解,在計算上仍保留經(jīng)典粒子群算法速度-位置更新運算規(guī)則。
是從產(chǎn)生的隨機數(shù)。?
四、粒子群算法流程
粒子群算法基于“種群”和“進(jìn)化”的概念,通過個體間的協(xié)作與競爭,實現(xiàn)復(fù)雜空間最優(yōu)解的搜索,其流程如下:
1)初始化粒子群,包括群體規(guī)模N,每個粒子的位置x和速度v
2)計算每個粒子的適應(yīng)度值
3)對每個粒子,用它的適應(yīng)度值和個體極值比較。如果,則用替換掉
4)對每個粒子,用它的適應(yīng)度值和全局極值t比較。如果,則用替換
5)迭代更新粒子的速度和位置
6)進(jìn)行邊界條件處理
7)判斷算法終止條件是否滿足:若是,則結(jié)束算法并輸出優(yōu)化結(jié)果:否則返回步驟2)
??
五、例題
0-1背包問題。有件物品和一個容量為的背包。第件物品的體積是,價值是。求解將哪些物品放入背包可使物品的體積總和不超過背包的容量,且價值總和最大。假設(shè)物品數(shù)量為10,背包的容量為300.每件物品的體積為,價值為
仿真過程如下
1)初始化種群粒子個數(shù),粒子維數(shù),最大迭代次數(shù)為,學(xué)習(xí)因子,慣性權(quán)重最大值,慣性權(quán)重最小值為,速度最大值,速度最小值。
2) 初始化速度和二進(jìn)制編碼的種群粒子位置,其中1表示選擇該物品,0表示不選擇該物品。取適應(yīng)度值進(jìn)行懲罰計算。獲得粒子個體最優(yōu)位置和最優(yōu)值,以及粒子群全局最優(yōu)位置和最優(yōu)值
3)計算動態(tài)慣性權(quán)重值,更新速度值,并進(jìn)行邊界條件處理,更新二進(jìn)制編碼的位置x,計算適應(yīng)度值,判斷是否替換粒子個體最優(yōu)位置和最優(yōu)值,以及粒子群全局最優(yōu)位置和最優(yōu)值
4)判斷是否滿足終止條件:若滿足,則結(jié)束搜索過程,輸出最優(yōu)值;若不滿足,則繼續(xù)進(jìn)行迭代優(yōu)化
%%%%%%%%%%%%%%%%%離散粒子群算法解決0-1背包問題%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clear all; %清除所有變量 close all; %清圖 clc; %清屏 N=100; %群體粒子個數(shù) D=10; %粒子維數(shù) T=200; %最大迭代次數(shù) c1=1.5; %學(xué)習(xí)因子1 c2=1.5; %學(xué)習(xí)因子2 Wmax=0.8; %慣性權(quán)重最大值 Wmin=0.4; %慣性權(quán)重最小值 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; %懲罰函數(shù)系數(shù) %%%%%%%%%%%%%%%%初始化種群個體(限定位置和速度)%%%%%%%%%%%%%%%% x=randi([0,1],N,D); %隨機獲得二進(jìn)制編碼的初始種群 v=rand(N,D) * (Vmax-Vmin)+Vmin; %%%%%%%%%%%%%%%%%%初始化個體最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%%% p=x; pbest=ones(N,1); for i=1:Npbest(i)= func4(x(i,:),C,W,V,afa); end %%%%%%%%%%%%%%%%%%%初始化全局最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%% g=ones(1,D); gbest=eps; for i=1:Nif(pbest(i)>gbest)g=p(i,:);gbest=pbest(i);end end gb=ones(1,T); %%%%%%%%%%%按照公式依次迭代直到滿足精度或者迭代次數(shù)%%%%%%%%%%%%% for i=1:Tfor j=1:N%%%%%%%%%%%%%%更新個體最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%if (func4(x(j,:),C,W,V,afa)>pbest(j))p(j,:)=x(j,:);pbest(j)=func4(x(j,:),C,W,V,afa);end%%%%%%%%%%%%%%%%更新全局最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%if(pbest(j)>gbest)g=p(j,:);gbest=pbest(j);end%%%%%%%%%%%%%%%%計算動態(tài)慣性權(quán)重值%%%%%%%%%%%%%%%%%%%%w=Wmax-(Wmax-Wmin)*i/T;%%%%%%%%%%%%%%%%%跟新位置和速度值%%%%%%%%%%%%%%%%%%%%%v(j,:)=w*v(j,:)+c1*rand*(p(j,:)-x(j,:))...+c2*rand*(g-x(j,:));%%%%%%%%%%%%%%%%%%%%邊界條件處理%%%%%%%%%%%%%%%%%%%%%%for ii=1:Dif (v(j,ii)>Vmax) | (v(j,ii)< Vmin)v(j,ii)=rand * (Vmax-Vmin)+Vmin;endend vx(j,:)=1./(1+exp(-v(j,:)));for jj=1:Dif vx(j,jj)>randx(j,jj)=1;elsex(j,jj)=0;endend end%%%%%%%%%%%%%%%%%%%%記錄歷代全局最優(yōu)值%%%%%%%%%%%%%%%%%%%%%gb(i)=gbest; end g; %最優(yōu)個體 figure plot(gb) xlabel('迭代次數(shù)'); ylabel('適應(yīng)度值'); title('適應(yīng)度進(jìn)化曲線') %%%%%%%%%%%%%%%%%%適應(yīng)度函數(shù)%%%%%%%%%%%%%%%%% function result = func4(f,C,W,V,afa) fit = sum(f.*W); TotalSize = sum(f.*C); if TotalSize <= Vfit = fit; elsefit = fit - afa * (TotalSize - V); end result = fit; end總結(jié)
以上是生活随笔為你收集整理的粒子群算法求解0-1背包问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机自带键盘无法使用,笔记本电脑键盘用
- 下一篇: 计算机网络原理实验一--网线的制作