启发式算法在最优化问题求解中的应用与实践
最優(yōu)化問題廣泛的存在于社會(huì)生產(chǎn)活動(dòng)當(dāng)中,我們一直努力尋求更高效、更準(zhǔn)確的解決方式來應(yīng)對這類問題。通常,最優(yōu)化問題可以表述為一種數(shù)學(xué)規(guī)劃的形式,對于變量在可行域中的不同組合進(jìn)行搜索,以得到目標(biāo)函數(shù)的最優(yōu)值。在解決常規(guī)的最優(yōu)化問題時(shí),有多種解決方案,如梯度下降法,拉格朗日乘數(shù)法等。然而,有一類最優(yōu)化問題卻是人類目前難以逾越的門檻,即NP完全問題(Non-deterministicPolynomial)。本文介紹了最優(yōu)化問題的常見應(yīng)用場景和求解方式,并重點(diǎn)對啟發(fā)式算法在求解NP問題的次優(yōu)解過程進(jìn)行了分析。最后通過模擬退火算法和蟻群算法尋求最優(yōu)化路徑的實(shí)例,實(shí)踐了通過啟發(fā)式算法來求解NP問題的次優(yōu)解,為我們在日常生產(chǎn)活動(dòng)中解決此類時(shí)間復(fù)雜度具有不確定性的最優(yōu)化問題提供一種成本可控,目標(biāo)效益更高的解決方案。
1
引言
在日常生產(chǎn)活動(dòng)中,我們經(jīng)常會(huì)面臨諸如:超市的配貨卡車需要給不同的門店送去貨物,如何規(guī)劃卡車的配貨路線,使得每個(gè)門店均可接收到貨物,并且卡車配送所花時(shí)間和行駛里程最短;某視頻門戶網(wǎng)站需要在全國各地設(shè)立視頻資源存放服務(wù)器,一方面要保證服務(wù)器部署節(jié)點(diǎn)能夠覆蓋所有的用戶,并且要降低從用戶到服務(wù)器之間的鏈路成本,提高用戶請求視頻資源的響應(yīng)效率,另一方面要盡量減少服務(wù)器部署節(jié)點(diǎn),以降低經(jīng)濟(jì)成本;這類路線規(guī)劃和資源配置問題均可歸類到最優(yōu)化問題的求解范疇。解決最優(yōu)化問題的方法被稱為最優(yōu)化方法,常見的最優(yōu)化方法有以下幾類:1)梯度下降法;2)牛頓法;3)共軛梯度法;4)拉格朗日乘數(shù)法;5)啟發(fā)式算法。這五類算法每一種都有自己適用的場景和其優(yōu)勢,因此在解決最優(yōu)化問題前,分析應(yīng)用場景,選取合適的最優(yōu)化方法是首要任務(wù)。 計(jì)算機(jī)科學(xué)的兩大基礎(chǔ)目標(biāo)是:發(fā)現(xiàn)可證明其執(zhí)行效率良好且可得到問題的最優(yōu)解或次優(yōu)解的算法。而在最優(yōu)化問題中,有這樣一類問題卻是目前人類難以逾越的門檻——NP完全問題,該問題也是世界七大數(shù)學(xué)難題之一(其中龐加萊猜想現(xiàn)已被俄羅斯數(shù)學(xué)家格里戈里·佩雷爾曼解決)。NP即多項(xiàng)式復(fù)雜程度的非確定性問題,所有的在非確定性多項(xiàng)式時(shí)間可解的判定問題構(gòu)成了NP類問題。在解決這類問題時(shí),常規(guī)的確定性時(shí)間復(fù)雜度的算法不再適用,而啟發(fā)式算法這類非確定性時(shí)間復(fù)雜度的算法,卻能夠較好的尋找到該類問題的一個(gè)可以接受的次優(yōu)解。通常,啟發(fā)式算法搜索得到的問題的解不是最優(yōu)解,而是隨著算法的改進(jìn)和迭代無限接近最優(yōu)解的次優(yōu)解。因?yàn)槟壳?#xff0c;我們找不到一個(gè)更好的算法,能夠證明其執(zhí)行效率良好、穩(wěn)定,并且能得到問題最優(yōu)解的算法,所以啟發(fā)式算法是目前我們解決這類問題的一種較好手段。 常用的啟發(fā)式算法有模擬退火算法、遺傳算法、蟻群算法和人工神經(jīng)網(wǎng)絡(luò)等。以上這些算法我們都不能給出其確定的執(zhí)行時(shí)間復(fù)雜度,也不能證明其求解得到的解是否是問題的最優(yōu)解。而是能夠在大多數(shù)情況下,在“可接受”的時(shí)間開銷內(nèi)得到問題的一個(gè)“較好”的解。評(píng)價(jià)“可接受”的依據(jù)是能夠保證生產(chǎn)的基本時(shí)間開銷要求,評(píng)價(jià)“較好”的依據(jù)是,所得到的雖然不是最優(yōu)解,卻是一個(gè)能夠滿足生產(chǎn)活動(dòng)需求并且?guī)砀笮б娴慕狻R虼藢W(xué)習(xí)研究啟發(fā)式算法對于我們在日常生產(chǎn)活動(dòng)中解決某些最優(yōu)化問題有著重要作用和意義。啟發(fā)式算法領(lǐng)域也在近幾年得到了廣泛的應(yīng)用和研究,如人工神經(jīng)網(wǎng)絡(luò)應(yīng)用于機(jī)器學(xué)習(xí)等領(lǐng)域的研究。另外三種啟發(fā)式算法,均為仿自然界生物現(xiàn)象的算法。模擬退火算法來源于固體退火的過程,用于求解組合優(yōu)化類問題;遺傳算法模擬了達(dá)爾文生物進(jìn)化論的自然選擇和遺傳學(xué)機(jī)理的生物進(jìn)化過程,用于解決搜索類問題;蟻群算法模擬了螞蟻尋找食物過程中發(fā)現(xiàn)路徑的行為,用于解決路徑優(yōu)化問題,也是一種比較有趣的算法。 本文的主要工作是; 1)對最優(yōu)化問題及其常見的應(yīng)用場景和解決方法進(jìn)行了介紹和分析; 2)分析講解了P類問題,NP類問題和NP完全問題(NP-C問題); 3)介紹了常見的啟發(fā)式算法及其應(yīng)用,并重點(diǎn)就模擬退火算法和蟻群算法為代表的啟發(fā)式算法解決NP類問題進(jìn)行了講解和實(shí)踐。2
常見最優(yōu)化問題及其解決方法
2.1下山最優(yōu)路徑問題與梯度下降法 如下圖2.1所示,假設(shè)有一座山,四周都是濃霧,看不清任何東西。如何在山頂?shù)腁點(diǎn)出發(fā),找到一條去山腳的最快路徑,這就是一個(gè)最優(yōu)化問題。在解決這個(gè)問題時(shí),我們把這座山看作可微分的函數(shù),山的高度看作函數(shù)的目標(biāo)值,也就是要找到一條路徑,使得函數(shù)值下降得最快,就可以找到最快下山的路徑。 圖2.1. 梯度下降法 建立一個(gè)平面坐標(biāo)系后,將山上每個(gè)點(diǎn)的高度看作關(guān)于的函數(shù):? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??(1) 站在A點(diǎn)的時(shí)候,通過求該點(diǎn)的梯度,梯度是一個(gè)向量,該向量的方向指向了函數(shù)值增長最快的方向。因此要下山最快,就沿著與梯度方向相反的方向走。當(dāng)函數(shù)是單變量時(shí),梯度即為導(dǎo)數(shù);當(dāng)函數(shù)為多變量時(shí),梯度即為分別對每個(gè)自變量求偏導(dǎo)后構(gòu)成的一個(gè)向量。采用梯度下降的算法有SGD,Adam。 2.2非線性函數(shù)與X軸交點(diǎn)問題與牛頓法 圖2.2. 牛頓法 如圖2.2所示,牛頓法主要用于解決研究問題中的目標(biāo)值是關(guān)于變量的非線性函數(shù),且在可行域中只有一個(gè)交點(diǎn),但是通過數(shù)學(xué)計(jì)算方法無法求得精確的交點(diǎn)。牛頓法提供了一種通過迭代的方式無限逼近交點(diǎn),其思想為從某一點(diǎn)出發(fā),求得該點(diǎn)處函數(shù)的切線,得到切線與x軸的交點(diǎn)記作,再次求處的切線,得到下一個(gè)交點(diǎn),就這樣無限的逼近函數(shù)與x軸的交點(diǎn)。 牛頓法能夠快速收斂于最優(yōu)值的原因是:當(dāng)函數(shù)任意階可導(dǎo)時(shí),通過展開為泰勒級(jí)數(shù),取泰勒級(jí)數(shù)一階展開式構(gòu)建的線性函數(shù)來代替曲線,因?yàn)閺奈⒂^的角度看,極小的區(qū)間內(nèi),曲線就趨近于直線。而牛頓法需要求解函數(shù)在區(qū)間內(nèi)的二階偏倒數(shù),因此要求函數(shù)二階連續(xù)可微。LM算法即采用的牛頓法。 2.3牛頓法的改進(jìn)——擬牛頓法 從上面介紹的牛頓法可知,雖然收斂速度較快,但是需要計(jì)算目標(biāo)函數(shù)的二階偏導(dǎo)數(shù)來構(gòu)建線性函數(shù),該過程計(jì)算復(fù)雜度較大,并且目標(biāo)函數(shù)的黑塞矩陣不是所有時(shí)候都保持正定,牛頓法在這種情況下就失效了。而擬牛頓法就是為了解決計(jì)算復(fù)雜度大,黑塞矩陣有時(shí)不是正定的問題而提出的。擬牛頓法的改進(jìn)思想是:不用二階偏導(dǎo)數(shù)近似的構(gòu)造黑塞矩陣(或其逆矩陣)的正定對稱陣。使用較多的擬牛頓算法有DFP,BFGS和L-BFGS。 以上介紹的三種最優(yōu)化算法是機(jī)器學(xué)習(xí)中最常用的三類迭代算法。表格2.1給出了三種算法的特點(diǎn)對比和常見應(yīng)用場景。 表2.1三種最優(yōu)化算法的特征對比| 算法 | 迭代時(shí)間復(fù)雜度 | 算法收斂速度 | 初始值要求 | 應(yīng)用場景 |
| 梯度下降法 | 需計(jì)算一階導(dǎo),復(fù)雜度為 | 收斂較慢 | 容易逃離鞍點(diǎn)(一階倒數(shù)為0) | 特征維度較大的場景 |
| 牛頓法 | 需計(jì)算二階導(dǎo),復(fù)雜度為 | 收斂快 | 有要求,非凸函數(shù)容易陷入鞍點(diǎn) | 特征維度較小的場景 |
| 擬牛頓法 | 近似Hessian矩陣的逆矩陣,復(fù)雜度為 | 收斂快 | 無明顯要求 | 比較適合凸優(yōu)化問題 |
2.4拉格朗日乘數(shù)法 拉格朗日乘數(shù)法由法國著名數(shù)學(xué)家約瑟夫·拉格朗日提出,用于求解多元函數(shù)在變量受一個(gè)或多個(gè)限制條件約束下的極值問題。假設(shè)一個(gè)多元函數(shù)有個(gè)變量,需要求解個(gè)約束條件下的極值,拉格朗日乘數(shù)法通過將該最優(yōu)化問題轉(zhuǎn)化為一個(gè)有個(gè)變量的函數(shù)的極值問題。在這個(gè)轉(zhuǎn)化過程中,需要引入一個(gè)新的參數(shù),即拉格朗日乘數(shù):新構(gòu)建的方程組中,每個(gè)向量的系數(shù)。 下面我們看這樣一個(gè)最優(yōu)化問題的情境:有一個(gè)紡織工廠主想要盡可能的提高其工廠利潤,假設(shè)在廠房(足夠使用)等外部條件固定時(shí),利潤函數(shù)與投入的紡織機(jī)數(shù)量和雇傭的工人數(shù)量有關(guān),假設(shè)可表示為,因?yàn)榧徔棛C(jī)的數(shù)量和工人數(shù)量必須構(gòu)成一定的比例關(guān)系,才能不造成工人空閑或工人照看不了過多的紡織機(jī),該比例關(guān)系表示為,由于工廠主的資金有限,最多能夠?yàn)榧徔棛C(jī)購置和工人雇傭支付的金額。因此需要滿足:,由于在廠房夠用的情況下,工廠主希望能夠以最大的資金投入,來獲取更多的回報(bào),因此,可以得到。接著,將上面的收益函數(shù)在約束條件最大化表示為以下形式:? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ?(2)
此時(shí)引入兩個(gè)新的參數(shù)構(gòu)建方程:? ?????????????? ? ? ? ?? ? ? ? ? ?(3)
然后令函數(shù)對自變量分別求一階偏導(dǎo)數(shù)的值為0,可得到:? ? ? ? ? ? ?? ? ? ? ? ? ? ? ?? ? ? ? (4)
通過求解上述方程組(4)即可得到工廠主的利潤函數(shù)z的極值,這里的極值有可能是最小值,也有可能是最大值。如果求得的極值點(diǎn)只有一個(gè),那么該極值點(diǎn)就是問題的最優(yōu)解,因?yàn)椴豢赡苁亲钚≈?#xff08;不投入資金時(shí)候收益為0)。當(dāng)求得的極值點(diǎn)有多個(gè)時(shí)候,我們很容易把這幾個(gè)極值點(diǎn)代入到利潤函數(shù)z中去,通過比較計(jì)算得到的值,其中最大值對應(yīng)的極值點(diǎn),就是問題的最優(yōu)解。 2.5啟發(fā)式算法 啟發(fā)式算法的定義是:一個(gè)基于直觀或經(jīng)驗(yàn)構(gòu)造的算法,在可接受的花費(fèi)(指計(jì)算時(shí)間和空間)下給出待解決組合優(yōu)化問題每一個(gè)實(shí)例的一個(gè)可行解,該可行解與最優(yōu)解的偏離程度一般不能被預(yù)計(jì)(來源于百度百科)。常見的啟發(fā)式算法有:模擬退火算法,遺傳算法,蟻群算法和神經(jīng)網(wǎng)絡(luò),均為仿自然體的算法。 2.5.1模擬退火算法 模擬退火算法是是仿固體退火原理,當(dāng)固體被加溫時(shí),內(nèi)能增大,粒子的動(dòng)能增大,處于無序狀態(tài),而溫度逐漸降低過程中,粒子會(huì)逐漸趨于穩(wěn)定有序,內(nèi)能達(dá)到最低。在這一過程中,粒子的排列組合決定了內(nèi)能的大小,但固體最終會(huì)形成一種內(nèi)能最低的狀態(tài)。模擬退火算法就是模擬的這個(gè)隨著溫度下降,內(nèi)能降低的過程。通常可以用來解決復(fù)雜度較高的組合問題。 圖2.3. 模擬退火算法示意圖 在圖2.3中,固體初始溫度低,粒子排列較為緊密,但不是最緊密的狀態(tài)。此時(shí)將固體加熱,粒子由于吸熱內(nèi)能變大,熱運(yùn)動(dòng)變強(qiáng)烈,粒子間距離增大。隨著溫度逐漸降低,最終粒子會(huì)趨于平衡狀態(tài),粒子排列最為緊密,內(nèi)能最低。這種粒子排列組合狀態(tài),就是使得內(nèi)能最低的最優(yōu)狀態(tài)。 2.5.2遺傳算法 遺傳算法模擬的是達(dá)爾文的生物進(jìn)化理論,處理方法包括“選擇運(yùn)算”,“交叉算子”和“變異運(yùn)算”,評(píng)價(jià)和選擇指標(biāo)則是“適者生存”。因?yàn)閱l(fā)式算法主要用來解決搜索最優(yōu)解復(fù)雜度較高的問題,常規(guī)的“蠻力法”搜索通常極為耗費(fèi)資源,且不能在可接受的時(shí)間內(nèi)得到問題的解。那么,啟發(fā)式算法必須按照一種更“合理”的搜索方式來逼近問題的最優(yōu)解,遺傳算法就是按照生物進(jìn)化論的方式來搜索,將每次得到的個(gè)體(問題的一個(gè)可行解),通過一個(gè)適應(yīng)度來評(píng)價(jià),適應(yīng)度越高,距離最優(yōu)解的距離也就越近。因此,在每次跌倒過程中,適應(yīng)度越高的個(gè)體,其基因遺傳下去的概率會(huì)更大,這就是“適者生存”。并且,個(gè)體基因遺傳下去的方式有:直接遺傳給下一代,或者與其他個(gè)體配對后遺傳(選擇運(yùn)算);當(dāng)兩個(gè)個(gè)體配對時(shí),必須按照一定的規(guī)則來繼承上一代的基因,這個(gè)規(guī)則就是“交叉算子”;在遺傳的過程中,個(gè)體的基因會(huì)有一定概率發(fā)生改變,基因改變的過程就是“變異運(yùn)算”。遺傳算法的過程可用圖2.4表示。 圖2.4. 遺傳算法 2.5.3蟻群算法 蟻群算法用于解決尋找最優(yōu)路徑的問題,模擬的是螞蟻找食物的過程,是一種比較有趣的算法。在自然現(xiàn)象中,我們可以觀測到這樣的現(xiàn)象:螞蟻找尋找到食物時(shí),通常能夠走一條接近直線的路線到窩,如果直線上有障礙,也能夠找到最短的繞過路線。這一現(xiàn)象就說明,螞蟻尋找食物的過程,一定用一種機(jī)制來指導(dǎo)整個(gè)蟻群尋找到最優(yōu)的路徑。蟻群算法,就是對這一現(xiàn)象觀測研究,然后抽象簡化得到的尋找最優(yōu)路徑的算法。 圖2.5. 蟻群運(yùn)食物路線示意圖 螞蟻找食物最重要的兩個(gè)特征是多樣性和正反饋:多樣性,即螞蟻在選擇路徑時(shí),有一定的概率隨機(jī)選擇任意的方向,以探索新的路徑;正反饋則是,螞蟻在選擇路徑時(shí),較大的概率選擇較多螞蟻?zhàn)哌^的路徑。正是這兩種機(jī)制巧妙的結(jié)合在一起,才使得螞蟻能夠找到一條接近最優(yōu)的路徑。如果多樣性的影響過大,則會(huì)出現(xiàn)整個(gè)蟻群過于活躍,無法收斂到一條路徑上,如果正反饋影響過于大,則會(huì)出現(xiàn)蟻群出現(xiàn)僵化的現(xiàn)象,陷入一個(gè)區(qū)域無法出來。蟻群算法,對尋路過程抽象為以下幾個(gè)方面: 1)螞蟻的感知范圍:任何一只螞蟻只能感知以它為中心的一定半徑大小圓形區(qū)域的路徑。 2)信息素:有代表窩的信息素和代表食物的信息素,分別指導(dǎo)螞蟻找窩和食物。 3)遺留信息素:螞蟻尋找到窩時(shí),會(huì)在附近遺留下最多窩的信息素,隨著距離窩越遠(yuǎn),遺留的信息素越少。尋找到食物時(shí),同理,距離食物越遠(yuǎn)遺留食物信息素越低。所有的信息素會(huì)以一定的速率揮發(fā)消失。 4)螞蟻尋路規(guī)則:如果周圍有信息素,則較大概率走信息素高的地方,否則按照慣性保持直線行走,有小概率會(huì)選擇其他的方向,并且能夠記住最近走過的點(diǎn),不重復(fù)。 5)躲避障礙物:有信息素時(shí)候,選取信息素高的地方,否則隨機(jī)選擇其他方向。 2.5.4神經(jīng)網(wǎng)絡(luò) 這里所說的神經(jīng)網(wǎng)絡(luò)指的是人工神經(jīng)網(wǎng)絡(luò)(ArtificialNeural Network,ANN),是近年來人工智能領(lǐng)域的研究熱點(diǎn),模擬的是人腦神經(jīng)元之間的傳遞過程,通過構(gòu)建數(shù)學(xué)映射模型,在神經(jīng)元之間通過激勵(lì)函數(shù)來傳遞信息,從而從輸入映射到輸出。由于最開始構(gòu)建的神經(jīng)網(wǎng)絡(luò)模型,沒有得到任何訓(xùn)練,從輸入映射得到的輸出可能相對于我們期望的輸出誤差較大,這時(shí)通過把誤差反向傳播,以調(diào)節(jié)中間神經(jīng)元之間的權(quán)值,經(jīng)過大量這種訓(xùn)練和反饋調(diào)節(jié)過程,最終神經(jīng)網(wǎng)絡(luò)系統(tǒng)能夠得到準(zhǔn)確度較高的結(jié)果。 圖2.6. 神經(jīng)網(wǎng)絡(luò)示意圖 圖2.6中通過一個(gè)形象的例子來示意了神經(jīng)網(wǎng)絡(luò)工作的過程,將神經(jīng)網(wǎng)絡(luò)系統(tǒng)看做一個(gè)復(fù)雜的水管管道系統(tǒng),每一層都有很多節(jié)點(diǎn),每一個(gè)節(jié)點(diǎn)均與上下鄰近的所有節(jié)點(diǎn)相鄰,且位于節(jié)點(diǎn)上的開關(guān)可以控制流向下一層的每個(gè)節(jié)點(diǎn)的水量大小。現(xiàn)在希望神經(jīng)網(wǎng)絡(luò)能夠識(shí)別阿拉伯?dāng)?shù)字,在圖片庫中有很多寫有數(shù)字的照片,我們將照片的數(shù)據(jù)看做水流,從最上層流入最下層,該系統(tǒng)會(huì)將最下層接收到水流最多的桶上的數(shù)字判定為輸入照片的數(shù)字。最開始的時(shí)候,誤差比較大,經(jīng)常識(shí)別錯(cuò)誤,這時(shí)我們就調(diào)節(jié)中間層每一個(gè)開關(guān),控制不同方向的流量。經(jīng)過大量這種訓(xùn)練調(diào)節(jié)過程,最終我們只要將寫有數(shù)字的卡片輸入,就能非常準(zhǔn)確的識(shí)別出對應(yīng)的數(shù)字。3 NP類問題與啟發(fā)式算法
NP類問題與啟發(fā)式算法
3.1 P類問題、NP類問題和NP完全問題 在介紹這三類問題時(shí),首先介紹一下多項(xiàng)式時(shí)間復(fù)雜度。當(dāng)我們說起冒泡排序算法,會(huì)將其時(shí)間復(fù)雜度表示為,而快速排序算法,時(shí)間復(fù)雜度表示為,這兩種算法均為多項(xiàng)式時(shí)間復(fù)雜度。通常,一個(gè)算法具有多項(xiàng)式時(shí)間復(fù)雜度時(shí),均可表示為以下形式:???(5)
P(Polynominal)類問題,即能夠在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)得到該問題的解。而NP類問題(Non-DeterministicPolynomial Problems),從字面上翻譯為“非確定性多項(xiàng)式問題”,即不能在確定的多項(xiàng)式時(shí)間復(fù)雜度內(nèi)得到該問題的解。另一方面來定義,NP類問題指的是“能夠在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)驗(yàn)證問題的一個(gè)解”。也就是說,雖然我們不知道是否存在一個(gè)算法能夠在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)得到NP問題的解,但我們可以在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)驗(yàn)證某個(gè)答案是否是NP問題的一個(gè)可行解。旅行商問題(TSP)是一個(gè)著名的NP問題,該問題描述了一個(gè)商人要去拜訪n個(gè)城市,要求途中經(jīng)過每個(gè)城市1次且僅1次,最后回到出發(fā)城市,如何找到最短的那條回路?該問題,如果用蠻力法來羅列所有的組合,復(fù)雜度為,這就不是多項(xiàng)式時(shí)間復(fù)雜度了。NP完全問題是NP問題的一個(gè)子集,如果任何一個(gè)NP問題,均可在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)轉(zhuǎn)化為某個(gè)NP問題,那么就被稱為NP完全問題。進(jìn)而可以推得,如果中存在某個(gè)NP問題可以在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)求解,那么任何一個(gè)NP問題都可以在多項(xiàng)式時(shí)間復(fù)雜度內(nèi)求解,即著名的難題“NP=P?”。 3.2 模擬退火算法求解TSP問題 模擬退火算法其實(shí)也是一種貪婪算法,只不過加入了隨機(jī)因素來接受一個(gè)比當(dāng)前解更差的解。由于普通的貪婪算法容易陷入局部最優(yōu),因此,以一定概率接受更差的解可以跳出一些局部最優(yōu)。如下圖3.1所示,從A點(diǎn)開始出發(fā)搜索最低點(diǎn),普通貪婪算法搜索到B點(diǎn)時(shí)即停止搜索,而B點(diǎn)是一個(gè)局部最優(yōu)解。模擬退火算法會(huì)以一個(gè)概率接受繼續(xù)向C點(diǎn)移動(dòng),因此有可能會(huì)跨過C點(diǎn),進(jìn)而到達(dá)問題的最優(yōu)解D。 圖 3.1. 模擬退火算法尋求最優(yōu)解示意圖 將模擬退火算法的執(zhí)行步驟,表示為如下偽代碼形式: 算法1:采用模擬退火算法求解組合優(yōu)化問題的執(zhí)行步驟 輸入:組合優(yōu)化問題的一個(gè)初始解,及目標(biāo)函數(shù)的值。 輸出:問題的解(可能為最優(yōu)解,也可能為次優(yōu)解) 01:產(chǎn)生問題的一個(gè)初始解,目標(biāo)函數(shù)值及初始溫度; 02:產(chǎn)生問題的一個(gè)新解,并計(jì)算其目標(biāo)函數(shù)值和衰減后的溫度; 03:當(dāng)時(shí),接受解,否則,以概率接受解; 04:如果超過一定次數(shù)均沒有接受新解,結(jié)束當(dāng)前搜索,否則,重復(fù)02~03步驟。 算法1所示步驟為在一次溫度衰減下的搜索過程,通常會(huì)重復(fù)執(zhí)行算法1直到溫度衰減到某個(gè)較低的值,不斷迭代優(yōu)化當(dāng)前已經(jīng)找到的最優(yōu)解,然后從這些解中選擇使得目標(biāo)值最小的那個(gè)解為問題搜索得到的最優(yōu)解。 圖 3.2. 旅行商問題 在求解TSP問題時(shí),需要在如圖3.2所示的無向圖中,尋求從某點(diǎn)出發(fā)并回到該點(diǎn)的一個(gè)哈密頓回路。每兩個(gè)點(diǎn)之間的路徑有一個(gè)權(quán)重,可看作路程里數(shù),現(xiàn)在需要從A點(diǎn)出發(fā),經(jīng)過圖中其他所有點(diǎn)1次回到A點(diǎn)的最短路徑。模擬退火算法的做法是,首先我們從一條可行的回路出發(fā),如A—>B—>D—>E—>F—>C—>A,這條回路看做初始解,并將路徑長度24記為目標(biāo)函數(shù)初始值。然后將起點(diǎn)與終點(diǎn)之外的路徑做一個(gè)隨機(jī)的重排,比如隨機(jī)交換兩點(diǎn)的位置,得到問題的新的解,根據(jù)新的解對應(yīng)的目標(biāo)函數(shù)值的大小判斷是否接受新的解,運(yùn)用算法1來循環(huán)執(zhí)行該優(yōu)化過程。04
啟發(fā)式算法在尋找最優(yōu)路徑中的應(yīng)用與實(shí)踐
本節(jié)介紹通過模擬退火算法實(shí)現(xiàn)求解TSP問題和蟻群算法模擬螞蟻找食物的仿真程序及其結(jié)果。程序通過C語言編寫,在VisualStudio2012中編譯通過。在通過圖形化界面動(dòng)態(tài)展現(xiàn)蟻群尋找食物過程時(shí),用到了EasyX圖形庫。 4.1 模擬退火算法應(yīng)用于求解TSP問題的實(shí)踐 在該仿真中,解決一個(gè)有30個(gè)節(jié)點(diǎn)的全連通無向圖的TSP問題,該問題如果通過暴力求解法,需要判別的組合數(shù)量為30!,這是一個(gè)非常巨大的數(shù)字。程序首先通過一個(gè)函數(shù)生成了圖數(shù)據(jù),寫入到txt文本中,如圖4.1和圖4.2所示。第一行表示圖中有30個(gè)節(jié)點(diǎn),總共有435條邊數(shù)據(jù)。第二行開始,(x,y,m)表示從節(jié)點(diǎn)x到節(jié)點(diǎn)y的權(quán)重為m。圖4.3為模擬退火算法參數(shù)設(shè)定。 圖 4.1.圖數(shù)據(jù) 圖 4.2.圖數(shù)據(jù) 圖 4.3.模擬退火算法參數(shù) 首先生成一個(gè)初始解,并計(jì)算該解對應(yīng)的TSP回路的總代價(jià),然后經(jīng)過模擬退火算法優(yōu)化,對比優(yōu)化后的解與初始解的總代價(jià)。圖4.4表示模擬退火過程連續(xù)拒絕接受更差解的次數(shù)為50,圖4.5表示連續(xù)拒絕更差解的次數(shù)為5000,即在一次溫度衰減時(shí),嘗試更多次的搜索新解。可以看到,搜索次數(shù)更多時(shí),能夠得到一個(gè)代價(jià)更低的TSP回路。 圖 4.4.模擬退火算法優(yōu)化結(jié)果(拒絕次數(shù)為50) 圖 4.5.模擬退火算法優(yōu)化結(jié)果(拒絕次數(shù)為5000) 4.2 蟻群算法應(yīng)用于求解最短路徑問題的實(shí)踐 在本節(jié)中,介紹通過C語言編寫蟻群算法模擬螞蟻找食物的過程,并通過EasyX圖形庫將蟻群的位置動(dòng)態(tài)的顯示出來。蟻群活動(dòng)的區(qū)域?yàn)橐粋€(gè)600x600像素點(diǎn)的區(qū)域,每個(gè)螞蟻每次可以移動(dòng)一個(gè)像素點(diǎn),移動(dòng)的方向?yàn)橐运鼮橹行牡闹車?個(gè)方向,如下圖4.6所示。圖 4.6.螞蟻移動(dòng)方向示意圖 蟻群在移動(dòng)時(shí),初始化時(shí)去尋找食物,當(dāng)尋找到食物的時(shí)候,就會(huì)尋找窩,尋找窩和尋找食物的過程,均依據(jù)不同信息素來表征方向。在沒有信息素的時(shí)候,大概率直線移動(dòng),但會(huì)以一定概率選取其他方向。圖4.7~圖4.10為蟻群算法在模擬螞蟻找食物過程的結(jié)果圖。 圖 4.7.蟻群算法仿真圖1 圖 4.8.蟻群算法仿真圖2 圖 4.9.蟻群算法仿真圖3 圖 4.10.蟻群算法仿真圖4 該次仿真結(jié)果得到了蟻群移動(dòng)區(qū)域收斂于食物(黃色圓點(diǎn))和窩(紅色圓點(diǎn))之間的路徑,但結(jié)果收斂的效果并不是特別理想。這是因?yàn)樾畔⑺氐膿p耗系數(shù),螞蟻犯錯(cuò)的概率,已經(jīng)遺留信息素的多少,均影響了算法的結(jié)果。而在本次實(shí)驗(yàn)中,均根據(jù)估計(jì)設(shè)定的參數(shù),另一方面算法實(shí)現(xiàn)本身還需進(jìn)一步優(yōu)化修正,因此,算法并沒有收斂于最優(yōu)的路徑。但從整個(gè)結(jié)果的趨勢可以看出,蟻群是能夠依靠信息素使得移動(dòng)區(qū)域收斂于食物和窩之間的路徑,并且接近于直線。
5.
總結(jié)
本文針對常見的最優(yōu)化問題及其應(yīng)用場景進(jìn)行了分析和實(shí)踐。首先,介紹了常用最優(yōu)化方法,包括方法的基本模型,使用步驟,算法特性等。然后,對比分析了P類問題,NP問題,NP完全問題,以及如何通過啟發(fā)式算法去解決優(yōu)化此類非確定性時(shí)間復(fù)雜度問題。最后,在仿真實(shí)踐部分,通過實(shí)現(xiàn)模擬退火算法解決具有NP難度的TSP問題,并得到了一條代價(jià)更低的路徑。通過實(shí)現(xiàn)蟻群算法,模擬了螞蟻找食物的過程,并得到了蟻群移動(dòng)區(qū)域收斂于食物和窩之間區(qū)域的結(jié)果。
【參考文獻(xiàn)】
[1] ThomasH.Cormen, Charles E.Leiserson, Ronald L.Rivest,CliffordStein著.算法導(dǎo)論[M].機(jī)械工業(yè)出版社,2012. [2] 馬學(xué)森,宮帥,朱建,唐昊.動(dòng)態(tài)凸包引導(dǎo)的偏優(yōu)規(guī)劃蟻群算法求解TSP問題[J].通信學(xué)報(bào),2018. [3]https://baike.baidu.com/item/NP%E5%AE%8C%E5%85%A8%E9%97%AE%E9%A2%98/4934286?fr=aladdin—?THE END —
總結(jié)
以上是生活随笔為你收集整理的启发式算法在最优化问题求解中的应用与实践的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 只用一周的业余时间,这位逆天博士生解决了
- 下一篇: 浙江义乌发现桥头遗址,将5000年中华文