綜合能源系統(tǒng)中電動(dòng)汽車參與的優(yōu)化調(diào)度:MATLAB建模與改進(jìn)粒子群算法實(shí)踐)
三年前我剛接手園區(qū)能源管理項(xiàng)目時(shí)第一個(gè)頭疼的問題就是地下車庫(kù)那批電動(dòng)汽車。白天大家上班插槍充電下午三四點(diǎn)空調(diào)和電燈一起上變壓器負(fù)載率逼近上限到了晚上電價(jià)低谷車又集中充電把夜間負(fù)荷曲線頂?shù)脕y七八糟。搗鼓了半年之后我真正意識(shí)到一件事電動(dòng)汽車不是普通的負(fù)荷它既是壓力源也是園區(qū)最靈活的調(diào)節(jié)資源。圍繞這個(gè)思路我在MATLAB里搭了一套以電動(dòng)汽車參與為核心的園區(qū)綜合能源系統(tǒng)優(yōu)化調(diào)度模型并用改進(jìn)粒子群算法來求解。這篇內(nèi)容就把我整個(gè)探索過程中的建模、算法改進(jìn)、代碼實(shí)現(xiàn)和踩坑經(jīng)歷原原本本梳理一遍希望能給正在做類似方向的朋友一些參考。1. 園區(qū)調(diào)度問題的真實(shí)面電動(dòng)汽車是壓力源也是調(diào)節(jié)資源1.1 無序充電帶來的兩個(gè)麻煩我所在的園區(qū)白天有約1000人辦公通勤電動(dòng)車規(guī)模大概40輛左右看著不多但問題一點(diǎn)不小。從一天的負(fù)荷曲線來看園區(qū)典型的雙峰結(jié)構(gòu)本來就緊張?jiān)缟?點(diǎn)到11點(diǎn)是第一個(gè)高峰下午2點(diǎn)到5點(diǎn)是第二個(gè)高峰。電動(dòng)汽車如果無序接入充電時(shí)間基本集中在上班后的半小時(shí)和下班前——尤其是下午16:00到18:00這個(gè)時(shí)段既有辦公負(fù)荷又有空調(diào)負(fù)荷再加上電動(dòng)車充電功率變壓器負(fù)載率經(jīng)常逼近甚至超過額定值的95%。這種狀態(tài)下變壓器壽命會(huì)加速縮短保護(hù)裝置誤動(dòng)的概率也會(huì)增加。夜間的情況更反直覺。我一開始以為夜間的電價(jià)低谷會(huì)讓電動(dòng)汽車充電變得劃算又安全實(shí)際上大量車輛在下班后同時(shí)連接慢充樁夜間的負(fù)荷曲線反而被抬成了一個(gè)次高峰。雖然電價(jià)便宜但園區(qū)的功率容量是有上限的——清晨這一波充電高峰會(huì)直接影響第二天光伏出力的消納空間。換句話說無序充電不僅制造新的峰還會(huì)占用清潔能源的消納窗口這是很多人最開始沒有想到的。1.2 為什么要站在綜合能源系統(tǒng)的角度看電動(dòng)汽車單純做有序充電也能緩解問題比如錯(cuò)峰充電、限功率充電。但園區(qū)本身是一個(gè)電、熱、氣多能源耦合的小系統(tǒng)光伏發(fā)電、燃?xì)廨啓C(jī)發(fā)電、余熱回收供熱、儲(chǔ)能電池調(diào)峰每一個(gè)環(huán)節(jié)都彼此影響。如果把電動(dòng)汽車單獨(dú)拎出來做充電管理那它頂多算一個(gè)受控負(fù)荷但如果把它放到綜合能源系統(tǒng)的視角里電動(dòng)汽車完全可以變成一個(gè)移動(dòng)儲(chǔ)能單元——在某些時(shí)段放電回送支撐電網(wǎng)峰值在另一個(gè)時(shí)段充電吸收低谷富余電能。這樣電動(dòng)汽車就從一個(gè)壓力源變成了系統(tǒng)的調(diào)節(jié)資源。這也是我做這個(gè)項(xiàng)目的核心思路在MATLAB里建立包含光伏、燃?xì)廨啓C(jī)、儲(chǔ)能電池和電動(dòng)汽車集群的園區(qū)綜合能源模型以運(yùn)行經(jīng)濟(jì)性和電網(wǎng)峰谷差為目標(biāo)用改進(jìn)粒子群算法求一個(gè)24小時(shí)的優(yōu)化調(diào)度方案重點(diǎn)回答電動(dòng)汽車在什么時(shí)段充、什么時(shí)段放、功率定多少這個(gè)問題。2. 系統(tǒng)建模把電、熱、氣、車四個(gè)維度統(tǒng)一到一張調(diào)度表里2.1 園區(qū)的能量拓?fù)渑c調(diào)度邊界建模第一步是梳理系統(tǒng)的物理結(jié)構(gòu)。我這里簡(jiǎn)化處理的園區(qū)拓?fù)淙缦峦獠侩娋W(wǎng)通過變壓器接入園區(qū)母線作為主供電源光伏陣列PV直接并入母線發(fā)電優(yōu)先自用富余上網(wǎng)微型燃?xì)廨啓C(jī)GT是可控發(fā)電單元發(fā)電余熱進(jìn)入余熱回收裝置供熱儲(chǔ)能電池ESS負(fù)責(zé)短時(shí)削峰填谷SOC狀態(tài)需要實(shí)時(shí)追蹤電動(dòng)汽車集群EV作為可調(diào)負(fù)載/可調(diào)電源通過充電樁與母線相連熱負(fù)荷供暖生活熱水由余熱回收和燃?xì)忮仩t共同供給。這種拓?fù)洳⒉粡?fù)雜但已經(jīng)能夠覆蓋綜合能源系統(tǒng)的主要特征電能流動(dòng)與熱能流動(dòng)存在耦合燃?xì)廨啓C(jī)發(fā)電余熱供熱電動(dòng)汽車接入點(diǎn)與電網(wǎng)交互存在雙向性儲(chǔ)能和電動(dòng)汽車兩類可平移負(fù)荷在同一母線上博弈。調(diào)度邊界是功率平衡、設(shè)備容量、SOC狀態(tài)、EV用戶電量需求四類約束時(shí)間長(zhǎng)度取24小時(shí)分辨率1小時(shí)。這個(gè)分辨率對(duì)園區(qū)級(jí)調(diào)度來說足夠了再細(xì)到15分鐘反而是后面日內(nèi)修正環(huán)節(jié)該做的事情。實(shí)際的優(yōu)化變量數(shù)量并不夸張但維度和物理約束的組合會(huì)讓問題變得相當(dāng)棘手這也正是選擇啟發(fā)式算法而不是傳統(tǒng)解析法的直接原因。2.2 主要設(shè)備的出力與成本模型光伏出力我建議不直接用復(fù)雜的天氣輻射模型而是采用典型日照條件下的歸一化出力曲線配合實(shí)際裝機(jī)容量換算。日照數(shù)據(jù)從當(dāng)?shù)貥?biāo)準(zhǔn)氣象年數(shù)據(jù)提取或者干脆用氣象機(jī)構(gòu)公開數(shù)據(jù)。原因是日前調(diào)度階段光伏預(yù)測(cè)誤差本來就比較大過度精細(xì)的模型沒有意義只會(huì)讓優(yōu)化時(shí)間變長(zhǎng)。光伏的成本在調(diào)度模型中通常不計(jì)入運(yùn)行成本因?yàn)橐灰l(fā)、發(fā)多少完全由光照條件決定不需要優(yōu)化器去決策。燃?xì)廨啓C(jī)的核心是燃料成本函數(shù)。理論上二次函數(shù)形式最精確但實(shí)際工程中我更愿意用一個(gè)分段線性燃料成本曲線。原因很簡(jiǎn)單二次函數(shù)在MATLAB里如果和粒子群結(jié)合很容易出現(xiàn)數(shù)值問題分段線性化之后魯棒性好很多。燃?xì)廨啓C(jī)的出力范圍也有講究不能只設(shè)上下限還應(yīng)該加最小穩(wěn)定運(yùn)行約束——很多機(jī)組在低于30%額定出力時(shí)會(huì)熄火或者效率驟降這個(gè)約束在優(yōu)化中必須體現(xiàn)。儲(chǔ)能電池的模型核心就是SOC遞推SOC(t1) SOC(t) 充電效率 × 充電功率 × 時(shí)間 / 電池容量 - 放電功率 × 時(shí)間 / (放電效率 × 電池容量)這個(gè)遞推式有一堆工程細(xì)節(jié)要注意儲(chǔ)能不能同時(shí)充放電充電效率和放電效率不是同一個(gè)值SOC上下限留5%到10%的冗余否則電池壽命損耗會(huì)被低估。我在實(shí)際代碼里用了一個(gè)布爾標(biāo)志位把同時(shí)充放這種情況直接判為不可行而不是靠罰函數(shù)慢慢去糾正——罰函數(shù)能減少錯(cuò)誤解的競(jìng)爭(zhēng)力但直接禁止更干凈利落。2.3 電動(dòng)汽車集群的可調(diào)度潛力模型電動(dòng)汽車建模是本項(xiàng)目的關(guān)鍵也是最容易被做壞的環(huán)節(jié)。如果要逐輛車建模40輛車就有40個(gè)SOC狀態(tài)變量再加上充放電決策變量粒子群維數(shù)會(huì)急劇膨脹求解時(shí)間從幾分鐘變成幾十分鐘而且結(jié)果還不一定更好。我的做法是把車輛按出行規(guī)律聚類成兩到三個(gè)群通勤群早上8點(diǎn)到達(dá)下午17點(diǎn)離開在園停放9小時(shí)行駛電量需求約20kWh公務(wù)群全天分散在園區(qū)停放時(shí)段碎片化數(shù)量少可調(diào)度潛力低物流群可選夜間集中充電白天沒有調(diào)度需求。每個(gè)群在調(diào)度周期內(nèi)有一個(gè)聚合的充電功率上下限聚合可放電功率上下限以及一個(gè)總SOC約束——即調(diào)度結(jié)束時(shí)每個(gè)群的總電量必須不低于用戶期望值否則用戶根本不答應(yīng)參與調(diào)度。這個(gè)約束在目標(biāo)函數(shù)里用懲罰項(xiàng)處理但罰的方式有講究后面章節(jié)會(huì)細(xì)說。EV放電還有一個(gè)關(guān)鍵參數(shù)電池衰減補(bǔ)償成本。如果沒有這個(gè)成本項(xiàng)優(yōu)化算法會(huì)傾向于讓電動(dòng)汽車頻繁放電來賺取峰谷價(jià)差但實(shí)際中用戶電池壽命損失是實(shí)打?qū)嵉腻X必須折算進(jìn)目標(biāo)函數(shù)。常用做法是參考電池循環(huán)壽命曲線把每次放電量折算成等效循環(huán)次數(shù)再乘以電池度電更換成本。這個(gè)模型一定要在跑優(yōu)化前就定好否則后面對(duì)比方案的時(shí)候你會(huì)發(fā)現(xiàn)結(jié)果完全不可比。2.4 目標(biāo)函數(shù)與約束條件匯總目標(biāo)函數(shù)取調(diào)度周期內(nèi)總運(yùn)行成本最小min C_total C_buy C_gas C_ess_deg C_ev_deg C_penalty其中C_buy是向電網(wǎng)購(gòu)電費(fèi)用分時(shí)電價(jià)售電收益在這里作為負(fù)成本計(jì)入C_gas是燃?xì)廨啓C(jī)燃料成本C_ess_deg是儲(chǔ)能循環(huán)損耗折算成本C_ev_deg是電動(dòng)汽車放電衰減補(bǔ)償成本C_penalty是各種約束違反的懲罰項(xiàng)包括功率不平衡量、SOC越限、EV用戶電量需求不滿足等。約束條件包括母線功率平衡光伏出力 電網(wǎng)交換 燃?xì)廨啓C(jī)出力 儲(chǔ)能放電 EV放電 負(fù)荷 儲(chǔ)能充電 EV充電設(shè)備出力上下限光伏上限由預(yù)測(cè)決定燃?xì)廨啓C(jī)、儲(chǔ)能、EV都有額定功率范圍爬坡率約束燃?xì)廨啓C(jī)在相鄰時(shí)段的出力變化量有限制SOC約束儲(chǔ)能和EV集群的SOC保持在可行區(qū)間EV集群電量需求約束調(diào)度周期結(jié)束時(shí)EV集群總電量不低于當(dāng)日到達(dá)時(shí)的初始電量減去行駛消耗加上用戶期望充電量。有了目標(biāo)函數(shù)和約束集合優(yōu)化問題在數(shù)學(xué)上就可以聲明為一個(gè)高維非線性約束優(yōu)化問題。接下來關(guān)鍵的轉(zhuǎn)折點(diǎn)在于直接用通用求解器還是自寫啟發(fā)式算法我的判斷是對(duì)于這種帶有大量非凸約束、非連續(xù)變量關(guān)系的調(diào)度問題粒子群這類元啟發(fā)式方法在工程落地上更靈活也更容易把工程經(jīng)驗(yàn)一點(diǎn)點(diǎn)塞進(jìn)去。3. 標(biāo)準(zhǔn)PSO的瓶頸為什么直接拿來解調(diào)度問題會(huì)翻車3.1 粒子群算法的搜索邏輯粒子群算法PSO最早可以看作對(duì)鳥群覓食行為的模擬。在優(yōu)化問題里每一個(gè)粒子代表一組決策變量一個(gè)候選解粒子的位置就是一組解粒子的速度決定了它在解空間里移動(dòng)的方向和步長(zhǎng)。每次迭代粒子會(huì)朝兩個(gè)方向飛一個(gè)是自己歷史上找到過的最好解個(gè)體最優(yōu)pbest一個(gè)是整個(gè)群體歷史上找到過的最好解全局最優(yōu)gbest。標(biāo)準(zhǔn)的速度更新公式為v(k1) w × v(k) c1 × r1 × (pbest - x(k)) c2 × r2 × (gbest - x(k))位置更新為x(k1) x(k) v(k1)看公式可能會(huì)覺得復(fù)雜但類比起來很簡(jiǎn)單慣性權(quán)重w就是保持原來飛行方向的程度c1×r1×(pbest-x)就是我過去在這里找到過好東西拉我回去看看c2×r2×(gbest-x)就是聽說群體在那邊發(fā)現(xiàn)了更好的去看看。三者合力粒子就在解空間里跳來跳去像一群人在一個(gè)陌生城市里找最好吃的餐館既參考自己的喜好也參考大眾口碑。3.2 高維調(diào)度問題的三個(gè)坑園區(qū)優(yōu)化調(diào)度的維度通常是幾十維到一兩百維。比如我的模型里決策變量是24時(shí)段×4類功率 96維。維度一高標(biāo)準(zhǔn)PSO的弱點(diǎn)會(huì)立刻放大。第一個(gè)坑是早熟收斂。粒子在迭代初期會(huì)迅速向某個(gè)局部最優(yōu)區(qū)靠攏隨機(jī)初始種群很快就會(huì)喪失多樣性。我實(shí)測(cè)標(biāo)準(zhǔn)PSO在迭代大約50次以后群體內(nèi)的粒子基本趨于一致后續(xù)200多次迭代幾乎沒有任何改進(jìn)。這意味著一不留神就得到局部最優(yōu)而不是全局最優(yōu)。第二個(gè)坑是約束處理。調(diào)度問題里有一大堆等式和不等式約束如果約束處理方式不當(dāng)算法會(huì)在不可行解的空間里死循環(huán)。常規(guī)做法是用罰函數(shù)但罰系數(shù)設(shè)置不當(dāng)要么罰得太輕約束嚴(yán)重違反的解仍然有競(jìng)爭(zhēng)力要么罰得太重優(yōu)化過程變得病態(tài)粒子幾乎無法移動(dòng)。第三個(gè)坑是參數(shù)敏感。c1、c2、w、種群規(guī)模、最大迭代次數(shù)每個(gè)參數(shù)都對(duì)結(jié)果有影響。不同場(chǎng)景、不同目標(biāo)函數(shù)最優(yōu)參數(shù)組合完全不同。我見過一篇論文用某組參數(shù)取得了漂亮結(jié)果但換到自己的數(shù)據(jù)上結(jié)果完全對(duì)不上。這是PSO最讓人頭疼的地方——沒有萬能的參數(shù)組合。3.3 我采用的三個(gè)改進(jìn)方向針對(duì)這三個(gè)坑我的改進(jìn)思路也有三個(gè)方向每一個(gè)專門解決一個(gè)具體問題。第一用自適應(yīng)慣性權(quán)重替代固定權(quán)重。標(biāo)準(zhǔn)的做法是線性遞減w從0.9降到0.4。我的改進(jìn)是分段非線性遞減w(t) w_min (w_max - w_min) × exp(-β × t / T)指數(shù)衰減的優(yōu)點(diǎn)是前期保持較大權(quán)重讓粒子有更強(qiáng)的全局搜索能力后期權(quán)重快速下降促進(jìn)局部精細(xì)搜索。實(shí)測(cè)同樣迭代300次這種遞減方式比線性遞減的平均最優(yōu)值好2%到5%幅度不算大但勝在穩(wěn)定。第二引入變異機(jī)制來維持種群多樣性。每輪迭代結(jié)束后按一個(gè)小概率0.05左右隨機(jī)選擇部分粒子的部分維度重新隨機(jī)初始化。這樣做的用意是如果粒子群陷入一個(gè)局部極值變異可以讓個(gè)別粒子跳出來重新開辟搜索方向。這個(gè)操作來自遺傳算法的啟發(fā)但在PSO里實(shí)現(xiàn)成本極低代碼量很小后面會(huì)給出。第三邊界越限時(shí)做速度回彈而不是直接裁剪。調(diào)度問題的決策變量都有物理限幅比如充電功率不能超過充電樁額定值。很多代碼的做法是越界時(shí)把位置拉到邊界。這會(huì)讓粒子在邊界處反復(fù)碰撞、失去速度信息收斂變慢。我的處理是越界時(shí)不僅裁剪位置同時(shí)把速度反向回彈保留搜索勢(shì)頭。提示這三個(gè)改進(jìn)的本質(zhì)都是保住種群多樣性、控制收斂節(jié)奏。如果你的問題是低維度比如10維以下標(biāo)準(zhǔn)PSO可能已經(jīng)足夠但一旦上了96維甚至更高這三個(gè)改進(jìn)幾乎是必須的。3.4 改進(jìn)PSO的完整求解流程整個(gè)求解流程分六步初始化讀入負(fù)荷、光伏、EV參數(shù)設(shè)置算法參數(shù)生成初始種群計(jì)算適應(yīng)度調(diào)用目標(biāo)函數(shù)計(jì)算每個(gè)粒子的總成本和懲罰項(xiàng)更新個(gè)體最優(yōu)與全局最優(yōu)按公式更新速度和位置做變異與越界回彈處理重新計(jì)算適應(yīng)度循環(huán)直到達(dá)到最大迭代次數(shù)輸出全局最優(yōu)解繪制功率曲線和收斂曲線。這套改進(jìn)PSO在每個(gè)算例上大概運(yùn)行5到10秒相比調(diào)用商用求解器動(dòng)輒一分鐘以上的耗時(shí)優(yōu)勢(shì)很明顯。更重要的是它讓我可以在代碼里靈活嵌入各種工程約束這是通用優(yōu)化求解器很難直接做到的。4. MATLAB實(shí)現(xiàn)中的關(guān)鍵代碼骨架與參數(shù)配置4.1 程序結(jié)構(gòu)設(shè)計(jì)整個(gè)仿真程序我拆成5個(gè)文件main.m總控初始化參數(shù)調(diào)用迭代函數(shù)輸出結(jié)果loadData.m讀入負(fù)荷曲線、光伏預(yù)測(cè)曲線、分時(shí)電價(jià)、EV參數(shù)objective.m目標(biāo)函數(shù)含約束懲罰IPSO.m改進(jìn)粒子群算法主循環(huán)plotResults.m繪圖對(duì)比不同方案結(jié)果。這種拆法沒有太多花哨但對(duì)調(diào)試非常友好。我在寫objective.m的時(shí)候加了一個(gè)全局調(diào)試開關(guān)可以輸出每一部分的成本明細(xì)排查為什么某個(gè)時(shí)段調(diào)度結(jié)果看起來不對(duì)勁——這個(gè)習(xí)慣幫我省了很多時(shí)間。比如有一次我發(fā)現(xiàn)某個(gè)時(shí)段燃?xì)廨啓C(jī)出力明顯偏高查明細(xì)才發(fā)現(xiàn)是爬坡率約束寫反了方向這類問題如果不拆解目標(biāo)函數(shù)光看總成本根本找不出來。4.2 決策變量編碼如何用一條96維向量描述一天的調(diào)度決策變量的編碼是整個(gè)優(yōu)化問題的關(guān)鍵。我的做法是使用有符號(hào)功率x [P_grid(1..24), P_GT(1..24), P_ESS(1..24), P_EV(1..24)]每個(gè)功率值都定義清楚物理量的方向和幅值電網(wǎng)交換功率P_grid正值表示購(gòu)電負(fù)值表示售電允許余電上網(wǎng)時(shí)燃?xì)廨啓C(jī)出力P_GT恒為非負(fù)儲(chǔ)能功率P_ESS正值放電負(fù)值充電電動(dòng)汽車集群功率P_EV正值放電V2G負(fù)值充電。這樣編碼的直接好處是儲(chǔ)能和電動(dòng)汽車同一時(shí)段不能同時(shí)充放電這個(gè)約束被化簡(jiǎn)為單變量符號(hào)判斷目標(biāo)函數(shù)里不再需要額外的布爾邏輯。壞處是功率平衡等式方程形式上有負(fù)號(hào)參與需要使用者在實(shí)現(xiàn)時(shí)小心翼翼。我在objective.m里用了一個(gè)子函數(shù)來處理功率平衡把四個(gè)變量的符號(hào)判斷封裝起來返回不平衡量和懲罰項(xiàng)。這個(gè)封裝的好處是一旦負(fù)荷或光伏預(yù)測(cè)數(shù)據(jù)更新只需要替換一個(gè)輸入向量不用動(dòng)主邏輯。4.3 目標(biāo)函數(shù)與約束懲罰的核心實(shí)現(xiàn)目標(biāo)函數(shù)的核心成本計(jì)算代碼如下% 購(gòu)電成本分時(shí)電價(jià) energy_price params.price_buy; % 24x1 向量 P_purchase max(P_grid, 0); % 大于0為購(gòu)電 cost_buy sum(P_purchase .* energy_price); % 售電收益余電上網(wǎng)負(fù)數(shù)計(jì)入成本 sell_price params.price_sell; % 24x1 向量 P_sell min(P_grid, 0); % 小于0為售電 profit_sell sum(-P_sell .* sell_price); % 燃?xì)廨啓C(jī)燃料成本分段線性簡(jiǎn)化 fuel_slope params.gt_fuel_slope; cost_gas sum(P_GT .* fuel_slope); % 儲(chǔ)能循環(huán)損耗折算 cost_ess_deg params.ess_deg_coef * sum(abs(P_ESS)); % EV放電衰減補(bǔ)償只有放電才計(jì)衰減 cost_ev_deg params.ev_deg_coef * sum(max(P_EV, 0));這里有一個(gè)細(xì)節(jié)容易踩坑儲(chǔ)能循環(huán)損耗如果按sum(abs(P_ESS))來算充電也會(huì)計(jì)損耗但從工程角度看損耗主要發(fā)生在充放循環(huán)轉(zhuǎn)換時(shí)充電和放電各半分更合理。我最終用的是0.5×ess_deg_coef×sum(abs(P_ESS))這只是一個(gè)簡(jiǎn)化模型但比完全不考慮損耗要好很多。約束懲罰部分% 功率平衡約束差值累加歸一化后乘一個(gè)大的懲罰系數(shù) power_balance P_PV P_grid P_GT P_ESS P_EV - load; penalty_balance 1e4 * sum(abs(power_balance)); % SOC末狀態(tài)約束 if abs(soc_end - soc_target) soc_tol penalty_soc 1e5 * abs(soc_end - soc_target); else penalty_soc 0; end % EV集群電量需求約束 ev_total_soc sum(EV_power * dt EV_init_soc); if ev_total_soc ev_required_soc penalty_ev 1e6 * (ev_required_soc - ev_total_soc); else penalty_ev 0; end罰系數(shù)的大小的選擇很有講究。罰得太輕算法會(huì)輸出一個(gè)雖然違反約束但總成本更低的漂亮解罰得太重粒子會(huì)非??咕芴剿鬟吔缡諗孔兟N液髞碛昧艘粋€(gè)策略懲罰系數(shù)乘以約束違反量的平方而不是一次方。這樣小幅違反時(shí)懲罰溫和大幅違反時(shí)懲罰急劇增加兼顧了探索性和可行性。注意罰函數(shù)是所有啟發(fā)式算法工程化中最臟最累的活但也是決定結(jié)果能否落地的那條線。建議調(diào)試時(shí)先把罰系數(shù)調(diào)大確認(rèn)所有約束都被滿足之后再逐步調(diào)小到剛好不違反的程度。4.4 改進(jìn)PSO主循環(huán)的MATLAB代碼主循環(huán)分為幾個(gè)核心模塊。第一個(gè)是初始化% 初始化粒子位置和速度 numVar 96; % 4類功率 × 24時(shí)段 lb [grid_lb * ones(1,24), gt_lb * ones(1,24), ... ess_lb * ones(1,24), ev_lb * ones(1,24)]; ub [grid_ub * ones(1,24), gt_ub * ones(1,24), ... ess_ub * ones(1,24), ev_ub * ones(1,24)]; x lb rand(popSize, numVar) .* (ub - lb); v 0.1 * (ub - lb) .* randn(popSize, numVar);速度初始化的細(xì)節(jié)很重要。如果初始速度全部為零粒子的第一輪移動(dòng)完全由隨機(jī)擾動(dòng)決定群體探索范圍會(huì)很窄用標(biāo)準(zhǔn)差為范圍10%的高斯隨機(jī)數(shù)來初始化能讓粒子在開始的幾步內(nèi)就甩開搜索空間的大部分區(qū)域。主迭代循環(huán)如下for t 1:maxIter % 自適應(yīng)慣性權(quán)重 w w_min (w_max - w_min) * exp(-beta * t / maxIter); % 更新所有粒子 for i 1:popSize v(i,:) w * v(i,:) c1 * rand(1, numVar) .* (pbest(i,:) - x(i,:)) ... c2 * rand(1, numVar) .* (gbest - x(i,:)); x(i,:) x(i,:) v(i,:); % 界約束裁剪到邊界并反向回彈速度 for d 1:numVar if x(i,d) lb(d) v(i,d) -v(i,d); x(i,d) lb(d) 0.05*(ub(d)-lb(d))*rand; elseif x(i,d) ub(d) v(i,d) -v(i,d); x(i,d) ub(d) - 0.05*(ub(d)-lb(d))*rand; end end % 變異隨機(jī)重置部分維度增加多樣性 if rand pm dims randi(numVar, 1, round(numVar*0.3)); x(i,dims) lb(dims) rand(size(dims)) .* (ub(dims)-lb(dims)); v(i,dims) 0; end % 評(píng)估新位置 cost objective(x(i,:), params); if cost pbest_val(i) pbest(i,:) x(i,:); pbest_val(i) cost; end end % 更新全局最優(yōu) [min_cost, best_idx] min(pbest_val); if min_cost gbest_val gbest pbest(best_idx,:); gbest_val min_cost; end % 記錄收斂曲線 gbest_curve(t) gbest_val; end這段代碼跑起來約5到10秒。我測(cè)試過用MATLAB的并行計(jì)算工具箱給粒子加parfor速度能提升3到4倍但粒子數(shù)量本身不大50個(gè)收益有限因此我最后還是用普通for循環(huán)便于調(diào)試。如果你的粒子規(guī)模到了100以上建議直接用parfor改動(dòng)很小。4.5 關(guān)鍵參數(shù)設(shè)置一覽我把常用的參數(shù)配置整理成表格方便直接套用參數(shù)取值說明種群規(guī)模 popSize50維度高時(shí)可增加到80最大迭代次數(shù) maxIter300觀察收斂曲線后調(diào)整慣性權(quán)重 w_min / w_max0.4 / 0.9大權(quán)重全局搜索小權(quán)重局部搜索權(quán)重衰減系數(shù) beta3.0前期慢降后期陡降學(xué)習(xí)因子 c1 / c21.5 / 1.5個(gè)體經(jīng)驗(yàn)與群體經(jīng)驗(yàn)同等重視變異概率 pm0.05太小無效果太大震蕩嚴(yán)重罰函數(shù)基礎(chǔ)系數(shù)1e4可調(diào)建議用平方項(xiàng)注意這個(gè)表不是銀彈。每個(gè)園區(qū)場(chǎng)景的具體參數(shù)可能要微調(diào)尤其是當(dāng)你把熱負(fù)荷也納入電力調(diào)度時(shí)燃?xì)廨啓C(jī)出力和熱負(fù)荷之間的耦合會(huì)讓c1、c2的組合更加敏感。我一般會(huì)在正式跑優(yōu)化前做一組參數(shù)掃描具體做法是選三組參數(shù)各跑5次看均值和標(biāo)準(zhǔn)差挑最穩(wěn)的那組。5. 仿真算例一個(gè)典型園區(qū)的優(yōu)化調(diào)度結(jié)果分析5.1 算例場(chǎng)景與基礎(chǔ)數(shù)據(jù)我的仿真算例設(shè)在一個(gè)典型中型園區(qū)上。基礎(chǔ)數(shù)據(jù)如下項(xiàng)目數(shù)值光伏裝機(jī)100 kWp燃?xì)廨啓C(jī)200 kW儲(chǔ)能電池100 kWh / 50 kW常規(guī)負(fù)荷峰值280 kW下午時(shí)段電動(dòng)汽車40輛通勤群30輛 公務(wù)群10輛調(diào)度周期24小時(shí)分辨率1小時(shí)光伏出力曲線大概是早上8點(diǎn)開始爬升中午12點(diǎn)到下午2點(diǎn)達(dá)到峰值約85 kW下午5點(diǎn)后快速歸零。園區(qū)常規(guī)負(fù)荷呈現(xiàn)明顯的辦公雙峰特征峰值出現(xiàn)在上午10點(diǎn)和下午16點(diǎn)。分時(shí)電價(jià)設(shè)定為峰、平、谷三段峰段8:00-11:00和14:00-17:00電價(jià)1.1元/kWh平段6:00-8:00和11:00-14:00和17:00-21:00電價(jià)0.7元/kWh谷段21:00-次日6:00電價(jià)0.3元/kWh。EV集群在白天有較強(qiáng)的放電能力車輛停放園區(qū)夜間充電需求強(qiáng)。我設(shè)計(jì)了三種對(duì)比方案方案A無序充電即所有EV按到達(dá)時(shí)間盡力充不做任何調(diào)度方案B有序充電儲(chǔ)能調(diào)度用標(biāo)準(zhǔn)PSO求解但不允許EV放電僅單向充電方案C完整調(diào)度允許EV雙向充放電用改進(jìn)PSO求解。5.2 三種策略的調(diào)度結(jié)果對(duì)比運(yùn)行結(jié)果整理如下方案總運(yùn)行成本(元/日)峰值負(fù)荷(kW)峰谷差(kW)EV參與放電次數(shù)A 無序充電32303481860B 單相有序充電儲(chǔ)能27803221520C 雙向調(diào)度改進(jìn)PSO26953101388方案A結(jié)果很直觀總成本最高峰荷最高峰谷差最大。購(gòu)電成本一大半來自白天電價(jià)高峰時(shí)段的無序充電負(fù)荷這就是峰上加峰在數(shù)據(jù)上的直接體現(xiàn)。方案B把儲(chǔ)能和充電時(shí)段錯(cuò)開了成本下降了450元峰荷從348 kW降到322 kW。這說明僅靠單向有序充電儲(chǔ)能就已經(jīng)能讓園區(qū)跑出不少經(jīng)濟(jì)效益。但EV仍然只是被動(dòng)的充電負(fù)荷沒有發(fā)揮放電價(jià)值。方案C的成本比B又低了85元雖然數(shù)值不大但峰荷和峰谷差的優(yōu)化更加明顯。EV集群的放電集中在下午16:00-17:00和傍晚18:00-19:00兩個(gè)時(shí)段恰好是園區(qū)負(fù)荷最高或電價(jià)較高的時(shí)段夜間21:00之后EV集中充電利用了低谷電價(jià)優(yōu)勢(shì)。表格右下角EV參與放電次數(shù)這個(gè)指標(biāo)是我額外加的目的是突出方案C與方案B真正的本質(zhì)區(qū)別——它證明了改進(jìn)PSO不僅找到了成本更優(yōu)的解還找到了一個(gè)在工程上更合理的解即EV放電行為刻意避開負(fù)荷曲線的尖峰而不是隨便亂放。5.3 收斂性對(duì)比改進(jìn)PSO的優(yōu)勢(shì)到底在哪為了驗(yàn)證改進(jìn)PSO不是因?yàn)檫\(yùn)氣好才找到更好的解我做了20次重復(fù)運(yùn)行的穩(wěn)定性測(cè)試。標(biāo)準(zhǔn)PSO的20次運(yùn)行最優(yōu)值均值是2720元標(biāo)準(zhǔn)差是38元改進(jìn)PSO的均值是2698元標(biāo)準(zhǔn)差只有12元。這個(gè)標(biāo)準(zhǔn)差縮小了接近70%——說明改進(jìn)的變異機(jī)制和自適應(yīng)權(quán)重確實(shí)讓算法的搜索行為穩(wěn)定了很多不再一次好一次壞。從收斂曲線看前50次迭代兩者差別不大改進(jìn)PSO的收斂甚至稍慢一些這是因?yàn)樽儺悪C(jī)制在前期會(huì)打破粒子向pbest和gbest靠攏的勢(shì)頭。到100次迭代之后標(biāo)準(zhǔn)PSO的曲線基本走平改進(jìn)PSO還在緩慢下降最終在250次左右穩(wěn)定。這種現(xiàn)象解釋了為什么說標(biāo)準(zhǔn)PSO容易早熟——前期的快速收斂代價(jià)是后期的停滯而變異和自適應(yīng)權(quán)重正是對(duì)著這個(gè)死穴去的。我還對(duì)比了一個(gè)細(xì)節(jié)把gbest_curve輸出看最終結(jié)果對(duì)應(yīng)的調(diào)度功率曲線是否物理可解釋。標(biāo)準(zhǔn)PSO給出的EV放電時(shí)段偶爾會(huì)出現(xiàn)凌晨3點(diǎn)放電、白天8點(diǎn)充電這種明顯反直覺的決策雖然罰函數(shù)沒有觸發(fā)大漏洞但一眼就能看出這不是一個(gè)真正合理的調(diào)度。改進(jìn)PSO的結(jié)果則基本符合直覺白天峰段放電夜間谷段充電儲(chǔ)能的動(dòng)作集中在電價(jià)邊界上。這個(gè)工程合理性是很多論文里不會(huì)提、但實(shí)際決策時(shí)特別重要的指標(biāo)。6. 從仿真到落地幾個(gè)被論文忽略的坑與我踩過的雷6.1 粒子群參數(shù)敏感性遠(yuǎn)比想象中高我在做參數(shù)掃描的時(shí)候發(fā)現(xiàn)一個(gè)現(xiàn)象c1和c2如果都不超過1.0粒子基本只能在局部小范圍內(nèi)蠕動(dòng)收斂速度極慢c1和c2都超過2.5速度會(huì)發(fā)散位置頻繁越界目標(biāo)函數(shù)數(shù)值溢出。最常見的有效區(qū)間是c1和c2都取1.2到2.0之間的值。但每個(gè)場(chǎng)景最優(yōu)的值不一樣所以我建議在正式跑優(yōu)化前先用三到五組參數(shù)分別跑幾次挑一組最穩(wěn)的再做最終優(yōu)化。這一步花不了幾分鐘能省下后面很多不必要的反復(fù)。另外一個(gè)容易踩的坑是w_min w_max這種錯(cuò)誤配置。如果固定慣性權(quán)重為單一值粒子會(huì)失去全局搜索與局部搜索的平衡。我有一次調(diào)試時(shí)忘記更新w導(dǎo)致收斂曲線一直很差查了半天才發(fā)現(xiàn)是參數(shù)沒更新進(jìn)去。后來我在代碼里加了一句assert(w_max w_min)直接在運(yùn)行時(shí)就把問題抓出來。6.2 EV電池衰減模型直接決定調(diào)度策略的合理性圖省事把EV放電衰減成本設(shè)為零的后果在仿真里很隱蔽算法會(huì)調(diào)用大量EV放電免費(fèi)賺峰谷價(jià)差總成本看起來很低但實(shí)際落地時(shí)用戶根本不會(huì)買賬——因?yàn)殡姵厝萘克p是不可逆的。你必須真實(shí)地估算每次放電的壽命損失并計(jì)入成本否則調(diào)度方案只是一個(gè)美麗的數(shù)字游戲。我的做法是查電池規(guī)格書上的循環(huán)壽命曲線得到一個(gè)簡(jiǎn)化的每kWh放電成本系數(shù)。比如某款電池循環(huán)壽命1500次容量50kWh電池更換成本約7萬那么每次完整循環(huán)約50kWh的成本是70000/1500約為46.7元折合每kWh約0.93元。把這個(gè)系數(shù)作為EV放電的懲罰項(xiàng)加進(jìn)目標(biāo)函數(shù)算法自然會(huì)減少不必要的放電頻率調(diào)度結(jié)果從頻繁充放變成只在關(guān)鍵時(shí)段放電。這個(gè)修正非常關(guān)鍵它讓仿真結(jié)果有了落地可行性。注意電池衰減系數(shù)的來源最好標(biāo)注清楚。有的電池規(guī)格書不會(huì)直接給出循環(huán)壽命曲線這時(shí)候可以參考電池廠家的測(cè)試報(bào)告或第三方評(píng)測(cè)數(shù)據(jù)。數(shù)據(jù)口徑不一致會(huì)導(dǎo)致不同方案之間的成本比較失真這是我在對(duì)比多篇文獻(xiàn)時(shí)踩過的坑。6.3 從離線仿真到日內(nèi)滾動(dòng)調(diào)度24小時(shí)日前調(diào)度只是一個(gè)起點(diǎn)。光伏預(yù)測(cè)偏差、負(fù)荷波動(dòng)、EV實(shí)際到達(dá)時(shí)間變化都讓未來24小時(shí)固定不變這個(gè)假設(shè)在真實(shí)運(yùn)行中很快失效。我的建議是下一步用MPC滾動(dòng)優(yōu)化的思路每15分鐘重新調(diào)用一次優(yōu)化器只執(zhí)行下一個(gè)時(shí)段的決策然后再重新滾動(dòng)優(yōu)化剩余時(shí)段。這樣日前調(diào)度給出的結(jié)果只是指導(dǎo)方向滾動(dòng)調(diào)度負(fù)責(zé)把預(yù)測(cè)誤差及時(shí)修正掉。滾動(dòng)優(yōu)化時(shí)粒子群算法依然適用只是每次求解時(shí)間窗口更短、復(fù)制上一輪的解作為初值會(huì)顯著加速收斂。我在實(shí)際操作中還發(fā)現(xiàn)直接把上一輪解作為當(dāng)前輪初始粒子的一半另一半隨機(jī)初始化這種混合初始化策略效果最好——既保留了平滑過渡又保留了探索多樣性。6.4 關(guān)于求解速度與精度的平衡最后再聊一個(gè)經(jīng)驗(yàn)問題。園區(qū)級(jí)調(diào)度的可行域相當(dāng)復(fù)雜粒子群在96維空間里的收斂速度其實(shí)取決于初始化質(zhì)量。如果你想在精度不變的前提下把求解壓到3秒以內(nèi)一個(gè)有效的辦法是先用蒙特卡洛模擬生成一組啟發(fā)式初值再把它們混入隨機(jī)初始種群中。我試過用按電價(jià)高低排序生成初始充放電計(jì)劃這種方式優(yōu)化速度提升了一倍最終結(jié)果也更穩(wěn)定。另一個(gè)思路是多目標(biāo)化。我最初的版本是單目標(biāo)——最小化總成本但實(shí)際調(diào)度時(shí)還需要考慮峰谷差最小和用戶滿意度最大。后來我把峰谷差作為懲罰項(xiàng)加進(jìn)目標(biāo)函數(shù)效果不錯(cuò)。如果你想把用戶愿意參與調(diào)度的概率也納入模型可以考慮一個(gè)簡(jiǎn)單的收益分配機(jī)制比如虛擬儲(chǔ)能收益按放電量比例返還給用戶。這部分我還在做目前看下來經(jīng)濟(jì)激勵(lì)與調(diào)度策略的耦合程度比算法改進(jìn)更影響方案能不能真正落地。說實(shí)話做完這個(gè)項(xiàng)目之后我最深的感受是優(yōu)化算法再漂亮最終還是要回到模型和約束的合理性上來。粒子群給了我一雙靈活的腿但我得先知道往哪個(gè)方向走。對(duì)于那些剛開始接觸園區(qū)綜合能源調(diào)度的朋友我建議先把物理模型和數(shù)據(jù)底盤打磨扎實(shí)再考慮上什么算法。算法跑得再快如果你的負(fù)荷曲線、分時(shí)電價(jià)、EV用戶行為假設(shè)都是拍腦袋的那結(jié)果再好看也只是漂亮的數(shù)字游戲。從最簡(jiǎn)單的有序充電做起一步步加上V2G、加上熱力耦合、加上多時(shí)間尺度協(xié)調(diào)每加一層你對(duì)整個(gè)系統(tǒng)的理解就會(huì)深一層——這才是這種探索最有價(jià)值的部分。