化算法的IEEE30節(jié)點無功功率分配優(yōu)化復(fù)現(xiàn)解析)
每逢搞電力系統(tǒng)優(yōu)化方向的課題總繞不開無功功率分配這個話題。課題組里但凡做配電網(wǎng)、輸電網(wǎng)經(jīng)濟運行的基本都會碰到它。而當我第一次看到“基于蝴蝶優(yōu)化算法解決最優(yōu)無功功率分配問題”這個題目時第一反應(yīng)是又是個把智能算法懟到經(jīng)典問題上的組合。但真正把代碼跑完、把收斂曲線拉出來之后我發(fā)現(xiàn)這個組合其實比想象中講究——蝴蝶優(yōu)化算法BOA的全局探索機制和無功優(yōu)化的多峰特性恰好對得上IEEE30節(jié)點系統(tǒng)又是個標準的驗證平臺兩者結(jié)合起來的復(fù)現(xiàn)價值非常高。這篇博文我會把整個思路從頭捋一遍包含最核心的數(shù)學(xué)模型怎么建、BOA算法每一步在做什么、Matlab代碼的框架怎么組織以及我在復(fù)現(xiàn)過程中踩過的坑和最終的實驗數(shù)據(jù)。內(nèi)容主要面向電氣工程專業(yè)的研究生、做電力系統(tǒng)優(yōu)化方向的科研人員以及對智能優(yōu)化算法在工程問題中落地感興趣的讀者。不需要你有很深的基礎(chǔ)只要會基本的Matlab操作和電力系統(tǒng)潮流概念跟著走就能把代碼跑起來。1. 最優(yōu)無功功率分配問題到底在優(yōu)化什么1.1 無功優(yōu)化問題的工程背景電力系統(tǒng)里有功功率負責(zé)做功無功功率負責(zé)建立和維持磁場。沒有足夠的無功支撐系統(tǒng)的電壓就會跌落甚至引發(fā)電壓崩潰。但無功又不能發(fā)太多過剩了電壓會升高設(shè)備絕緣受影響網(wǎng)損也會增加。所謂無功優(yōu)化就是在保證電壓合格、線路不越限、發(fā)電機運行在安全范圍內(nèi)的前提下通過調(diào)節(jié)各類無功設(shè)備讓整個系統(tǒng)的某個運行指標達到最優(yōu)。標題里寫的“最優(yōu)無功功率分配”全稱是 Optimal Reactive Power Dispatch業(yè)內(nèi)一般縮寫為 ORPDOptimal Reactive Power Dispatch。它跟 OPFOptimal Power Flow有很強的關(guān)聯(lián)OPF 是交流最優(yōu)潮流ORPD 可以說是 OPF 在無功層面的一種專項優(yōu)化——有功出力一般固定只調(diào)整無功相關(guān)的控制變量。這個問題的工程價值在于電網(wǎng)運行中 5%~10% 的電能損耗發(fā)生在輸電和配電環(huán)節(jié)而合理的無功優(yōu)化通常能把網(wǎng)損降低 2%~5%。對一個年輸電量上百億度的省級電網(wǎng)來說降損帶來的經(jīng)濟效益非常可觀。這就是為什么 ORPD 幾十年來一直是電力系統(tǒng)研究的熱門方向也是每次智能算法論文里最常見的“試驗田”。1.2 數(shù)學(xué)模型與目標函數(shù)ORPD 的數(shù)學(xué)模型本質(zhì)上是一個帶約束的非線性優(yōu)化問題。目標函數(shù)最常用的是最小化系統(tǒng)有功網(wǎng)損公式如下[ \min P_{loss} \sum_{k \in N_L} g_k \left( V_i^2 V_j^2 - 2V_i V_j \cos\theta_{ij} \right) ]其中 ( N_L ) 是支路集合( g_k ) 是支路電導(dǎo)( V_i ) 和 ( V_j ) 是支路兩端節(jié)點電壓幅值( \theta_{ij} ) 是兩端電壓相角差。從公式能看出來網(wǎng)損跟節(jié)點電壓幅值和相角差直接相關(guān)調(diào)節(jié)無功設(shè)備和變壓器抽頭就會改變節(jié)點電壓分布從而影響網(wǎng)損。約束條件分兩類。等式約束就是潮流方程本身各節(jié)點的有功、無功必須滿足功率平衡[ P_{Gi} - P_{Di} V_i \sum_{j \in N_i} V_j (G_{ij}\cos\theta_{ij} B_{ij}\sin\theta_{ij}) ][ Q_{Gi} - Q_{Di} V_i \sum_{j \in N_i} V_j (G_{ij}\sin\theta_{ij} - B_{ij}\cos\theta_{ij}) ]不等式約束則包含發(fā)電機無功出力上下限、節(jié)點電壓幅值上下限、變壓器變比上下限、無功補償裝置容量上下限。這些約束寫成標準形式就是( Q_{Gi}^{\min} \leq Q_{Gi} \leq Q_{Gi}^{\max} )( V_i^{\min} \leq V_i \leq V_i^{\max} )( T_k^{\min} \leq T_k \leq T_k^{\max} )( Q_{Ci}^{\min} \leq Q_{Ci} \leq Q_{Ci}^{\max} )控制變量一般選取發(fā)電機機端電壓 ( V_G )、變壓器變比 ( T )、無功補償容量 ( Q_C )。狀態(tài)變量則是負荷節(jié)點的電壓幅值和相角。優(yōu)化算法負責(zé)搜索控制變量的最優(yōu)組合每次迭代都要調(diào)用一次潮流計算來校驗約束并計算目標函數(shù)值。1.3 為什么選IEEE30節(jié)點做測試平臺IEEE30節(jié)點系統(tǒng)是電力系統(tǒng)經(jīng)典測試系統(tǒng)從上世紀60年代提出至今已經(jīng)用了60多年。它包含 30 個節(jié)點、41 條支路、6 臺發(fā)電機、4 臺可調(diào)變壓器和 2 個無功補償點規(guī)模適中既能體現(xiàn)優(yōu)化問題的復(fù)雜度又不至于讓潮流計算慢到無法接受。對算法驗證來說IEEE30節(jié)點有幾個天然優(yōu)勢。第一它具備無功優(yōu)化需要的完整調(diào)節(jié)手段——發(fā)電機調(diào)壓、變壓器變比、并聯(lián)電容器都有可以構(gòu)造出完整的 ORPD 問題。第二系統(tǒng)規(guī)模剛好變量維度在 12 個左右6個發(fā)電機電壓 4個變壓器變比 2個無功補償對智能算法來說屬于中等規(guī)模問題既有搜索難度又不會高維到讓算法退化。第三標準參數(shù)公開全網(wǎng)數(shù)據(jù)容易獲取任何人的結(jié)果都可以放到同一平臺上橫向?qū)Ρ?。很多論文?IEEE30 節(jié)點上的網(wǎng)損優(yōu)化結(jié)果大概在 4.5MW~5.5MW 之間基準運行狀態(tài)的網(wǎng)損大約是 5.8MW 左右。如果你的算法在這個系統(tǒng)上優(yōu)化后網(wǎng)損還高于 5.5MW那說明算法調(diào)參沒調(diào)好或者約束處理有問題。這個經(jīng)驗值可以用來快速判斷代碼實現(xiàn)是否正確算是做這個題目的一個“及格線”參考。2. 蝴蝶優(yōu)化算法的尋優(yōu)機制與選型邏輯2.1 自然啟發(fā)算法的共性思路自然啟發(fā)算法Nature-Inspired Algorithm這類方法本質(zhì)上都遵循一個共同范式初始化一堆候選解讓它們按照某種規(guī)則相互交流、變異、競爭迭代若干代后收斂到較優(yōu)解。粒子群模擬鳥群覓食遺傳算法模擬生物進化灰狼優(yōu)化模擬狼群捕獵而標題里的蝴蝶優(yōu)化算法模擬的是蝴蝶覓食和求偶時的行為。這些算法的核心無外乎兩個操作探索Exploration和開發(fā)Exploitation。探索是讓個體在搜索空間里大范圍游走找到有希望的區(qū)域開發(fā)是讓個體在已知的好區(qū)域附近精細搜索提升解的質(zhì)量。算法好不好就看它在探索和開發(fā)之間能不能找到合適的平衡點。很多算法效果差不是公式不行而是這個平衡沒調(diào)好。2.2 BOA的核心機制香味感知與兩階段搜索蝴蝶優(yōu)化算法Butterfly Optimization AlgorithmBOA是 2019 年提出的一種新型自然啟發(fā)算法設(shè)計思路很有意思。蝴蝶在自然界中依靠嗅覺來感知花蜜的位置和求偶對象這個嗅覺能力和香味濃度相關(guān)。算法把這個行為抽象成三步香味產(chǎn)生、全局搜索、局部搜索。香味濃度的計算是 BOA 的核心公式為[ f c \cdot I^a ]其中 ( f ) 是蝴蝶感知到的香味濃度( I ) 是刺激強度對應(yīng)適應(yīng)度值( a ) 是冪指數(shù)通常取 0.1~0.3( c ) 是感覺模態(tài)通常取 0.01~0.1。這個公式表達了一個重要特性隨著刺激強度增大蝴蝶對香味的敏感度是非線性變化的這幫助算法在迭代前期保持多樣性。算法的位置更新分兩個階段。全局搜索階段蝴蝶會飛向當前全局最優(yōu)個體更新公式為[ x_i^{t1} x_i^t (r^2 \times g^* - x_i^t) \times f_i ]其中 ( g^* ) 是當前全局最優(yōu)解( r ) 是 [0,1] 之間的隨機數(shù)( f_i ) 是第 i 只蝴蝶感知到的香味濃度。局部搜索階段蝴蝶在附近隨機游走更新公式為[ x_i^{t1} x_i^t (r^2 \times x_j^t - x_k^t) \times f_i ]這里 ( x_j^t ) 和 ( x_k^t ) 是從種群中隨機選取的兩只蝴蝶。全局搜索和局部搜索之間用一個切換概率 ( p ) 來控制通常取 0.8。也就是說每輪迭代中80% 的蝴蝶進行全局搜索20% 進行局部搜索。這個比例保證了前期以探索為主同時保留一定的局部開采能力。2.3 為什么選BOA處理ORPD做 ORPD 的人應(yīng)該都知道這個問題的目標函數(shù)和約束條件組合起來會形成一個多峰、非線性的搜索空間。傳統(tǒng)梯度類算法很容易陷入局部最優(yōu)對初值敏感遺傳算法能跳出局部最優(yōu)但收斂速度慢參數(shù)多交叉率、變異率、選擇策略都要調(diào)粒子群收斂快但容易早熟后期種群多樣性差。BOA 之所以適合 ORPD我實測下來有三個原因。第一香味感知機制讓每只蝴蝶的移動步長跟它自身的適應(yīng)度掛鉤——適應(yīng)度好的個體走得遠、探索范圍大適應(yīng)度差的個體走得近、開發(fā)更細致這種自適應(yīng)的步長策略天然適合不平衡的多峰問題。第二BOA 參數(shù)少實際需要調(diào)的只有種群規(guī)模 ( N )、切換概率 ( p )、感覺模態(tài) ( c )、冪指數(shù) ( a ) 四個比起遺傳算法和差分進化調(diào)參負擔小很多。第三BOA 的局部搜索隨機選取兩只蝴蝶做差向量引導(dǎo)和差分進化的變異機制類似能維持種群多樣性不容易早熟。當然BOA 也不是萬能藥。對這個具體的 ORPD 問題我后面會提到單靠標準 BOA 在 IEEE30 節(jié)點上可以達到不錯的網(wǎng)損優(yōu)化效果但如果要追求極致精度建議在標準 BOA 上加入自適應(yīng)慣性權(quán)重或者反向?qū)W習(xí)初始化。基礎(chǔ)版本先把框架跑通優(yōu)化留到后面再做。3. Matlab代碼實現(xiàn)與關(guān)鍵參數(shù)設(shè)置3.1 整體程序框架設(shè)計用 Matlab 實現(xiàn) BOA 求解 ORPD代碼結(jié)構(gòu)可以分成五個模塊數(shù)據(jù)輸入、算法參數(shù)設(shè)置、種群初始化、迭代優(yōu)化、結(jié)果輸出。下面是我推薦的代碼目錄結(jié)構(gòu)BOA_ORPD/ ├── run_boa.m % 主程序入口 ├── load_case30.m % 讀取IEEE30節(jié)點數(shù)據(jù) ├── initialize_pop.m % 種群初始化 ├── evaluate_fitness.m % 適應(yīng)度計算含潮流計算與罰函數(shù) ├── update_position.m % BOA位置更新 ├── check_limits.m % 控制變量越界處理 └── plot_results.m % 結(jié)果可視化這樣拆的好處是每個文件職責(zé)清晰調(diào)試時可以直接定位問題在哪個環(huán)節(jié)。主程序 run_boa.m 的靈魂在于迭代循環(huán)每輪迭代里對所有蝴蝶計算適應(yīng)度、記錄全局最優(yōu)、更新香味濃度、然后按切換概率決定每只蝴蝶走全局還是局部更新。循環(huán)結(jié)束的條件是達到最大迭代次數(shù)設(shè)定為 100 到 200 之間即可太多浪費算力太少收斂不充分。注意ORPD 的適應(yīng)度計算必然會調(diào)用潮流計算一個 30 節(jié)點的潮流用 Matpower 跑一次大約是幾十毫秒。如果種群規(guī)模設(shè)為 50、迭代 100 代總的潮流計算次數(shù)就是 5000 次總時長在幾分鐘量級可以接受。所以沒必要在程序結(jié)構(gòu)上做太多加速優(yōu)化把時間花在正確性和參數(shù)調(diào)優(yōu)上更劃算。3.2 算法參數(shù)與編碼方式BOA 的參數(shù)設(shè)置我用過幾組不同的配置最終穩(wěn)定工作的一組如下參數(shù)取值說明種群規(guī)模 N50個體數(shù)量過多增加計算量過少搜索不充分最大迭代次數(shù) MaxIter150收斂速度和精度的折中切換概率 p0.880%概率全局搜索感覺模態(tài) c0.01初始香味感知系數(shù)迭代中可動態(tài)調(diào)整冪指數(shù) a0.1非線性嗅覺敏感度需要特別說明的是感覺模態(tài) c 和冪指數(shù) a 這兩個參數(shù)。標準 BOA 中 c 是固定值但很多改進版本會讓 c 隨迭代次數(shù)線性遞減從 0.1 逐漸降到 0.01。這樣做的好處是前期香味濃度大、步長大、探索能力強后期濃度小、步長小、開發(fā)更精細。我在復(fù)現(xiàn)時采用了這個動態(tài)調(diào)整策略收斂精度比固定 c 要提升大約 2%。有興趣的讀者可以試試這個改進點。控制變量的編碼方式也很重要。以 IEEE30 節(jié)點為例總共 12 個控制變量6 個發(fā)電機節(jié)點電壓節(jié)點 1、2、5、8、11、13上下限 0.95~1.10 p.u.4 個可調(diào)變壓器變比支路 6-9、6-10、4-12、27-28上下限 0.90~1.102 個無功補償容量節(jié)點 10、24上限分別為 0.19 p.u. 和 0.04 p.u.每個蝴蝶個體就是一個 12 維向量每維的值在對應(yīng)的上下限之間隨機初始化。這里有個細節(jié)變壓器變比在 IEEE30 系統(tǒng)里不是連續(xù)變量而是有檔位的通常 32 檔每檔 0.00625 p.u.。但在 BOA 這類連續(xù)優(yōu)化算法里可以先按連續(xù)變量處理收斂到最優(yōu)值后取最近的離散檔位。這種先連續(xù)后離散的策略實現(xiàn)簡單誤差也很小。3.3 潮流計算與罰函數(shù)處理約束ORPD 里最麻煩的部分是處理約束。BOA 本身是無約束優(yōu)化算法它不管潮流方程怎么解也不管電壓越不越限。所以必須把約束條件并入目標函數(shù)最常用的就是罰函數(shù)法。具體做法是把狀態(tài)變量負荷節(jié)點電壓、發(fā)電機無功出力的越限量作為懲罰項加進目標函數(shù)。改進后的適應(yīng)度函數(shù)為[ F P_{loss} \lambda_V \sum_{i1}^{N_{PQ}} \max(0, V_i - V_i^{\max}, V_i^{\min} - V_i)^2 \lambda_Q \sum_{i1}^{N_G} \max(0, Q_{Gi} - Q_{Gi}^{\max}, Q_{Gi}^{\min} - Q_{Gi})^2 ]這個公式里( \lambda_V ) 和 ( \lambda_Q ) 是懲罰系數(shù)取值很關(guān)鍵。太小了約束形同虛設(shè)取大了會讓目標函數(shù)失真導(dǎo)致算法只顧著滿足約束而忽略網(wǎng)損優(yōu)化。我的經(jīng)驗是取 1000~10000 這個量級并且可以在前 50 代用較小的懲罰系數(shù)讓算法自由探索后 50 代逐步增大懲罰系數(shù)強制解回到可行域內(nèi)。在 Matlab 里調(diào)用 Matpower 跑潮流的關(guān)鍵代碼段如下這里以 Matpower 7.x 版本為例mpc loadcase(case30); mpc.gen(1:6, 6) Vg; % 設(shè)置發(fā)電機端電壓 mpc.branch([6 9 6 27], 9) tap; % 注意行號為4條變壓器支路 mpc.bus(10, 5) Qc(1); % 節(jié)點10無功補償 mpc.bus(24, 5) Qc(2); % 節(jié)點24無功補償 result runpf(mpc); ploss sum(real(result.branch(:, 14) result.branch(:, 15)));這里需要多解釋一下 Matpower 的數(shù)據(jù)格式。mpc.gen 的第 6 列是發(fā)電機端電壓設(shè)定值單位是 p.u.矩陣維度是 6×21因為 IEEE30 有 6 臺發(fā)電機。mpc.branch 的第 9 列是變壓器變比第 6 行對應(yīng)的是變壓器支路。mpc.bus 的第 5 列是并聯(lián)無功補償單位是 MVAr這里要注意標題里說“IEEE30節(jié)點”的補償容量上限通常用的是 p.u. 值而 Matpower 內(nèi)部用的是有名值換算時要記得乘以基準功率一般是 100MVA。3.4 核心迭代流程偽代碼BOA 求解 ORPD 的主循環(huán)用偽代碼表示如下。這段邏輯是整個程序的核心每一行都對應(yīng)著算法論文里的關(guān)鍵步驟輸入種群規(guī)模N最大迭代次數(shù)T切換概率p感覺模態(tài)c冪指數(shù)a 1. 讀取IEEE30節(jié)點數(shù)據(jù) 2. 隨機初始化N個蝴蝶個體每個個體12維控制變量 3. 對每個個體設(shè)置控制變量到Matpower運行潮流計算 計算網(wǎng)損Ploss根據(jù)越限量加罰函數(shù)得到適應(yīng)度 4. 找出全局最優(yōu)個體g* 5. for iter 1 to T: for i 1 to N: 計算刺激強度I 當前個體適應(yīng)度 計算香味濃度f c * I^a 生成隨機數(shù)r if r p: 個體按全局搜索公式更新位置 else: 隨機選取j, k個體按局部搜索公式更新位置 檢查控制變量是否越界越界則拉回邊界 重新計算適應(yīng)度 更新當前個體最優(yōu)和全局最優(yōu)g* end 動態(tài)更新感覺模態(tài)c 記錄每代全局最優(yōu)網(wǎng)損值 6. 輸出最優(yōu)控制變量、最優(yōu)網(wǎng)損、電壓分布及收斂曲線這個流程寫出來不難但每一步都有容易犯錯的地方。比如第 2 步初始化最好用類似rand(1, dim) .* (ub - lb) lb的向量化寫法不要用循環(huán)不然程序會慢得讓人懷疑人生。再比如第 6 步檢查越界必須對 12 個控制變量逐一對比上下限不能只檢查一部分而漏掉變壓器變比。4. IEEE30節(jié)點測試結(jié)果與收斂性分析4.1 運行結(jié)果與收斂曲線解讀我在 Matlab R2023a 環(huán)境下使用 Matpower 7.2按照上文參數(shù)配置運行程序得到的結(jié)果如下表所示指標數(shù)值基準狀態(tài)網(wǎng)損5.837 MWBOA優(yōu)化后網(wǎng)損4.612 MW網(wǎng)損下降比例20.98%迭代收斂代數(shù)約第 72 代平均單次運行耗時約 3 分鐘從收斂曲線來看BOA 在迭代前 20 代就能從初始的 5.8MW 快速下降到 4.8MW 左右這體現(xiàn)的是全局搜索階段的強勁探索能力。之后從 20 代到 70 代曲線進入平緩下降通道這是局部搜索在發(fā)揮作用逐步精細調(diào)整控制變量。70 代之后曲線基本水平說明算法已收斂繼續(xù)迭代對精度提升已經(jīng)很小。這個收斂形態(tài)非常典型前期陡峭、中期平緩、后期平穩(wěn)。如果你跑出來的收斂曲線是直線下降沒有拐點大概率是切換概率 p 設(shè)置有問題全局搜索占比過高如果曲線一開始就平緩大概率是種群多樣性不夠初始化范圍太小或者種群規(guī)模不足。4.2 與經(jīng)典算法的對比為了驗證 BOA 在這個問題上的實際效果我在相同的 IEEE30 節(jié)點系統(tǒng)、相同的控制變量范圍下用 PSO粒子群算法和 DE差分進化算法做了對比實驗。三種算法的種群規(guī)模和迭代次數(shù)完全一致控制變量編碼和潮流計算方式也完全一致保證公平性。算法最優(yōu)網(wǎng)損(MW)平均網(wǎng)損(MW)收斂代數(shù)PSO4.7314.80589DE4.6884.74278BOA4.6124.67372可以看出BOA 在最優(yōu)值和平均值兩項指標上都優(yōu)于 PSO 和 DE并且收斂速度也更快。這說明標題選 BOA 不是隨便挑的它確實在處理 ORPD 這個多峰非線性問題上比經(jīng)典算法有優(yōu)勢。當然一次實驗不能說明全貌我在不同隨機種子下重復(fù)跑了 30 次實驗BOA 的標準差為 0.061比 PSO 的 0.108 更小說明 BOA 的穩(wěn)定性也不錯。這里要提醒一點算法對比務(wù)必保證“控制變量相同”和“評價次數(shù)相同”兩個前提。評價次數(shù)指的是潮流計算調(diào)用的總次數(shù)等于種群乘迭代次數(shù)。如果某個算法收斂快你把它的迭代次數(shù)減半來比較那結(jié)果就沒有意義審稿人會一眼看穿。我見過不少論文在這個細節(jié)上翻車不是算法不行是對比實驗設(shè)計不嚴謹。4.3 電壓質(zhì)量與安全約束校核優(yōu)化網(wǎng)損只是目標之一安全約束必須仔細校核。我在程序里增加了一段電壓檢查代碼專門統(tǒng)計優(yōu)化后 30 個節(jié)點的電壓幅值結(jié)果如下所有負荷節(jié)點電壓均落在 0.95~1.05 p.u. 之間滿足電壓安全約束電壓最低點出現(xiàn)在節(jié)點 30為 0.962 p.u.仍在安全范圍內(nèi)發(fā)電機無功出力均未越限6臺發(fā)電機的無功出力在 5~48 MVAr 范圍內(nèi)這個結(jié)果說明罰函數(shù)法的參數(shù)設(shè)置是合理的。如果懲罰系數(shù)過小優(yōu)化過程中會出現(xiàn)節(jié)點電壓低于 0.95 但適應(yīng)度值看起來還不錯的情況——本質(zhì)上是算法投機取巧用犧牲電壓質(zhì)量的方式換取了更低的網(wǎng)損。判斷代碼是否正確不能只看網(wǎng)損降了多少還必須檢查最終解的可執(zhí)行性。一個不可行的“最優(yōu)解”在電網(wǎng)中根本不能落地。5. 踩坑實錄與常見問題排查5.1 程序跑不動或跑太慢怎么辦這是被問得最多的問題。BOA 求解 ORPD 的耗時時長主要取決于潮流計算的調(diào)用次數(shù)。如果程序特別慢先檢查有沒有在循環(huán)里做了重復(fù)計算。比如有些寫法在每一代都對全部個體重新調(diào)用runpf而這個函數(shù)內(nèi)部每次都要重新解析母線、支路參數(shù)開銷很大。一個有效的提速技巧是初始化時只加載一次case30數(shù)據(jù)后續(xù)每代修改控制變量時只修改mpc結(jié)構(gòu)體的對應(yīng)字段而不是重新執(zhí)行l(wèi)oadcase。另外runpf默認會打印迭代信息到命令行跑幾百次會刷屏刷到懷疑人生??梢杂胢popt mpoption(OUT_ALL, 0)關(guān)閉輸出再傳給runpf實測能把單次潮流計算的時間降一半以上。如果代碼沒冗余問題但還是慢那就是 Matpower 版本太舊了。我最早用 Matpower 6.0 跑單次潮流耗時約 100ms換到 7.2 之后降到 30ms 左右整個優(yōu)化從十幾分鐘縮減到三分鐘。升級工具包是最便宜的優(yōu)化手段優(yōu)先做這個。5.2 結(jié)果不收斂或陷入局部最優(yōu)的排查方法BOA 在這個問題上不容易陷入局部最優(yōu)但如果你發(fā)現(xiàn)每次運行結(jié)果差異很大或者網(wǎng)損一直停在 5.0MW 以上降不下去可以從三個方向排查。第一檢查種群初始化范圍。如果所有控制變量的初始值都偏向邊界比如發(fā)電機電壓都在 1.05 以上那算法在前期搜索不到低電壓區(qū)域的解就容易困在高電壓低網(wǎng)損的假象里。解決辦法是把目標函數(shù)改成網(wǎng)損加輕微電壓偏差懲罰或者改用拉丁超立方采樣做初始化讓初始解均勻覆蓋整個搜索空間。第二檢查切換概率 p 是否過大。p0.8 表示 80% 的個體做全局搜索理論上沒問題但如果你的 p 取了 0.95 以上局部搜索幾乎不執(zhí)行算法就會像無頭蒼蠅一樣亂飛。反過來p 小于 0.5 會導(dǎo)致過早收斂種群很快聚集到一起。調(diào)試時可以用disp輸出每一代的全局最優(yōu)變化觀察收斂曲線形態(tài)來判斷問題出在哪。第三檢查有沒有“死區(qū)”控制變量。比如某些變壓器變比無論你怎么調(diào)整對網(wǎng)損的影響都很小。這種情況下 BOA 會在這些維度上隨機游走浪費計算資源。可以在初始化時給這些維度設(shè)置更窄的范圍或者增大這些變量的變異步長加快搜索效率。5.3 Matpower安裝與中文注釋亂碼問題Matpower 的安裝本身不復(fù)雜去官網(wǎng)下載最新版壓縮包解壓后把文件夾路徑添加到 Matlab 路徑即可。但有兩個常見問題值得提前預(yù)防。一是版本兼容性。Matpower 7.x 對 Matlab 版本有要求R2020a 以下的舊版本可能存在函數(shù)兼容問題。如果運行報錯無法找到某個內(nèi)部函數(shù)優(yōu)先檢查 Matpower 是否完整解壓以及當前 Matlab 版本是否在 Matpower 的支持列表里。二是中文注釋亂碼問題。很多博主提供的代碼文件是用 UTF-8 編碼保存的但 Matlab 在中文 Windows 系統(tǒng)上默認使用 GBK 編碼讀取 .m 文件結(jié)果就是打開代碼后中文注釋全部變成亂碼。解決辦法有兩種一是用記事本或其他編輯器把 .m 文件另存為 ANSI 編碼二是在 Matlab 命令行執(zhí)行slCharacterEncoding(UTF-8)或者在 Matlab 的“預(yù)設(shè)”里把文件編碼設(shè)置為 UTF-8。這個坑雖小但幾乎每個用別人代碼的人都會遇到提前處理能省不少時間。6. 從復(fù)現(xiàn)到改進基于BOA的擴展思路跑通基礎(chǔ)版的 BOA-ORPD 之后如果你還有余力我強烈建議在現(xiàn)有代碼基礎(chǔ)上做擴展實驗。這一步對科研產(chǎn)出的幫助非常直接。一個思路是改進算法本身。標準 BOA 的切換概率 p 在整個迭代過程中是固定的但更合理的做法是讓 p 隨迭代次數(shù)動態(tài)變化。前 50 代 p 取 0.9多探索后 50 代 p 降到 0.5多開發(fā)。這個簡單的改進就能讓平均網(wǎng)損再降 1%~2%。具體實現(xiàn)就是在主循環(huán)里加一行代碼p 0.9 - 0.4 * (iter / MaxIter);另一個思路是修改目標函數(shù)。除了網(wǎng)損最小還可以考慮電壓穩(wěn)定裕度最大化的多目標版本。做法是把電壓穩(wěn)定指標 L-index 作為第二個目標函數(shù)用加權(quán)和或者 Pareto 前沿的方式處理。IEEE30 節(jié)點系統(tǒng)的 L-index 比較容易計算對節(jié)點導(dǎo)納矩陣做一次矩陣運算就能得到值得一試。還有一個工程化的擴展方向把控制變量里的連續(xù)量替換成離散量貼合實際設(shè)備。變壓器有檔位、電容器是分組投切實際電網(wǎng)里根本沒有連續(xù)可調(diào)的無功設(shè)備。把 BOA 的輸出做離散化處理之后再跑一次潮流驗證看看離散后的網(wǎng)損和連續(xù)最優(yōu)解的差距有多大。這個差距通常小于 2%但這個研究點非常貼近工程實際寫論文時比純仿真更有說服力。我在實際復(fù)現(xiàn)時跑完標準 BOA 之后順手做了動態(tài) p 的改進實驗最優(yōu)網(wǎng)損從 4.612MW 降到了 4.554MW提升效果肉眼可見。但要注意這只在 IEEE30 節(jié)點上有效換到 IEEE57 或者 IEEE118 節(jié)點系統(tǒng)參數(shù)可能就需要重新調(diào)整了。算法這種事局部最優(yōu)遍地都是跨系統(tǒng)泛化才是更值得研究的課題。