楊 柳
(華北水利水電大學(xué)水利學(xué)院,鄭州 450046)
馬斯京根模型是水文上根據(jù)上游河道水情推算下游河道水情的一種應(yīng)用廣泛的河道洪水演算方法,在水庫(kù)調(diào)水和防洪中扮演著十分重要的作用[1]。由GT.麥卡錫于1938年提出該方法,并首次在美國(guó)馬斯京根河使用,故稱為馬斯京根模型[2]。若要更準(zhǔn)確的演算河道洪水流量,其模型參數(shù)的精確性對(duì)演算結(jié)果有著很重要的影響。最早的馬斯京根模型參數(shù)尋優(yōu)有試錯(cuò)法[3]、非線性規(guī)劃法[4]、最小面積法[5]和最小二乘法[6]等,然而這些方法在實(shí)際的洪水演算中較復(fù)雜,且不滿足洪水演算所必需的穩(wěn)定性及高效性。因此,近年來(lái)國(guó)內(nèi)外學(xué)者將人工智能算法引入馬斯京根模型參數(shù)的估算中,也得到了一定的優(yōu)化效果,如傳統(tǒng)蛙跳算法、遺傳算法、差分進(jìn)化算法等[7-9]。然而由于馬斯京根洪水演算法的近似性以及這些人工智能算法本身的缺陷等,使得演算效果并不理想。
混合蛙跳算法(SFLA)是在局部更新的基礎(chǔ)上通過(guò)全局搜索最優(yōu)解的啟發(fā)式協(xié)同搜索算法,已廣泛應(yīng)用于多個(gè)研究領(lǐng)域[10-12]。但傳統(tǒng)SFLA容易陷入局部最優(yōu)且計(jì)算精度不滿足要求,在處理復(fù)雜函數(shù)尋優(yōu)問(wèn)題上結(jié)果并不理想。因此,眾多學(xué)者在處理有約束函數(shù)優(yōu)化問(wèn)題上,對(duì)SFLA進(jìn)行了改進(jìn),如張瀟丹[13]等通過(guò)免疫接種和模擬退火思想引入SFLA中,將有約束函數(shù)轉(zhuǎn)化為無(wú)約束函數(shù),其計(jì)算精度和魯棒性均有所提高;張友華[14]等受PSO算法啟發(fā),在SFLA引入異步時(shí)變學(xué)習(xí)因子,可以明顯改善SFLA的尋優(yōu)效率和精度;這些改進(jìn)方案為混合蛙跳算法在有約束函數(shù)優(yōu)化問(wèn)題上的研究提供了有益的參考依據(jù)。鑒于此,本文在SFLA的基礎(chǔ)上,引入歐式距離對(duì)青蛙個(gè)體重新分組,再經(jīng)rand/1/bin變異算子生成新個(gè)體,增加算法迭代后期的個(gè)體多樣性,將解決全局性優(yōu)化問(wèn)題較好的ε-DE算法[15]與易陷入局部最優(yōu)SFLA算法相結(jié)合,有效避免了算法運(yùn)行中后期陷入局部最優(yōu),將改進(jìn)后算法應(yīng)用于馬斯京根模型參數(shù)優(yōu)化問(wèn)題中,為模型的參數(shù)尋優(yōu)提供新的思路,以期提供流域水文模型的演算效率和精度。
馬斯京根模型目前仍廣泛應(yīng)用于河道洪水驗(yàn)算問(wèn)題中,以水量平衡方程、槽蓄方程分別代替連續(xù)方程和水動(dòng)力學(xué)方程[16]。其轉(zhuǎn)換后的方程為:
(1)
式中:W為槽蓄量,m3;I、Q為河段的入、出流量,m3/s;Q′為示儲(chǔ)流量,m3/s;x為河流比重因子;K為蓄槽系數(shù),h。
對(duì)式(1)進(jìn)行差分,即:
(2)
(3)
c0+c1+c2=1
(4)
由式(3)可知馬斯京根模型要演算河道洪水流量,首先應(yīng)確定參數(shù)K、x或c0、c1、c2的值。若要對(duì)K、x優(yōu)化,則要求K、x呈單一關(guān)系,最早的參數(shù)優(yōu)選方法有試錯(cuò)法、最小二乘法等,在K、x的值確定以后,按照式(3)求解c0、c1、c2,再通過(guò)式(2)進(jìn)行洪水演算。但是這種線性關(guān)系對(duì)實(shí)際的河道洪水演算并不成立,且演算結(jié)果往往誤差較大。因而本文在混合蛙跳算法的基礎(chǔ)上進(jìn)行改進(jìn),直接對(duì)流量演算系數(shù)c0、c1、c2進(jìn)行尋優(yōu),然后利用下式反求K、x。
K=[(c1+c2)/(c1+c0)]Δt
(5)
x=(c1+c0)/2(c1+c2)+c0/(c0-1)
(6)
SFLA首先在可行域內(nèi)生成P只青蛙構(gòu)成初始群體,第i只青蛙代表問(wèn)題的解為Xi=(xi1,xi2,…,xiD),D為解的維數(shù),求解每只青蛙的目標(biāo)函數(shù)初始值f(Xi),將每只青蛙的初始值按遞減順序排序,再將青蛙群劃分成m個(gè)種群,每個(gè)種群含n只青蛙。對(duì)每個(gè)族群,將目標(biāo)初始值最優(yōu)解記為Xb,最差解記為Xw,而在青蛙群體中將函數(shù)最優(yōu)解記為Xg[10]。在算法迭代中,只對(duì)族群中的Xw進(jìn)行更新,其策略為:
Dj=rand(Xb-Xw)
(7)
newXw=oldXw+Dj
(8)
式中:j=1,2,…,D;-Dmax≤Dj≤Dmax,Dmax表示青蛙移動(dòng)最大步長(zhǎng)。更新迭代后,如果新的解newXw優(yōu)于原來(lái)的解oldXw,則代替原來(lái)族群中的解。否則,用Xg代替Xb重復(fù)執(zhí)行更新策略:
Dj=rand(Xg-Xw)
(9)
重復(fù)此更新策略至滿足局部更新次數(shù)。當(dāng)全部子群的局部搜索完成后,合并所有子群中的青蛙,然后根據(jù)函數(shù)適應(yīng)度值降序排列再次劃分子群,最后重復(fù)局部搜索,直至滿足算法結(jié)束條件為止。
Deb比較準(zhǔn)則中規(guī)定種群只在可行域內(nèi)進(jìn)化,為了更好的處理有約束優(yōu)化問(wèn)題,鄭建國(guó)等[15]提出一種改進(jìn)的差分進(jìn)化算法ε-DE,通過(guò)新的比較機(jī)制對(duì)可行域邊界的非可行解進(jìn)行充分利用,在可行域與非可行域兩側(cè)逼近最優(yōu)解。新的比較機(jī)制其思想主要有兩方面:①使得部分逼近可行域邊界的非可行解有勝出的可能性;②隨著迭代次數(shù)的累計(jì),這部分非可行解的信息逐漸減少。本文引入ε-DE算法對(duì)SFLA算法進(jìn)行改進(jìn)。
2.2.1ε-DE算法
(1)基本概念。
①懲罰函數(shù):已知約束等式Fi(X),作轉(zhuǎn)換|Fi(X)|-δ≤0,其中δ為容忍因子,一般取值0.000 1。將各個(gè)體X在第i個(gè)約束條件上的約束違反程度記為Gi[17]:
(10)
個(gè)體約束違反程度通過(guò)下式計(jì)算:
(11)
此時(shí)將約束優(yōu)化問(wèn)題轉(zhuǎn)化為f(X)=F(X)+σG(X),其中σ為罰因子,G(X)為約束違反程度,σG(X)為懲罰項(xiàng)。
②種群約束允許放松程度ε(gen),表示種群進(jìn)化到gen代時(shí),個(gè)體X違反約束程度G(X)的界限[15]。
(12)
式中:θ2表示每進(jìn)化一代,ε(gen)減小的比例,取1.035。
在種群進(jìn)化過(guò)程中,若0 (2)兩青蛙個(gè)體優(yōu)選準(zhǔn)則。約束優(yōu)化問(wèn)題與全局性優(yōu)化問(wèn)題不同,前者是將解的尋找空間劃分為非可行域和可行域。ε-DE的設(shè)計(jì)目有兩個(gè):①找到或接近可行域;②在約束范圍內(nèi)找到最優(yōu)解。為了實(shí)現(xiàn)該算法的設(shè)計(jì)目的,提供一下3個(gè)準(zhǔn)則: 若兩個(gè)均為可行解,則函數(shù)適應(yīng)度值小的勝出;若兩個(gè)均為非可行解,則G(X)小的取勝;若其中一個(gè)為可行解,一個(gè)為非可行解,則分兩種情況討論:情形1:若非可行解為可接受解,則比較二者的函數(shù)適應(yīng)度值,小的勝出;情形2:若非可行解為不可接受解,則可行解勝出。根據(jù)以上比較準(zhǔn)則,可設(shè)計(jì)兩個(gè)青蛙個(gè)體的比較函數(shù)Prior(X1,X2)[18],即: P(X1,X2)= (13) 若函數(shù)Prior(X1,X2)返回值等于1,則X1優(yōu)于X2,返回值等于0,則X1劣于X2。 對(duì)于最優(yōu)解位于可行域邊界的問(wèn)題,利用改進(jìn)算法比較準(zhǔn)則中的第3條第一種情形,期望種群在非可行域與可行域兩側(cè)逐漸逼近最優(yōu)解。對(duì)于可行域占整個(gè)尋優(yōu)空間比例太小的問(wèn)題,利用比較準(zhǔn)則中的第3條第二種情形,期望通過(guò)非可行解的剔除,無(wú)限逼近可行域。 隨著迭代次數(shù)的累計(jì),種群ε(gen)不斷減小,篩選更接近可行域邊界的非可行解提供進(jìn)化相關(guān)信息。當(dāng)ε(gen)=0時(shí),進(jìn)化過(guò)程只在可行域內(nèi)進(jìn)行。 2.2.2 SFLA算法改進(jìn) (1)歐式距離的引入。在SFLA算法中對(duì)青蛙分群按其適應(yīng)度值的高低進(jìn)行。該方法的不足是可能會(huì)使得相距較遠(yuǎn)的個(gè)體分在同一個(gè)族群中,從而影響算法的更新效率,因此本文引入歐式距離對(duì)青蛙劃分族群。 Step1:在初始群體內(nèi)任意選取一只青蛙X; Step2:在初始群體中依次挑選離青蛙X最近的P-1只青蛙,和青蛙X共同組成一個(gè)族群; Step3:在初始種群中除去已挑選的P只青蛙; Step4:重復(fù)Step1~Step3,直至將所有青蛙分為m個(gè)族群,每個(gè)族群的青蛙數(shù)量為n。 (14) 式中:r1、r2和r3為集合{1,2,…,n}中異于i的3個(gè)整數(shù);F是DE控制參數(shù)。 (15) (16) 式中:rand是一個(gè)[0,1]的隨機(jī)數(shù);jrand是[1,n]的一個(gè)隨機(jī)整數(shù);CR為雜交概率。 2.2.3ε-DE-SFLA算法流程 Step1:參數(shù)初始化。 Step1-1:種群規(guī)模P,族群數(shù)量m,族群內(nèi)青蛙數(shù)量n,族群局部更新迭代次數(shù)N,最大允許跳動(dòng)步長(zhǎng)D,全局混合更新迭代次數(shù)G,隨機(jī)初始化蛙群的位置; Step1-2:求解每只青蛙的適應(yīng)度值f(Xi)。根據(jù)歐式距離法將n只青蛙分為m個(gè)族群,并標(biāo)記每個(gè)族群中獲得最優(yōu)適應(yīng)度值的青蛙Xb。 Step2:更新種群。 Step2-1:統(tǒng)計(jì)當(dāng)前種群可行解比例,每次迭代過(guò)程中,在[0,1]區(qū)間內(nèi)任意生成一個(gè)數(shù)rand,若rand值小于此時(shí)種群內(nèi)可行解所占比例時(shí),繼續(xù)下一步,否則跳轉(zhuǎn)到Step2-3; Step2-2:將P只青蛙視為一個(gè)種群,按照式(13)~(16)產(chǎn)生新個(gè)體,將父代和子代合并,從中再次選擇P只青蛙。先在可行解中根據(jù)目標(biāo)函數(shù)值由小到大挑選,若可行解的數(shù)量小于種群規(guī)模時(shí),從非可行解中按G(X)由小到大選擇補(bǔ)齊,達(dá)到種群規(guī)模P為止。跳躍執(zhí)行Step3; Step2-3:按照歐式距離法再將P只青蛙分為m個(gè)族群,并設(shè)置族群,計(jì)K為1; Step2-4:對(duì)第K個(gè)族群,按照式(13)~(16)產(chǎn)生新的青蛙個(gè)體y,并與該族群中的最優(yōu)解Xb比較,按照ε-DE算法更新每個(gè)族群當(dāng)前最優(yōu)解; Step2-5:若未達(dá)到族群設(shè)置最大迭代次數(shù),令K=K+1,當(dāng)K≤m時(shí),跳轉(zhuǎn)執(zhí)行Step2-4。 Step3:若達(dá)到算法結(jié)束條件,輸出種群當(dāng)前最優(yōu)解,退出循環(huán),否則跳轉(zhuǎn)執(zhí)行Step2。 本文選取Griewank和Ackley函數(shù)對(duì)改進(jìn)前后的混合蛙跳算法進(jìn)行測(cè)試分析,為了提高算法計(jì)算結(jié)果的精度,每個(gè)函數(shù)均連續(xù)運(yùn)行20次。設(shè)混合迭代次數(shù)G=100,種群規(guī)模P=30,族群個(gè)數(shù)m=5,族群內(nèi)青蛙個(gè)體n=30,族群內(nèi)進(jìn)化代數(shù)N=10,分別用SFLA和ε-DE-SFLA對(duì)以上兩個(gè)函數(shù)進(jìn)行測(cè)試,計(jì)算結(jié)果見(jiàn)表1,函數(shù)測(cè)試的進(jìn)化曲線見(jiàn)圖1。 表1 函數(shù)測(cè)試尋優(yōu)結(jié)果 圖1 兩種函數(shù)測(cè)試結(jié)果 由表1可見(jiàn),相較于傳統(tǒng)SFLA,ε-DE-SFLA在最優(yōu)解計(jì)算過(guò)程中,尋優(yōu)精度都有明顯的提高。同時(shí),由圖1可知,對(duì)每個(gè)測(cè)試函數(shù),ε-DE-SFLA的進(jìn)化曲線在縱軸上較SFLA下降更快,表明ε-DE-SFLA無(wú)論是在求解精度還是速度上相比SFLA均有明顯提高。 以實(shí)際出流與演算出流的離差平方和最小為判據(jù),則馬斯京根模型參數(shù)優(yōu)化目標(biāo)函數(shù)為: (17) 約束條件為: g1:c0∈[0,1] (18) g2:c1∈[0,1] (19) g3:1-c0-c1∈[0,1] (20) 將g1、g2視為變量取值范圍,對(duì)于約束g3采用懲罰函數(shù)法進(jìn)行處理,則懲罰適應(yīng)值函數(shù)為: minf=F(X)+h(g3(c0,c1)) (21) 式中:h(g3(c0,c1))為懲罰項(xiàng),當(dāng)約束g3滿足時(shí)取值為0,否則取值為106。 于是則可采用ε-DE-SFLA求解馬斯京根模型的參數(shù)。對(duì)于ε-DE-SFLA的參數(shù)設(shè)置為:種群規(guī)模P=100,族群個(gè)數(shù)為m=10,每個(gè)族群更新的次數(shù)Lmax=10,雜交概率CR=1/s,s為自變量空間的維數(shù)。本文仍采用文獻(xiàn)[16]中例2的某一次洪水?dāng)?shù)據(jù)進(jìn)行演算,演算時(shí)段取12 h,并將本文算法與其他文獻(xiàn)的優(yōu)選方法如傳統(tǒng)混合蛙跳算法[7]、加速遺傳算法[16]和最小二乘法[6]等進(jìn)行比較,結(jié)果見(jiàn)表2。同時(shí),采用平均絕對(duì)誤差評(píng)價(jià)以上4種方法的演算精度結(jié)果見(jiàn)表3。 根據(jù)表2、表3可知,改進(jìn)后的-DE-SFLA算法與已有算法相比,平均絕對(duì)誤差更小,表明改進(jìn)后的算法在馬斯京根模型參數(shù)優(yōu)化中具有更好的計(jì)算精度。 表2 實(shí)測(cè)數(shù)據(jù)與演算結(jié)果對(duì)比 m3/s 表3 馬斯京根模型參數(shù)優(yōu)化值與精度評(píng)價(jià) 傳統(tǒng)SFLA中以青蛙個(gè)體的適應(yīng)度值高低進(jìn)行族群劃分,此方法可能會(huì)使群體中距離甚遠(yuǎn)的青蛙劃分在同一族群中,從而導(dǎo)致局部迭代效率低且易陷入局部最優(yōu)。針對(duì)該缺點(diǎn),本文將ε-DE算法與SFLA算法相結(jié)合,同時(shí)引入歐氏距離來(lái)劃分族群,并采用rand/1/bin 的差分雜交變異算子產(chǎn)生新個(gè)體,提高算法局部更新效率。對(duì)于有約束優(yōu)化問(wèn)題,將ε-DE算法與SFLA算法相結(jié)合,可使算法在更新迭代過(guò)程中能充分利用種群中非可行解的信息,始終保持算法在迭代過(guò)程中個(gè)體信息的多樣性,進(jìn)而有效提高算法的精度和運(yùn)行效率。在對(duì)馬斯京根模型參數(shù)優(yōu)化應(yīng)用中,也驗(yàn)證了ε-DE-SFLA算法具備較好的尋優(yōu)能力,體現(xiàn)了該算法在處理有約束優(yōu)化問(wèn)題時(shí)的優(yōu)越性和魯棒性。 □2.3 函數(shù)測(cè)試
3 改進(jìn)蛙跳算法在馬斯京根模型中的應(yīng)用
4 結(jié) 論