粒子群算法总结+背包问题
生活随笔
收集整理的這篇文章主要介紹了
粒子群算法总结+背包问题
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【粒子群算法】(Particle Swarm Opitimization, PSO)在1995年由Dr.Eberhart和Dr.Kennedy提出,源于對鳥群捕食行為的研究。
好比說,一群鳥在一個區(qū)域內(nèi)尋找食物,這個區(qū)域只有一條蟲子(最優(yōu)解),所有的鳥都不知道食物在哪。假設(shè),他們知道自己的當(dāng)前位置距離食物有多遠(yuǎn),也知道自己距離食物最近的鳥的位置。
鳥A:哈哈哈原來蟲子離我最近! 鳥B,C,D:我得趕緊往 A 那里過去看看! 同時各只鳥(粒子)飛行時,位置不停變化,距離食物的距離也不斷變化,所以一定有過離食物最近的位置,這也是它們的一個參考(粒子飛行的歷史)。
鳥某某:我剛剛的位置好像靠近了食物,我得往那里靠近!
綜上,影響鳥的運(yùn)動狀態(tài)變化有下面兩個因素:
- 離食物最近的鳥的位置(全局最優(yōu))
- 自己之前達(dá)到過的離食物最近的位置(個體最優(yōu))
- 自身慣性
經(jīng)過不斷的調(diào)整,鳥群會向食物方向聚集,達(dá)到目標(biāo)。
以上內(nèi)容參考知乎@草稿紙反面,稍作修改,侵刪。
PSO Step: 1:初始種群,計(jì)算個體的適應(yīng)度值,設(shè)置各個體最優(yōu),全局最優(yōu); 2:迭代 i=0:MAX_GEN 3:粒子飛行:速度更新、位置更新、計(jì)算個體適應(yīng)度值; 4:更新個體最優(yōu)、全局最優(yōu); 5:i= MAX_GEN時,迭代結(jié)束
【背包問題】 背包問題(Knapsack problem)是一種組合優(yōu)化的NP完全問題。 問題描述為:給定一組物品,每種物品都有自己的重量weight和價格value,在限定的總重量內(nèi),我們?nèi)绾芜x擇,才能使得物品的總價格最高。
【0-1背包問題】 對每個物品i 只有 裝入/不裝入背包 兩種情況。
我們有n種物品,物品j的重量為wj,價格為pj。
我們假定所有物品的重量和價格都是非負(fù)的。背包所能承受的最大重量為W。
如果限定每種物品只能選擇0個或1個,則問題稱為0-1背包問題。
可以用公式表示為:
最大化?
受限于 ?
令V(i,j)表示前i個物品中能夠裝入容量為j的背包中的物品價值最大值,則可得到動態(tài)規(guī)劃函數(shù): 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的背包中。 直到確定第一個物品是否被裝入背包中。 得到: 當(dāng)?V(i,j)=?V(i-1,j), xi = 0; 當(dāng)?V(i,j) >?V(i-1,j), xi = 1,j = j-wi;
【動態(tài)規(guī)劃】 #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <math.h> #include <iostream>#define C 17 //背包容量 #define N 5 //物品個數(shù)int W[] = {3,4,7,8,9}; int V[] = {4,5,10,11,13};int Value[N+1][C+1]; int X[N+1];using namespace std;int KnapSack(int n,int c,int w[],int v[],int x[]) { //int i,j; for (int i=0;i<=n;i++) Value[i][0]=0; for (int j=0;j<=c;j++) Value[0][j]=0;for (int i=1;i<=n;i++) { for (int j=1;j<=c;j++) { if (j < w[i]) Value[i][j]=Value[i-1][j];else Value[i][j]=max(Value[i-1][j],v[i]+Value[i-1][j-w[i]]);cout<<Value[i][j]<<" "; } cout<<endl; }int j=C; for (int i=n;i>0;i--) { if (Value[i][j]>Value[i-1][j]) { x[i] = 1; j=j-w[i]; } else x[i]=0; } return Value[n][C]; }int _tmain(int argc, _TCHAR* argv[]) {cout<<KnapSack(N,C,W,V,X)<<endl;for (int i=1;i<=N;i++) { cout<<X[i]<<" "; } system("pause"); return 0; }
總結(jié)
以上是生活随笔為你收集整理的粒子群算法总结+背包问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据破危险品物流难题 危化品污染有望“
- 下一篇: 匠木———