林 耿
(閩江學院 數(shù)學系,福建 福州 350108)
背包問題是運籌學中一個著名的問題,它是指從n個不同價值和重量的物品集合中選擇若干個物品裝入指定容量C的背包,使得被選物品的總重量不超過背包容量且價值總和最大.假設(shè)第i個物品的價值和重量分別為pi和wi,引入向量x∈{0,1}n,當物品i被選擇放入背包時,xi=1;否則xi=0.背包問題可以建模為如下的整數(shù)規(guī)劃模型:
背包問題屬于帶約束的NP困難問題[1],在現(xiàn)實生活中有著廣泛的應用背景,比如貨物裝載、工廠下料、電子商務和軟硬件劃分等[2].并且背包問題往往作為子問題出現(xiàn)在許多復雜的組合優(yōu)化問題中,所以研究背包問題的有效求解算法具有重要的理論和實際意義.
常見的求解背包問題的算法有精確算法和智能優(yōu)化算法[3-6].精確算法具有指數(shù)時間的算法復雜度,難以應用于求解大規(guī)模問題.智能優(yōu)化算法能夠較快地求得精度較高的近似解,特別是遺傳算法和模擬退火算法操作簡單實用,受到了學者們的廣泛關(guān)注.然而,每種算法都有其自身的優(yōu)勢和缺陷.遺傳算法[7]是一種基于自然選擇和自然遺傳學機制上的隨機搜索算法,具有較強的全局搜索性能,但是遺傳算法在搜索過程中容易出現(xiàn)早熟現(xiàn)象.模擬退火算法模擬固體退火的過程,不僅能夠向目標函數(shù)優(yōu)化的方向迭代,而且通過引入接受準則,能夠以一定概率接受較差的解,從而避免陷入局部最優(yōu)解,但當問題規(guī)模較大時,收斂速度較慢.
本研究將模擬退火算法有效地融入遺傳算法,結(jié)合遺傳算法和模擬退火算法的優(yōu)點,提出了一種求解背包問題的混合遺傳模擬退火算法,有效地避免陷入局部最優(yōu)解.與單純的遺傳算法比較,實驗結(jié)果表明了該混合算法求解背包問題的有效性和適用性.
遺傳算法具有很強的全局搜索能力,但是局部搜索能力較差,容易陷入局部最優(yōu)解.模擬退火算法具有較強的局部搜索能力,但搜索速度較慢.本研究將這兩個算法結(jié)合起來,提出混合的遺傳模擬退火算法,隨機構(gòu)造種群,采用模擬退火對種群中的解進行局部搜索,引入新的種群更新策略,保持種群的多樣性,避免早熟現(xiàn)象發(fā)生.
傳統(tǒng)模擬退火算法能夠有效避免陷入局部最優(yōu)解,但當問題的規(guī)模較大時,模擬退火算法的收斂速度較慢.本研究基于模擬退火的思想,提出了一個改進模擬退火局部搜索算法SALS,加快了局部搜索的速度.設(shè)x為初始解,N(x)為x的某個鄰域結(jié)構(gòu),T>0為SALS算法的參數(shù),則SALS算法可描述為:
(1)初始化,down=0,xmax=x.
(2)計算N(x)中所有解的適應度函數(shù)值,假設(shè)y是N(x)中適應度函數(shù)值最大的解,令Δf=f(y)-f(x).
(3)如果Δf>0,則令x=y,轉(zhuǎn)(2);否則,如果f(y)>f(xmax),令xmax=y,轉(zhuǎn)(4).
(4)如果down 假設(shè)x和y是從種群中選擇到的兩個解,本研究采用fixed交叉算子[8]來產(chǎn)生新的解向量z.fixed交叉算子的基本思想是:如果第i個物品在x和y中都是處于裝入狀態(tài),則在新的解中將該物品裝入背包,即zi=1;如果第i個物品在x和y中都是處于未裝入狀態(tài),則在新的解中不將該物品裝入背包,即zi=0;如果第i個物品在x和y中的狀態(tài)不一樣,那么在新的解中以50%的概率裝入背包. 良好的種群更新策略應當既能維持高質(zhì)量的解,又能保持種群的多樣性. 采用如下的種群更新策略:一個解如果能夠插入種群中,那么它要么提高了種群中解的質(zhì)量,要么使種群中的解更多樣化.假設(shè)x1和x2分別為種群中適應度函數(shù)值最大和最小的解,y為新產(chǎn)生的解.如果y的適應度函數(shù)值比x1大,即f(y)>f(x1),則將y插入種群,并將x2從種群中刪除.假設(shè)函數(shù)H(y,x1)表示解y和x1間的海明距離,函數(shù)H(x2,x1)表示解x2和x1間的海明距離,如果H(y,x1)+f(y)>H(x2,x1)+f(x1),則將y插入種群,并將x2從種群中刪除.否則,不改變種群的結(jié)構(gòu). 基于以上分析,提出了混合遺傳模擬退火算法,算法的具體步驟如下: (1)隨機產(chǎn)生s個解向量構(gòu)造出初始種群{x1,…,xs}. (2)對種群中的每個解xi應用改進的模擬退火局部搜索算法SALA進行局部搜索,所得結(jié)果仍記為xi. (3)隨機選出種群中的兩個解,應用fixed交叉算子構(gòu)造新解z,并利用SALA算法對z進行優(yōu)化,優(yōu)化結(jié)果仍記為z. (4)應用更新策略更新種群.如果算法已經(jīng)持續(xù)NO次未找到更好的解,則停機,輸出種群中適應度函數(shù)值最大的解;否則轉(zhuǎn)(3). 其中,NO為算法的停止參數(shù). 為了驗證本算法的有效性,選取文獻[6]中的實例來測試本算法,并將結(jié)果與文獻[6]中的結(jié)果進行對比.采用Visual C++進行編程實驗,實驗環(huán)境為AMD 2.11 GHz處理器,1 GB內(nèi)存,Windows XP 操作系統(tǒng),實驗例子的數(shù)據(jù)如下: P={p1,…,p25}={350,310,300,295,290,287,283,280,272,270,265,251,230,220,215,212,207,203,202,200,198,196,190,182,181}, W={w1,…,w25}={135,133,130,11,128,123,20,75,9,66,105,43,18,5,37,90,22,85,9,80,70,17,60,35,57},C=1 400.文獻[6]采用遞歸算法求得該問題的最優(yōu)解,最優(yōu)解的目標函數(shù)值和總質(zhì)量分別為5 686和1 398. 表1 實驗結(jié)果 由表1可得,混合遺傳模擬退火算法能夠找到比單純的遺傳算法更好的解,能夠避免早熟現(xiàn)象并有效地提高背包的利用率. 提出了一種求解背包問題的混合遺傳模擬退火算法,該算法發(fā)揮了遺傳算法和模擬退火算法的優(yōu)勢,采用同時考慮解的質(zhì)量和種群多樣性的種群更新策略,有效地避免了早熟現(xiàn)象,并且加快了局部搜索速度.與單純的遺傳算法比較,實驗結(jié)果證明了算法的有效性. 參考文獻: [1]Garey M,Johnson D.Computers and intractability:a guide to the theory of NP-completeness[M].Freeman:San Francisco,1979:71-72. [2]Ray A,Wu J G,Thambipillai S. Knapsack model and algorithm for HW/SW partitioning problem[J].Lecture Notes in Computer Science,2004(3036):200-205. [3]趙新超,韓宇,艾文寶.求解背包問題的一種改進遺傳算法[J].計算機工程與應用,2011,47(24):34-36. [4]苗世清,高岳林.求解0/1背包問題的離散差分進化算法[J].小型微型計算機系統(tǒng),2009,30(9):1828-1830. [5]錢淑渠,武慧虹,涂歆.動態(tài)免疫優(yōu)化算法及其在背包問題中的應用[J].計算機工程,2011,37(20):216-218. [6]程春英,張玉春.利用遺傳算法求解0/1背包問題[J].內(nèi)蒙古民族大學學報,2010,25(6):637-639. [7]陳國良,王煦法,莊鎮(zhèn)泉,等.遺傳算法及其應用[M].北京:人民郵電出版社,2001. [8]Chardaire P,Barake M, McKeown G P.A probe-based heuristic for graph partitioning[J].IEEE Transactions on Computers,2007,56(12):1707-1720.1.3 交叉算子
1.4 種群更新策略
2 算法求解步驟
3 仿真實驗
4 結(jié)論