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