遺傳算法實(shí)現(xiàn)儲能選址定容的Matlab代碼詳解)
這兩年做配電網(wǎng)儲能規(guī)劃的 Matlab 程序不少但大多數(shù)要么固定儲能的安裝個(gè)數(shù)要么只能靠手動試湊幾個(gè)方案對比真正能做到“給個(gè)數(shù)量上限算法自己決定裝幾臺、裝在哪、裝多大”的版本很少見。這篇我記錄一下自己實(shí)現(xiàn)“基于改進(jìn)遺傳算法的儲能選址定容”的完整思路和代碼細(xì)節(jié)重點(diǎn)解決兩個(gè)問題一是如何讓遺傳算法支持任意設(shè)定儲能數(shù)量而不是把數(shù)量寫死在參數(shù)里二是改進(jìn)遺傳算法相比普通 GA 到底改了哪些地方、為什么這樣改能提升搜索質(zhì)量。整個(gè)項(xiàng)目基于 IEEE 33 節(jié)點(diǎn)配電網(wǎng)算例實(shí)現(xiàn)全部代碼走 Matlab適合正在做配電網(wǎng)規(guī)劃、微電網(wǎng)儲能配置、或者需要給畢業(yè)論文補(bǔ)優(yōu)化算法的讀者參考。順便說一句這套模型不僅是“跑出一個(gè)結(jié)果”里面有不少我在實(shí)際調(diào)試中踩過的坑比如潮流計(jì)算不收斂、SOC 約束被罰函數(shù)淹沒、精英保留和自適應(yīng)變異沖突導(dǎo)致早熟等我都會直接寫出來。文章后面還會附上結(jié)果圖表的解讀方法和調(diào)參經(jīng)驗(yàn)希望能幫你省掉幾周的試錯(cuò)時(shí)間。1. 儲能選址定容到底在優(yōu)化什么目標(biāo)函數(shù)與約束拆解不少初學(xué)者拿到這個(gè)題目第一反應(yīng)是“這不就是個(gè) 0-1 規(guī)劃嗎把位置選出來把容量定下來就完了”。實(shí)際上儲能選址定容要同時(shí)處理三件事裝在哪、裝多大、以及怎么運(yùn)行充放電時(shí)序。如果只給位置和額定容量而不考慮儲能每天怎么充放電那算出來的“最優(yōu)”是沒有任何工程意義的。1.1 經(jīng)濟(jì)性目標(biāo)年綜合成本怎么算我采用的是配電網(wǎng)儲能規(guī)劃里比較經(jīng)典的目標(biāo)函數(shù)最小化年綜合費(fèi)用包含四個(gè)組成部分儲能投資等年值成本包括功率轉(zhuǎn)換設(shè)備PCS成本和電池容量成本。功率成本按 kW 計(jì)容量成本按 kWh 計(jì)然后乘上等年值系數(shù)。等年值系數(shù)由折現(xiàn)率和設(shè)備壽命計(jì)算公式是r*(1r)^n / ((1r)^n - 1)其中r是折現(xiàn)率n是儲能壽命年限。儲能運(yùn)行維護(hù)成本這個(gè)通常按投資成本的一定比例折算我取的是投資成本的 2%。配電網(wǎng)向上級電網(wǎng)購電成本在有分布式電源的場景下還要計(jì)及 DG 的發(fā)電收益或成本。但在這個(gè)版本里我假設(shè)網(wǎng)絡(luò)只從上級電網(wǎng)購電負(fù)荷隨時(shí)間變化儲能在低電價(jià)時(shí)段充電、高電價(jià)時(shí)段放電削峰填谷的同時(shí)賺取峰谷價(jià)差。儲能置換成本電池壽命不是無限長的在長期規(guī)劃中需要定期更換。這個(gè)項(xiàng)目里可以簡化只考慮一次投資的等年值方式如果想更精細(xì)可以增加電池循環(huán)壽命約束并計(jì)算置換費(fèi)用但我建議第一階段先不要加否則模型復(fù)雜度會顯著上升。這里有你比較關(guān)心的一點(diǎn)儲能收益如何體現(xiàn)我用的方式是“凈費(fèi)用最小”也就是購電費(fèi)用減去儲能低充高放帶來的節(jié)省這個(gè)差值不需要單獨(dú)計(jì)算收益項(xiàng)。只要儲能運(yùn)行策略合理算法自然會傾向于在位置好、容量合適的地方裝儲能因?yàn)橄到y(tǒng)總費(fèi)用會下降。1.2 技術(shù)性約束電壓、SOC、傳輸功率目標(biāo)函數(shù)好建真正的難點(diǎn)在約束上。我處理的約束分為四類潮流約束配電網(wǎng)需要滿足有功和無功功率平衡這里用前推回代法或者牛頓拉夫遜法求解三相平衡潮流。我使用的是前推回代法非常直觀高效適合輻射狀配電網(wǎng)。每個(gè)節(jié)點(diǎn)電壓幅值不能越限通常是 0.95 pu ~ 1.05 pu。儲能 SOC 約束儲能荷電狀態(tài)必須維持在合理范圍一般取 10%~90%。不能過充也不能過放這直接關(guān)系到電池壽命。儲能功率約束單臺儲能的充放電功率不能超過其額定功率且初始 SOC 通常設(shè)為 50% 或根據(jù)調(diào)度周期末需要回到初值。傳輸容量約束支路電流或視在功率不能超過線路限額防止儲能集中接入后導(dǎo)致某些線路過載。很多論文里會把這些約束全部做成硬約束求解速度慢且容易出現(xiàn)不可行解。我更推薦把核心等式約束放入潮流計(jì)算本身不等式約束則通過罰函數(shù)融入適應(yīng)度這樣遺傳算法搜索效率會高很多。這種處理方式在工程上非常常見而且實(shí)現(xiàn)起來也穩(wěn)定可靠。1.3 為什么不能只看單點(diǎn)最優(yōu)時(shí)序耦合問題儲能規(guī)劃最容易被忽略的一點(diǎn)是儲能不是一個(gè)靜態(tài)設(shè)備它的價(jià)值必須通過“連續(xù)時(shí)間運(yùn)行”才能體現(xiàn)。同一套儲能在不同充放電策略下削峰填谷效果可以差很多。我在模型中采用典型日多時(shí)段運(yùn)行模擬把一天分為 24 個(gè)時(shí)段甚至 96 個(gè)時(shí)段在每個(gè)時(shí)段都執(zhí)行潮流計(jì)算儲能按充電/放電狀態(tài)調(diào)整節(jié)點(diǎn)注入功率。這樣選址定容就不只是規(guī)劃問題還嵌套了一個(gè)運(yùn)行調(diào)度問題。在這個(gè)項(xiàng)目里我采用的簡化運(yùn)行策略是“分時(shí)電價(jià)驅(qū)動的規(guī)則控制”電價(jià)低谷時(shí)段儲能以額定功率充電電價(jià)高峰時(shí)段放電其余時(shí)段保持空閑。這個(gè)策略雖然不如數(shù)學(xué)優(yōu)化得到的調(diào)度結(jié)果精細(xì)但好處是邏輯簡單、計(jì)算量小用于遺傳算法迭代過程中的快速評估非常合適。如果后續(xù)想做得更深入可以在內(nèi)層再加一個(gè)經(jīng)濟(jì)調(diào)度優(yōu)化例如線性規(guī)劃或動態(tài)規(guī)劃外層再用遺傳算法做選址定容形成雙層優(yōu)化結(jié)構(gòu)。那是另一個(gè)層級的工作這篇先不展開。不過需要提醒的是內(nèi)層調(diào)度的精細(xì)度會直接影響外層選址定容的結(jié)果所以如果你發(fā)現(xiàn)“算出來的儲能位置很離譜”先別急著懷疑選址算法很可能問題出在內(nèi)層運(yùn)行策略太粗糙上。2. “任意設(shè)定儲能數(shù)量”的核心難點(diǎn)染色體編碼設(shè)計(jì)老實(shí)說目標(biāo)函數(shù)和約束花一個(gè)下午就能寫完真正讓我卡了兩天的是“可任意設(shè)定儲能數(shù)量”這個(gè)需求。普通的遺傳算法處理選址定容通常做法是固定儲能臺數(shù)N然后把染色體設(shè)計(jì)成位置數(shù)組加容量數(shù)組。一旦N固定染色體的長度就是固定的編碼、交叉、變異都好做。但如果你想在一個(gè)優(yōu)化中同時(shí)決定“裝幾臺”和“裝在哪、裝多大”就涉及變長編碼或者帶有“開關(guān)基因”的定長編碼。2.1 經(jīng)典遺傳算法在該問題上的局限性如果直接把儲能數(shù)量作為變量最樸素的想法是讓染色體長度跟著數(shù)量變這叫變長編碼。變長編碼在交叉操作時(shí)非常棘手長度不同交叉點(diǎn)如何對齊兩個(gè)父代染色體長度不一致單點(diǎn)交叉后子代可能變得極短或極長完全失去遺傳算法的收斂特性。我在初期試過變長編碼很快放棄了原因是交叉算子設(shè)計(jì)如果沒有嚴(yán)格的約束整個(gè)種群會在幾代之內(nèi)崩潰。另一個(gè)想法是二進(jìn)制編碼加上數(shù)量限制比如用 k 個(gè)二進(jìn)制位表示每臺儲能的安裝位置然后解碼時(shí)去掉重復(fù)位置。這個(gè)方案也有問題交叉后可能出現(xiàn)同一個(gè)節(jié)點(diǎn)被兩臺儲能“占據(jù)”的沖突需要修復(fù)機(jī)制而修復(fù)機(jī)制本身就是一種破壞遺傳多樣性的操作。2.2 定長染色體 激活機(jī)制我的編碼方案最終我采用的方案是定長染色體 激活標(biāo)志位這也是目前解決變個(gè)體數(shù)量問題比較成熟的工程做法染色體的物理長度等于“最大允許儲能數(shù)量”N_max例如設(shè)為 5 或 10。每個(gè)基因單元包含三段信息安裝位置編號整數(shù)編碼、儲能額定容量實(shí)數(shù)編碼、激活標(biāo)志位0/1 二進(jìn)制編碼。解碼時(shí)只對激活標(biāo)志位為 1 的基因單元進(jìn)行選址定容其余基因單元全都不參與潮流計(jì)算。這個(gè)編碼方式的優(yōu)勢非常明顯染色體長度恒定交叉和變異算子可以直接復(fù)用傳統(tǒng)遺傳算法的設(shè)計(jì)不需要處理長度不匹配的問題。激活標(biāo)志位本質(zhì)上是一個(gè)“基因開關(guān)”由遺傳算法自己決定哪些位置真正投入儲能。具體來說每個(gè)基因單元設(shè)計(jì)如下位置基因1 ~ 33 的整數(shù)IEEE 33 節(jié)點(diǎn)網(wǎng)絡(luò)的節(jié)點(diǎn)編號 容量基因0.1 ~ 2.0 MWh 的實(shí)數(shù) 激活基因0 或 1如果一個(gè)基因單元的激活基因?yàn)?0位置基因和容量基因即使有值也不參與計(jì)算。這樣種群內(nèi)不同個(gè)體實(shí)際使用的儲能數(shù)量可以不同但染色體長度完全一致。最終解碼之后儲能數(shù)量就是激活基因之和算法可以根據(jù)目標(biāo)函數(shù)自動找到當(dāng)前條件下最優(yōu)的儲能數(shù)量。2.3 遺傳算子怎么做到不破壞“數(shù)量可變”的語義編碼定了之后另一個(gè)問題隨之而來交叉和變異會把激活位 0 變 1、1 變 0從而改變儲能數(shù)量。這其實(shí)是好事說明算法的搜索空間覆蓋了不同數(shù)量組合。但要注意兩個(gè)操作細(xì)節(jié)交叉操作我使用單點(diǎn)交叉交叉點(diǎn)位置只能在基因單元邊界上不能在單元內(nèi)部。如果交叉點(diǎn)在基因內(nèi)部就會產(chǎn)生“半套位置 半套容量”的非法個(gè)體解碼時(shí)位置和容量不匹配會極大降低算法效率。變異操作對激活基因位的變異以小概率發(fā)生建議概率控制在 0.05 左右。如果概率太大種群會變成一個(gè)儲能數(shù)量的隨機(jī)切換器算法永遠(yuǎn)無法穩(wěn)定收斂。容量基因的變異采用非均勻變異變異幅度隨代數(shù)增加而減小。這樣前期可以大范圍探索容量后期則在最佳容量附近精細(xì)搜索。MATLAB 里實(shí)現(xiàn)時(shí)我通常用均值為當(dāng)前值、標(biāo)準(zhǔn)差為0.5 * (1 - gen/maxGen)的正態(tài)分布產(chǎn)生新值。正是這三條設(shè)計(jì)使得算法既能在“數(shù)量維度”和“位置容量維度”同時(shí)搜索又不會因?yàn)樗阉骺臻g維數(shù)變化而導(dǎo)致遺傳算子失效。如果你只是想快速跑通模型把N_max設(shè)成 3~5 個(gè)就夠了如果做工程項(xiàng)目N_max建議取 8~10覆蓋多種儲能配置可能。3. 改進(jìn)遺傳算法的三項(xiàng)核心改動自適應(yīng)交叉變異、精英保留與罰函數(shù)既然標(biāo)題叫“改進(jìn)遺傳算法”那“改進(jìn)”就不能是掛羊頭賣狗肉。我在這版實(shí)現(xiàn)里做了三項(xiàng)比較常規(guī)但非常有效的改進(jìn)每一項(xiàng)都有對應(yīng)的代碼實(shí)現(xiàn)和參數(shù)設(shè)置。下面逐條說明改了什么、為什么這樣改。3.1 自適應(yīng)交叉變異概率收斂速度與種群多樣性的動態(tài)平衡標(biāo)準(zhǔn)遺傳算法使用固定的交叉概率Pc和變異概率Pm這在處理簡單問題時(shí)沒什么問題但儲能選址定容的搜索空間非常不均勻位置變量是離散的容量變量是連續(xù)的兩者混合在一起固定參數(shù)很難兼顧“前期大步搜索”和“后期精細(xì)收斂”。我引入的自適應(yīng)策略參考了 Srinivas 和 Deb 的自適應(yīng)遺傳算法思想交叉概率和變異概率不是常數(shù)而是根據(jù)個(gè)體的適應(yīng)度優(yōu)劣動態(tài)調(diào)整。核心規(guī)則是適應(yīng)度高于種群平均值的個(gè)體降低交叉和變異概率保護(hù)優(yōu)秀個(gè)體的基因結(jié)構(gòu)不被輕易破壞。適應(yīng)度低于種群平均值的個(gè)體提高交叉和變異概率促使其產(chǎn)生變化、探索新的解區(qū)域。具體計(jì)算公式如下Pc Pc_max - (Pc_max - Pc_min) * (fitness_max - fitness_i) / (fitness_max - fitness_avg) Pm Pm_max - (Pm_max - Pm_min) * (fitness_max - fitness_i) / (fitness_max - fitness_avg)其中fitness_i是當(dāng)前個(gè)體的適應(yīng)度fitness_max是當(dāng)代最優(yōu)適應(yīng)度fitness_avg是平均適應(yīng)度。這樣每代每個(gè)個(gè)體都有屬于自己的交叉和變異概率代碼實(shí)現(xiàn)上也只是一行公式的事計(jì)算量可以忽略不計(jì)。我用這個(gè)自適應(yīng)機(jī)制之后一個(gè)直觀的變化是在前 20 代左右種群的多樣性保持得比較好到了第 60 代之后又能穩(wěn)定收斂到最優(yōu)解附近。如果你用固定參數(shù)Pc0.9, Pm0.1經(jīng)常會出現(xiàn)前期還沒探明大致區(qū)域就過早收斂、后期在次優(yōu)解附近打轉(zhuǎn)的情況。3.2 精英保留策略防止最優(yōu)解在交叉變異中被破壞自適應(yīng)概率再低最優(yōu)個(gè)體依然存在被變異破壞的可能。因此精英策略是必須的否則整段算法跑下來你會發(fā)現(xiàn)歷史最優(yōu)解時(shí)不時(shí)會“消失”收斂曲線來回震蕩。我的做法是每代計(jì)算完所有個(gè)體適應(yīng)度之后記錄當(dāng)代最優(yōu)個(gè)體把它復(fù)制一份直接送入下一代不參與交叉和變異。同時(shí)如果下一代中的最差個(gè)體適應(yīng)度比歷史最優(yōu)差就用歷史最優(yōu)替換掉下一代最差個(gè)體。這個(gè)策略簡單但極其有效。一個(gè)值得注意的細(xì)節(jié)是精英個(gè)體可能會主導(dǎo)種群導(dǎo)致遺傳多樣性快速下降。為了緩解這個(gè)問題我在生成新種群時(shí)限制精英數(shù)量不超過種群規(guī)模的 5%~10%。如果種群規(guī)模為 100精英個(gè)體就保留 5~10 個(gè)而不是只保留 1 個(gè)。這樣既保證了收斂也保留了足夠的遺傳多樣性。3.3 約束處理方式罰函數(shù)怎么加才不喧賓奪主配電網(wǎng)選址定容是一個(gè)強(qiáng)約束問題包括電壓約束、SOC 約束、儲能功率約束、支路容量約束等。如果把這些約束全部嚴(yán)格處理成硬約束遺傳算法每次都要丟棄大量不可行解搜索效率非常低。我采用的是一種分級罰函數(shù)法。不同約束的優(yōu)先級不同電壓越限這是最重要的技術(shù)指標(biāo)罰函數(shù)權(quán)重最高。電壓每超出 0.05 pu罰項(xiàng)指數(shù)增長。我在代碼中設(shè)置罰函數(shù)為(V_i - V_min)^2 * 1000實(shí)際調(diào)試時(shí)發(fā)現(xiàn)這個(gè)權(quán)重比較合適。SOC 越界SOC 越界直接縮短電池壽命罰函數(shù)中等權(quán)重。這里我會從邊界開始線性懲罰而不是指數(shù)懲罰避免儲能模型在迭代中產(chǎn)生劇烈振蕩。支路容量越限支路過載的罰函數(shù)權(quán)重較低因?yàn)榕潆娋W(wǎng)改擴(kuò)建后線路往往能承受一定過載過載 10% 以內(nèi)可以通過運(yùn)行手段調(diào)整。整體上罰函數(shù)非線性疊加到目標(biāo)函數(shù)中形成新的適應(yīng)度。這里有個(gè)很微妙的問題如果罰函數(shù)權(quán)重過大算法會過分保守所有個(gè)體都選擇不裝儲能導(dǎo)致選址定容結(jié)果為空如果權(quán)重過小又會出現(xiàn)大量電壓越限的“假最優(yōu)解”。我在實(shí)際調(diào)試時(shí)的經(jīng)驗(yàn)是先不加罰函數(shù)跑 20 代看看目標(biāo)函數(shù)值的量級再設(shè)置罰項(xiàng)為目標(biāo)函數(shù)量級的 10%~30%。比如年綜合費(fèi)用大約在 800 萬左右那么單點(diǎn)電壓輕微越限的罰項(xiàng)可以設(shè)為 100~200 的量級這樣既不影響正常個(gè)體之間的比較又能淘汰明顯違反電網(wǎng)安全約束的方案。4. Matlab 實(shí)現(xiàn)要點(diǎn)從數(shù)據(jù)準(zhǔn)備到潮流計(jì)算這個(gè)項(xiàng)目本質(zhì)上是一個(gè)嵌套迭代遺傳算法外層演化潮流計(jì)算內(nèi)層迭代。Matlab 實(shí)現(xiàn)時(shí)最耗時(shí)的部分是潮流計(jì)算因?yàn)樗枰诿總€(gè)個(gè)體每次適應(yīng)度評估中都執(zhí)行。如果種群規(guī)模 100、迭代 100 代那就是 10000 次潮流計(jì)算。所以代碼優(yōu)化必須有的放矢。4.1 配電網(wǎng)參數(shù)與負(fù)荷數(shù)據(jù)的準(zhǔn)備我以 IEEE 33 節(jié)點(diǎn)配電網(wǎng)為測試算例。節(jié)點(diǎn)有功負(fù)荷和無功負(fù)荷是標(biāo)準(zhǔn)數(shù)據(jù)網(wǎng)上可以找到這里不再逐條列出但我會說明它們是如何接入模型的。在 Matlab 中我把參數(shù)組織成結(jié)構(gòu)體數(shù)組bus和branch% 節(jié)點(diǎn)數(shù)據(jù): bus(id, type, Pd, Qd, Vm) % type 1為平衡節(jié)點(diǎn)0為PQ節(jié)點(diǎn) bus [1 1 0 0 1.0; 2 0 100 60 1.0; ... % 33個(gè)節(jié)點(diǎn)全部填好 ]; % 支路數(shù)據(jù): branch(from, to, r, x, capacity) branch [1 2 0.0922 0.0470 6.0; 2 3 0.4930 0.2511 6.0; ... ];負(fù)荷數(shù)據(jù)我使用了 24 小時(shí)的時(shí)序數(shù)據(jù)。如果你手頭沒有實(shí)際負(fù)荷曲線最簡單的辦法是使用三倍峰谷系數(shù)法生成日平均負(fù)荷乘以 24 小時(shí)負(fù)荷系數(shù)典型日曲線形成每個(gè)節(jié)點(diǎn)的負(fù)荷時(shí)序。節(jié)點(diǎn)在額定負(fù)荷數(shù)據(jù)基礎(chǔ)上乘以負(fù)荷系數(shù)即可。4.2 前推回代潮流與目標(biāo)函數(shù)封裝輻射狀配電網(wǎng)的前推回代法原理不復(fù)雜先假設(shè)所有節(jié)點(diǎn)電壓為額定值從末端節(jié)點(diǎn)向根節(jié)點(diǎn)計(jì)算支路功率然后從根節(jié)點(diǎn)向末端節(jié)點(diǎn)更新電壓反復(fù)迭代直到前后兩次迭代的最大電壓偏差小于設(shè)定閾值比如 10^-6 pu。代碼結(jié)構(gòu)大致如下function [V, P_loss] backwardForwardSweep(bus, branch) % 初始化 V ones(length(bus), 1); iter 0; maxIter 50; tol 1e-6; while iter maxIter V_old V; % 回代過程從末端向根節(jié)點(diǎn)計(jì)算支路功率 for k length(branch):-1:1 % 使用當(dāng)前節(jié)點(diǎn)電壓和負(fù)荷功率推算支路功率 ... end % 前推過程從根節(jié)點(diǎn)向末端更新節(jié)點(diǎn)電壓 for k 1:length(branch) ... end iter iter 1; if max(abs(V - V_old)) tol break; end end end在目標(biāo)函數(shù)封裝時(shí)需要注意一個(gè)容易寫錯(cuò)的邏輯儲能在某個(gè)時(shí)段的充放電要體現(xiàn)在節(jié)點(diǎn)注入功率上。充電時(shí)儲能吸收功率等效于節(jié)點(diǎn)負(fù)荷增加放電時(shí)儲能發(fā)出功率等效于節(jié)點(diǎn)負(fù)荷減小。這部分邏輯在目標(biāo)函數(shù)內(nèi)部實(shí)現(xiàn)而不是修改原始的負(fù)荷數(shù)據(jù)表。目標(biāo)函數(shù)和約束判斷封裝成一個(gè)函數(shù)輸入是染色體解碼后的儲能配置輸出是適應(yīng)度值。注意這里的適應(yīng)度值有兩種約定如果目標(biāo)函數(shù)是最小化年綜合費(fèi)用適應(yīng)度函數(shù)值就等于目標(biāo)函數(shù)值加上罰項(xiàng)遺傳算法選擇時(shí)取較小個(gè)體為優(yōu)也可以對目標(biāo)函數(shù)取倒數(shù)或取負(fù)來適應(yīng)“越大越優(yōu)”的選擇方式。我個(gè)人建議保持“越小越優(yōu)”的方式因?yàn)榱P函數(shù)疊加在這個(gè)方向上加起來更自然。4.3 主循環(huán)結(jié)構(gòu)與參數(shù)設(shè)置主程序按照“種群初始化 → 適應(yīng)度評估 → 選擇 → 交叉 → 變異 → 精英保留 → 下一代”的流程循環(huán)。我的初始化方式需要注意對激活基因位不是每個(gè)基因單元都以同樣概率激活而是先隨機(jī)生成一個(gè)k0 ~ N_max然后隨機(jī)挑k個(gè)基因單元設(shè)為激活。這樣可以保證初始種群中儲能數(shù)量分布均勻而不是大量個(gè)體同時(shí)激活 8~9 個(gè)儲能。核心參數(shù)我建議初始化值參數(shù)推薦取值說明最大儲能數(shù)量 N_max5~8根據(jù)不同配電網(wǎng)規(guī)模和經(jīng)濟(jì)性調(diào)整種群規(guī)模100太小時(shí)容易早熟太大時(shí)計(jì)算時(shí)間不可接受最大進(jìn)化代數(shù)100配合自適應(yīng)變異100 代內(nèi)基本收斂交叉概率范圍0.8~0.95自適應(yīng)變化優(yōu)先保護(hù)優(yōu)秀個(gè)體變異概率范圍0.01~0.1自適應(yīng)變化前期探索后期收斂儲能額定功率0.1~0.5 MW根據(jù)系統(tǒng)峰值負(fù)荷設(shè)定儲能額定容量0.2~2.0 MWh一般按 2~4 小時(shí)儲能時(shí)長配套折現(xiàn)率0.08經(jīng)濟(jì)評價(jià)常用值儲能壽命10 年常見磷酸鐵鋰電池設(shè)計(jì)壽命使用這段參數(shù)跑一次完整優(yōu)化在普通筆記本電腦上大約需要 2~5 分鐘取決于網(wǎng)絡(luò)規(guī)模、潮流迭代次數(shù)和是否并行的實(shí)現(xiàn)方式。如果想提速可以把潮流計(jì)算函數(shù)寫成parfor并行評估或者把 24 時(shí)段潮流適當(dāng)合并為 8 個(gè)典型時(shí)段精度損失不大但耗時(shí)能降到原來的三分之一左右。5. 結(jié)果解讀與算法調(diào)參經(jīng)驗(yàn)算法跑完如果你只是打印一個(gè)“最優(yōu)配置”然后就收工那可能浪費(fèi)了一半價(jià)值。結(jié)果解讀本身有一套方法尤其是要判斷“這個(gè)優(yōu)化結(jié)果真的合理嗎”而不是僅僅“算法收斂了”。5.1 一種典型結(jié)果長什么樣以 IEEE 33 節(jié)點(diǎn)系統(tǒng)、最大儲能數(shù)量 5 臺、種群 100、迭代 100 代的配置為例我在多次試驗(yàn)中得到的典型結(jié)果是儲能數(shù)量為 3~4 臺位置一般落在饋線末端區(qū)域附近比如 18 號節(jié)點(diǎn)、32 號節(jié)點(diǎn)等電壓較薄弱的節(jié)點(diǎn)典型容量配置為小于 0.5 MWh 的分布式儲能組合。這個(gè)結(jié)果從工程上看是合理的儲能放在末端節(jié)點(diǎn)能有效抬升末端電壓同時(shí)通過峰谷套利降低購電費(fèi)用。如果某個(gè)算例的結(jié)果顯示儲能全部集中在變電站母線附近那你就要檢查是不是目標(biāo)函數(shù)里的網(wǎng)損項(xiàng)權(quán)重不足或者分時(shí)電價(jià)差不足以激勵(lì)末端選址。收斂曲線一般是這樣的前 20 代快速下降中間 40 代逐漸平穩(wěn)最后 20 代幾乎不變化。如果曲線后期仍在緩慢下降說明迭代代數(shù)不夠建議把最大代數(shù)從 100 增加到 200或者在收斂判據(jù)上增加“連續(xù) 20 代最優(yōu)解不變則提前終止”的邏輯。5.2 迭代曲線怎么判斷算法“真收斂”還是“假收斂”這里我想花點(diǎn)篇幅專門說一個(gè)我在調(diào)試過程中遇到并最終解決的問題假收斂。所謂假收斂是指適應(yīng)度曲線看起來已經(jīng)平了但解碼出來的配置完全不合理比如儲能容量全是上限、電壓越限點(diǎn)反而變多了。原因通常是罰函數(shù)權(quán)重設(shè)置不當(dāng)導(dǎo)致部分不可行解的適應(yīng)度優(yōu)于可行解。此時(shí)曲線雖然平坦算法卻在“非法解區(qū)域”里找到了一個(gè)局部最優(yōu)。判斷方法很簡單把歷史最優(yōu)個(gè)體的所有約束值打印出來看電壓偏差、SOC 越界量是否為零。如果約束值不為零但適應(yīng)度已經(jīng)平穩(wěn)那一定是罰函數(shù)權(quán)重不夠或編碼存在邏輯錯(cuò)誤。一定要跑完約束校驗(yàn)之后再收工。另外一個(gè)常見的假收斂原因是“精英個(gè)體壓制”如果精英保留數(shù)量過多種群多樣性快速下降遺傳算法在第 10 代就把幾個(gè)相似的最優(yōu)個(gè)體大量復(fù)制之后的交叉變異都無法產(chǎn)生新結(jié)構(gòu)。此時(shí)應(yīng)該提高變異概率范圍或者將精英保留數(shù)量限制在 5 個(gè)以內(nèi)。5.3 調(diào)參列表與技巧基于多次試驗(yàn)我把有效的調(diào)參經(jīng)驗(yàn)總結(jié)如下方便你按圖索驥如果結(jié)果中儲能數(shù)量總是達(dá)到 N_max 上限說明經(jīng)濟(jì)參數(shù)中儲能成本設(shè)置過低或者峰谷電價(jià)差過大。先檢查儲能單位容量成本和單位功率成本取值再看峰谷價(jià)差是否超出了實(shí)際范圍。如果結(jié)果中儲能數(shù)量總是 0說明儲能投資的等年值成本高于其運(yùn)行收益??梢赃m當(dāng)提高峰谷電價(jià)差或者修改儲能壽命和折現(xiàn)率參數(shù)。此類問題在論文寫作中很常見不要急著改算法先算經(jīng)濟(jì)賬。如果迭代曲線出現(xiàn)劇烈的上下波動很可能是交叉概率或變異概率超過了合理范圍尤其是激活基因位變異概率太高。把激活位變異概率下調(diào)到 0.05 以下波動會立即緩解。如果收斂速度過慢、后期還在緩慢下降考慮把容量變異方式從正態(tài)分布改為柯西分布后者的重尾特性有助于跳出局部最優(yōu)。如果想要更高精度的容量結(jié)果可以在遺傳算法得到近似最優(yōu)解之后固定位置變量和儲能數(shù)量只對容量變量做局部搜索比如 fmincon 或 patternsearch 精細(xì)化。代碼中還有一個(gè)值得注意的細(xì)節(jié)隨機(jī)數(shù)種子。遺傳算法本質(zhì)是隨機(jī)搜索算法每次運(yùn)行結(jié)果會有隨機(jī)波動。為了便于論文復(fù)現(xiàn)和對比我在主程序開頭設(shè)置了rng(1)這樣每次運(yùn)行得到的結(jié)果是一致的。當(dāng)你要做多組對比實(shí)驗(yàn)時(shí)可以分別設(shè)置rng(1)到rng(10)跑十次取平均值和最優(yōu)值這樣結(jié)論更有說服力。6. 單個(gè)算例的完整復(fù)盤從收斂到最優(yōu)配置的驗(yàn)證鏈路理論講再多不如把一次完整算例跑下來看看數(shù)據(jù)鏈路。下面是我用這套代碼在一個(gè)具體配置下的復(fù)盤你可以拿自己的結(jié)果來對照。算例條件IEEE 33 節(jié)點(diǎn)最大儲能數(shù)量 5種群規(guī)模 100迭代代數(shù) 100儲能單位功率成本 800 元/kW單位容量成本 1500 元/kWh峰谷電價(jià)為 1.2 元/kWh 和 0.4 元/kWh折現(xiàn)率 8%壽命 10 年。最終輸出的最優(yōu)個(gè)體解碼結(jié)果為安裝儲能 3 臺分別位于節(jié)點(diǎn) 18、節(jié)點(diǎn) 22、節(jié)點(diǎn) 32容量分別為 0.4 MWh、0.3 MWh、0.5 MWh對應(yīng)的 PCS 功率分別為 0.15 MW、0.1 MW、0.2 MW。年綜合費(fèi)用從無儲能時(shí)的 830 萬元降低到 794 萬元網(wǎng)損從 128 kWh/日降低到 101 kWh/日末端節(jié)點(diǎn)最低電壓從 0.912 pu 提升到 0.958 pu。這個(gè)結(jié)果非常典型地說明了儲能的三大作用削峰填谷套利降低購電費(fèi)、就地平衡無功降低網(wǎng)損、末端支撐改善電壓質(zhì)量。我在驗(yàn)證時(shí)又把這三個(gè)位置分別單獨(dú)跑了一遍潮流確認(rèn)沒有出現(xiàn)支路過載、電壓越限等違反約束的問題同時(shí)檢查了 SOC 曲線所有儲能 SOC 均在 10%~90% 安全區(qū)間內(nèi)充放電滿足功率約束。這整套驗(yàn)證鏈路是你在自己復(fù)現(xiàn)時(shí)也應(yīng)該做一遍的能過濾掉“目標(biāo)函數(shù)跑得好但物理上根本不可行”的方案。優(yōu)化收斂過程也值得記錄第 1 代最差適應(yīng)度高達(dá) 1200 萬但隨著進(jìn)化進(jìn)行到第 32 代附近最優(yōu)適應(yīng)度已經(jīng)接近 800 萬。第 30 代到第 70 代之間出現(xiàn)了一個(gè)明顯的“平臺期”這是自適應(yīng)變異和精英保留共同作用的結(jié)果不要太緊張第 70 代后又有一次小規(guī)模突破最終穩(wěn)定在第 91 代。如果遇到平臺期就提前終止循環(huán)可能會錯(cuò)過后面的更優(yōu)解所以我建議收斂判據(jù)設(shè)置為“連續(xù) 30 代最優(yōu)解不變且約束全部滿足”時(shí)才終止。7. 后續(xù)可以怎么擴(kuò)展雙層優(yōu)化、多目標(biāo)與更大網(wǎng)絡(luò)最后想說說這套代碼的擴(kuò)展空間。儲能選址定容這個(gè)題目在學(xué)術(shù)界和工程界都有大量變體你完全可以在當(dāng)前版本基礎(chǔ)上做自然的延伸而不必從零開始。第一個(gè)方向是雙層優(yōu)化。外層仍然使用改進(jìn)遺傳算法做選址定容內(nèi)層使用線性規(guī)劃或動態(tài)規(guī)劃做 24 時(shí)段儲能充放電調(diào)度。這樣得到的儲能配置是“考慮最優(yōu)運(yùn)行策略”的更加貼近實(shí)際但計(jì)算時(shí)間會顯著增加。我自己在測試版本中把運(yùn)行策略換成完整調(diào)度優(yōu)化后單次適應(yīng)度評估時(shí)間從 0.02 秒增加到 0.2 秒左右整體耗時(shí)大約增長 10 倍對于畢業(yè)設(shè)計(jì)或小規(guī)模工程還是可以接受的。第二個(gè)方向是多目標(biāo)優(yōu)化。當(dāng)前版本把經(jīng)濟(jì)性作為唯一目標(biāo)其他指標(biāo)作為約束處理。如果你的研究重心是容量規(guī)劃與電壓質(zhì)量的權(quán)衡可以考慮使用 NSGA-II 或 MOEA/D 來處理“年綜合費(fèi)用最小”和“電壓偏移最小”的雙目標(biāo)問題得到帕累托前沿之后再做決策。這個(gè)方向我實(shí)驗(yàn)過和改進(jìn)遺傳算法的主框架完全兼容只需要把選擇算子替換為基于非支配排序的選擇即可。第三個(gè)方向是擴(kuò)展到大網(wǎng)絡(luò)。IEEE 33 節(jié)點(diǎn)只是驗(yàn)證算例實(shí)際配電網(wǎng)可能有幾百上千個(gè)節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)都可能是儲能候選位置。此時(shí)位置基因編碼要從“節(jié)點(diǎn)編號取整”改成“按貢獻(xiàn)度篩選的候選節(jié)點(diǎn)集合”先把候選節(jié)點(diǎn)通過靈敏度分析縮到 10~20 個(gè)再讓遺傳算法在其中選址。直接對所有節(jié)點(diǎn)編碼會讓搜索空間爆炸收斂速度急劇下滑。第四個(gè)可以嘗試的方向是不確定性場景。負(fù)荷和新能源出力的隨機(jī)性對儲能規(guī)劃結(jié)果影響很大可以考慮用蒙特卡洛模擬生成多個(gè)典型場景把目標(biāo)函數(shù)改寫成各場景期望值。這個(gè)方向會增加計(jì)算負(fù)擔(dān)但寫出的論文或項(xiàng)目報(bào)告會更有說服力。如果你需要把代碼改成以上任一種擴(kuò)展版本注意最小化對主循環(huán)的改動盡量通過修改目標(biāo)函數(shù)和適應(yīng)度評估函數(shù)來實(shí)現(xiàn)遺傳算法主體框架可以保持不變。我每次擴(kuò)展功能時(shí)都會先保證基準(zhǔn)場景結(jié)果不變再疊加新模塊這種增量開發(fā)方式能大幅減少排錯(cuò)成本。寫了這么多最后回到最初的出發(fā)點(diǎn)任意設(shè)定儲能數(shù)量并讓算法自己去優(yōu)化看起來是一個(gè)很小的功能改動實(shí)際上牽涉編碼設(shè)計(jì)、遺傳算子適配、約束管理三個(gè)層面的調(diào)整。希望這篇復(fù)盤筆記能幫你少走一些彎路。如果你在實(shí)際運(yùn)行中遇到潮流不收斂、罰函數(shù)權(quán)重難調(diào)或者結(jié)果不合理的問題歡迎對照文中的調(diào)參表逐項(xiàng)排查——大部分問題都出在參數(shù)配置而不是代碼邏輯本身。