經(jīng)濟調(diào)度實戰(zhàn)解析)
最近有好幾個做電力系統(tǒng)方向的朋友跟我聊起同一個話題碳排放交易機制到底怎么揉進優(yōu)化調(diào)度模型里而且要求還特別具體——要用分布式ADMM來解。這個方向確實是目前論文和工程落地的一個交叉熱點一方面雙碳目標下碳約束成了調(diào)度的硬命題另一方面集中式優(yōu)化在大規(guī)模多區(qū)域電網(wǎng)里越來越吃力加上分布式ADMM天然適合多利益主體、多控制中心的架構(gòu)兩者疊在一起就成了很自然的選項。我自己完整復(fù)現(xiàn)過一個基于分布式ADMM、考慮碳排放交易的電力系統(tǒng)經(jīng)濟調(diào)度算例從模型搭建、算法推導(dǎo)到MATLAB編碼踩了不少坑也攢了一些比較實用的經(jīng)驗。這篇文章就把整個思路、建模過程、代碼架構(gòu)和排錯心得一次性講清楚適合正在做相關(guān)課題的學生、剛接觸分布式優(yōu)化的工程師或者想在自己的調(diào)度系統(tǒng)里加碳約束的開發(fā)者參考。不保證寫得絕對學術(shù)嚴謹?shù)WC是從實操角度能直接抄作業(yè)的那種。1. 為什么這個方向值得做分布式ADMM與碳排放交易的組合邏輯1.1 集中式調(diào)度的問題出在哪傳統(tǒng)電力系統(tǒng)經(jīng)濟調(diào)度以集中式為主調(diào)度中心收集全網(wǎng)機組參數(shù)、負荷預(yù)測、網(wǎng)絡(luò)拓撲統(tǒng)一求解一個全局優(yōu)化問題。這種方式在電網(wǎng)規(guī)??煽亍⑿畔⑼耆_的前提下很有效但放到現(xiàn)在的場景下就有點吃力了。首先是計算量的問題。多區(qū)域互聯(lián)電網(wǎng)模型規(guī)模大、約束多全網(wǎng)集中建模后優(yōu)化問題的變量維度和約束數(shù)量都會暴漲單次求解時間會變得非常難看。尤其調(diào)度周期從小時級擴展到分鐘級滾動優(yōu)化之后集中式算法在計算速度上很難滿足實時性需求。更重要的是隱私與協(xié)調(diào)的矛盾?,F(xiàn)代電網(wǎng)往往是多主體協(xié)同架構(gòu)不同區(qū)域的電網(wǎng)由不同控制中心管理新能源場站、儲能運營商、售電公司各有各的商業(yè)數(shù)據(jù)。機組成本曲線、負荷預(yù)測、可調(diào)容量這些信息沒有哪一方愿意當作公開數(shù)據(jù)交給一個中心化的調(diào)度平臺。集中式調(diào)度要求所有參與者上交核心私有信息這在工程上并不現(xiàn)實。還有一個容易被忽略的問題集中式方案的單點故障風險。一旦調(diào)度中心出問題整個優(yōu)化調(diào)度鏈條就癱瘓了。分布式架構(gòu)天然規(guī)避了這一點各區(qū)域可以獨立運行、按需通信。所以分布式優(yōu)化不是“為了分布式而分布式”而是確實有多區(qū)域協(xié)調(diào)、數(shù)據(jù)隱私保護、高可靠性的現(xiàn)實需求。1.2 ADMM的分布式思路ADMM全稱是交替方向乘子法它的核心思想是“分解-協(xié)調(diào)”。把一個大的全局優(yōu)化問題拆成若干個可以獨立求解的子問題子問題各自求解后交換少量邊界信息通過迭代逐步逼近全局最優(yōu)解。我用一個很生活化的例子說明ADMM的原理。假設(shè)三個朋友一起做飯一個人負責洗菜、一個人負責炒菜、一個人負責擺盤但廚房只有一個灶臺、一個水池。如果各自完全獨立干活會因為資源沖突亂成一團如果所有事都集中到一個人身上安排其他人的靈活度又沒了。ADMM的思路是大家各自干各自的活但每隔一段時間對一下表——你什么時候用灶臺、我什么時候用水池通過反復(fù)協(xié)調(diào)最終形成一套大家都能接受的安排而且整體效率接近集中統(tǒng)籌的結(jié)果。在電力系統(tǒng)調(diào)度里這個“對表”的過程就是各區(qū)域之間交換聯(lián)絡(luò)線功率或邊界節(jié)點相角信息每次迭代都向全局一致性目標靠攏一點。ADMM最優(yōu)秀的地方在于第一它不要求目標函數(shù)嚴格凸很多實際中的非光滑項比如機組啟停的0-1變量帶來的非凸性、碳排放配額的階躍約束也能在框架里較好地處理第二收斂性理論相對成熟在溫和條件下可以證明收斂到全局最優(yōu)或局部最優(yōu)第三實現(xiàn)簡單只需要在現(xiàn)有優(yōu)化求解器外面包一層迭代循環(huán)即可不需要專門開發(fā)新的求解內(nèi)核。1.3 碳排放交易怎么落進優(yōu)化調(diào)度模型碳排放交易機制的底層邏輯是用市場手段給碳排放定價。在碳市場中政府給排放主體發(fā)放碳排放配額如果實際排放低于配額可以把剩余配額賣出獲利如果實際排放超過配額就必須從市場上購買配額否則面臨高額罰款。把這種機制引入優(yōu)化調(diào)度后碳排放就不再只是一個環(huán)保指標而是變成了直接影響調(diào)度決策的經(jīng)濟信號。具體來說優(yōu)化目標需要在傳統(tǒng)的發(fā)電成本之外加上碳交易成本讓機組在出力分配時自動權(quán)衡“多發(fā)一度電掙的錢”和“多發(fā)一度電對應(yīng)的碳成本”。這個模型設(shè)計里有幾個關(guān)鍵問題要處理初始配額怎么給一般有免費分配法和有償分配法學術(shù)計算里常用免費分配法基于機組歷史排放水平或出力的基準線乘以一個比例系數(shù)。碳價如何設(shè)定碳交易成本可以設(shè)置為一個常數(shù)也可以設(shè)計成階梯函數(shù)——碳排放量超過一定閾值后單位碳價跳升這樣更貼近真實碳市場中的價格波動。碳約束是軟約束還是硬約束如果碳配額不足必須購買那碳交易成本是目標函數(shù)里的一項如果允許直接限排放量那就是一個不等式約束。更常見的處理是把兩者結(jié)合起來既能購買配額也允許一定程度超排但超排要付出更高代價。從我實際復(fù)現(xiàn)的經(jīng)驗看把碳交易成本寫成目標函數(shù)里的一項用碳價乘以凈排放量實際排放減配額是最容易實現(xiàn)且結(jié)果最直觀的做法。2. 模型構(gòu)建與數(shù)學表述從目標函數(shù)到分布式約束2.1 目標函數(shù)拆解我算例用的是標準經(jīng)濟調(diào)度模型加上碳交易項。先看整體目標函數(shù)每個區(qū)域獨立寫自己的目標最后通過耦合約束串起來。目標函數(shù)由三部分組成機組發(fā)電成本、碳交易成本、棄電懲罰可選。發(fā)電成本我用二次函數(shù)擬合成本曲線對機組$i$在時段$t$的出力和啟停狀態(tài)進行建模。這里要說明的是很多論文用線性化成本函數(shù)簡化計算但實際機組成本曲線更接近凸二次函數(shù)。ADMM對凸二次目標函數(shù)收斂性很好沒必要主動簡化掉。碳交易成本分兩塊。一塊是實際碳排放量超過免費配額時需要花真金白銀購買配額的成本另一塊是碳排放量低于配額時賣出剩余配額獲取的收益。兩者符號相反本質(zhì)都是凈排放量與碳價的乘積。再補一個棄電懲罰項。新能源滲透率較高的算例里如果不給棄風棄光設(shè)懲罰模型會為了降低發(fā)電成本極端壓縮火電出力導(dǎo)致部分節(jié)點電壓越限或備用不足等問題。加一個線性的棄電懲罰系數(shù)數(shù)值上取略高于煤電邊際成本的值讓模型在棄風和降碳之間自然權(quán)衡。這樣每個區(qū)域的子問題目標函數(shù)就清楚了區(qū)域內(nèi)所有機組發(fā)電成本 碳交易成本 棄電懲罰最小化。2.2 約束體系要覆蓋哪些內(nèi)容約束條件是整個模型的骨架缺一個約束、松一個約束都可能讓結(jié)果完全跑偏。對于一個區(qū)域$k$內(nèi)的優(yōu)化子問題我至少考慮了以下約束第一類是功率平衡約束。區(qū)域內(nèi)所有機組出力、新能源出力、其他區(qū)域流入功率之和必須等于本區(qū)域負荷需求。這個約束在每個調(diào)度時段都成立。用拉格朗日乘子配上ADMM框架里的邊界變量這塊約束是各區(qū)域內(nèi)部自行滿足的不需要跨區(qū)域協(xié)調(diào)。第二類是機組出力上下限約束。常規(guī)火電機組有技術(shù)出力上下限新能源機組出力上限由預(yù)測功率決定下限為0。對儲能設(shè)備還要加充放電功率上下限和SOC荷電狀態(tài)約束如果算例里含儲能的話。第三類是機組爬坡約束。相鄰時段出力的變化量不能超過爬坡速率限制。這個約束是時間維度上的耦合在分布式分解時要把時間變量保留在同一個區(qū)域的優(yōu)化問題內(nèi)部避免把一個區(qū)域的跨時段約束切碎了。第四類是網(wǎng)絡(luò)傳輸約束。各區(qū)域之間的聯(lián)絡(luò)線傳輸功率必須在額定限額之內(nèi)。這是最典型的跨區(qū)域耦合約束也是ADMM分解時要重點處理的邊界約束。具體做法是把聯(lián)絡(luò)線功率復(fù)制成兩份分別由區(qū)域$i$和區(qū)域$j$的決策變量表示然后強制這兩份相等。第五類是碳排放約束或配額約束。模型采用“配額上限 市場購買”機制實際排放量減去配額后如果為正需要購買等量配額為負則可以出售均按碳價結(jié)算。這里我得提醒一個容易踩的坑約束的松弛方式會顯著影響結(jié)果解釋。比如負荷平衡約束如果只寫成等式約束模型會嚴格滿足但如果求解器數(shù)值精度不夠可能在某些迭代輪次出現(xiàn)微小的功率不平衡。實際操作中一般允許一個很小的容差比如10^-4避免ADMM迭代后期因為數(shù)值抖動來回震蕩不收斂。2.3 碳交易模型具體怎么量化碳交易部分的量化我按以下方式處理先算每臺機組在出力$P$下的碳排放量用單位出力的碳排放強度乘以出力并累加。碳排放強度和機組類型強相關(guān)燃煤機組約0.8-1.0 tCO2/MWh燃氣機組約0.4-0.5 tCO2/MWh新能源幾乎為0。算例里我分別設(shè)置了不同機型的碳排放強度系數(shù)。再確定免費配額。免費配額按兩種基準一是按機組歷史平均出力乘以基準排放強度二是按總配額在機組之間按容量比例分攤。我用了按歷史出力的方式這樣更容易體現(xiàn)“出力越高的機組拿到的配額越多但實際排放可能更高”的現(xiàn)實邏輯。碳價設(shè)為常量還是動態(tài)量會直接影響模型行為。常量碳價實現(xiàn)簡單算出來的結(jié)果更穩(wěn)定動態(tài)碳價比如超過配額閾值后碳價上浮更貼近市場實際情況但增加了目標函數(shù)的非凸性ADMM收斂速度會受影響。我的建議是先做常量碳價版本跑通之后再擴展動態(tài)碳價。凈排放量 實際排放 - 免費配額。若為正碳交易成本為正買配額若為負碳交易成本為負賣配額收益進目標函數(shù)。這個設(shè)計讓模型在約束收緊時會自動調(diào)低高碳機組出力提高低碳機組和新能源出力比例效果立竿見影。3. 分布式ADMM的求解流程與收斂機制3.1 問題分解區(qū)域自治 邊界協(xié)調(diào)ADMM第一步是問題分解。把全局調(diào)度問題建模為各區(qū)域子問題加耦合約束的形式。每個區(qū)域$k$維護自己的決策變量$x_k$包括區(qū)域內(nèi)各機組出力、新能源出力、儲能充放電功率等。耦合約束特指聯(lián)絡(luò)線功率一致性約束區(qū)域$i$流入?yún)^(qū)域$j$的功率等于區(qū)域$j$從區(qū)域$i$接收到的功率。注意這里有個選擇是把耦合約束的功率變量直接復(fù)制成兩個區(qū)域的變量然后強制相等還是用一個公共變量統(tǒng)一表示聯(lián)絡(luò)線潮流。后者在物理上更直觀但會把不同區(qū)域的變量綁得過緊削弱分布式特性。所以我采用前者——復(fù)制變量加一致性約束這也是ADMM論文里最標準的處理方式。這樣分解之后每個區(qū)域內(nèi)部可以獨立求解一個帶邊界變量副本的優(yōu)化子問題。區(qū)域之間唯一需要交換的信息就是邊界變量的取值和對偶變量乘子不涉及任何區(qū)域內(nèi)部的成本曲線、機組參數(shù)或負荷數(shù)據(jù)。隱私保護的訴求就滿足了。3.2 迭代更新預(yù)測-修正-協(xié)調(diào)三步走ADMM迭代核心是三步和預(yù)測控制里的模型預(yù)測 反饋校正節(jié)奏很像第一步所有區(qū)域并行求解各自的子問題目標函數(shù)里除了本區(qū)域發(fā)電成本和碳交易成本之外再加一個增廣拉格朗日罰項。這個罰項包含了與相鄰區(qū)域交換的邊界變量偏差以及上次迭代的對偶乘子作用是引導(dǎo)本區(qū)域在追求個體最優(yōu)的同時兼顧整體協(xié)調(diào)。第二步獲取各區(qū)域更新后的邊界變量匯總到協(xié)調(diào)層可以是某一區(qū)域擔任協(xié)調(diào)者也可以是虛擬的協(xié)調(diào)中心更新對偶乘子。乘子更新的物理意義是如果區(qū)域A發(fā)送的功率和區(qū)域B接收的功率不一致就按偏差大小調(diào)整對偶乘子相當于給A、B雙方都施加一個“糾偏力”。第三步檢查收斂條件。計算原始殘差邊界變量偏差的范數(shù)和對偶殘差相鄰兩次迭代邊界變量變化量的范數(shù)兩者都小于閾值時停止迭代。這里有個實現(xiàn)細節(jié)值得強調(diào)區(qū)域子問題并行求解時理論上各區(qū)域之間不需要通信真正需要通信的只有邊界變量和對偶乘子。所以代碼里不需要復(fù)雜的分布式通信框架用MATLAB的parfor循環(huán)或者直接for循環(huán)按順序求解各區(qū)域子問題即可迭代層面做串行協(xié)調(diào)。如果想模擬真正的并行效果就改用parallel computing toolbox的spmd或parfeval。3.3 收斂判據(jù)和罰參數(shù)選擇的門道ADMM收斂判據(jù)和罰參數(shù)$\rho$的選擇直接決定代碼能不能在合理時間內(nèi)跑完。收斂判據(jù)我用的是雙殘差標準。閾值設(shè)置很關(guān)鍵設(shè)太松結(jié)果質(zhì)量差設(shè)太緊則會迭代幾百次出不來。實踐中我一般設(shè)原始殘差閾值1e-4對偶殘差閾值1e-4。如果算例規(guī)模大或者參數(shù)復(fù)雜度高放寬到1e-3也沒有太大問題。罰參數(shù)$\rho$的選擇是ADMM最玄學的部分。$\rho$過小原始殘差下降慢對偶乘子提供的糾偏力弱整體收斂速度慢$\rho$過大雖然原始殘差快速下降但對偶乘子更新容易震蕩導(dǎo)致對偶殘差一直降不下來甚至在某些非凸場景下直接發(fā)散。我的經(jīng)驗是從$\rho 0.1$起步觀察前20輪迭代的殘差變化曲線。如果原始殘差下降過于平緩就把$\rho$提升一個量級如果原始殘差快速下降到很小但對偶殘差反復(fù)震蕩就降低$\rho$。這個調(diào)參過程就像是調(diào)水龍頭的冷熱開關(guān)找到一個讓兩邊殘差均衡同步下降的點。更精細的做法是采用自適應(yīng)懲罰參數(shù)在迭代過程中根據(jù)原始殘差和對偶殘差的比值動態(tài)調(diào)整。原始殘差過大于對偶殘差時增大$\rho$反之減小$\rho$。這個改進能明顯加快收斂特別是在參數(shù)初始值選取不夠理想的情況下。我有一次從固定$\rho$轉(zhuǎn)到自適應(yīng)$\rho$后迭代次數(shù)從200多輪直接降到60輪以內(nèi)。4. MATLAB實現(xiàn)要點以IEEE 30節(jié)點算例復(fù)現(xiàn)為例4.1 算例選擇和數(shù)據(jù)準備算例我用的是IEEE 30節(jié)點系統(tǒng)這個系統(tǒng)規(guī)模適中做分布式算法驗證非常合適。將系統(tǒng)按區(qū)域邊界劃分為5個子區(qū)域每個區(qū)域包含本地機組、本地負荷和與相鄰區(qū)域的聯(lián)絡(luò)線邊界節(jié)點。數(shù)據(jù)準備階段第一件事是整理機組數(shù)據(jù)。母線編號、機組類型、成本系數(shù)、出力上下限、爬坡速率、碳排放強度。這里我建議把數(shù)據(jù)寫成結(jié)構(gòu)體數(shù)組或MAT文件統(tǒng)一讀入不要散落在多個腳本里后期改參數(shù)會方便很多。第二件事是定義區(qū)域歸屬矩陣。哪個節(jié)點屬于哪個區(qū)域、哪條線路是區(qū)域間聯(lián)絡(luò)線這個是分布式模型的核心數(shù)據(jù)。我建議寫一個區(qū)域劃分的配置函數(shù)輸入節(jié)點編號和線路編號輸出區(qū)域歸屬向量和聯(lián)絡(luò)線列表。這一步可以用可視化工具先畫一遍系統(tǒng)拓撲確認區(qū)域劃分合理再寫進代碼。第三件事是負荷數(shù)據(jù)和新能源出力數(shù)據(jù)。負荷數(shù)據(jù)可以直接用IEEE標準節(jié)點數(shù)據(jù)也可以按典型日負荷曲線自行構(gòu)造新能源出力用一組帶波動性的歸一化出力數(shù)據(jù)。我的建議是設(shè)計一個統(tǒng)一的setup_case.m腳本返回一個包含所有數(shù)據(jù)的結(jié)構(gòu)體。這個腳本相當于整個項目的“數(shù)據(jù)裝配車間”改動算例時只需要動這個腳本。4.2 代碼模塊結(jié)構(gòu)分區(qū)明確迭代清晰MATLAB工程項目最忌諱寫成一個超長腳本。我的代碼結(jié)構(gòu)是這樣的main.m主入口負責讀取數(shù)據(jù)、初始化參數(shù)、調(diào)用迭代循環(huán)、輸出結(jié)果。setup_case.m算例數(shù)據(jù)裝配返回結(jié)構(gòu)和各類參數(shù)。init_admm.m初始化ADMM相關(guān)參數(shù)罰參數(shù)、收斂閾值、最大迭代次數(shù)、對偶變量初值。solve_region.m求解單個區(qū)域的子問題輸入本區(qū)域數(shù)據(jù)、邊界變量當前值、對偶乘子輸出本區(qū)域最優(yōu)決策。update_consensus.m更新邊界一致性變量和對偶乘子。check_convergence.m計算原始殘差、對偶殘差、判斷是否收斂。plot_results.m結(jié)果可視化畫機組出力、碳交易量、迭代收斂曲線。這個結(jié)構(gòu)的好處是每個模塊可以單獨測試。我先測試單個區(qū)域子問題能不能在給定邊界條件下正常求解再測試兩個區(qū)域互聯(lián)的場景最后擴展到5個區(qū)域。逐層遞進出問題時定位非常快。區(qū)域子問題的求解我用的是MATLAB的quadprog或fmincon。如果模型是凸二次規(guī)劃加線性約束quadprog足夠高效如果加了非線性約束或非凸項就得用fmincon。aaa更省事的做法是用YALMIP工具箱建模代碼可讀性更高算小規(guī)模算例時性能損失可忽略。我在復(fù)現(xiàn)時首選YALMIP因為它建模直觀便于快速修改約束條件。4.3 關(guān)鍵代碼片段ADMM迭代骨架下面這段是我主循環(huán)里的核心邏輯做了必要的簡化但保持了完整結(jié)構(gòu)。% main.m 主循環(huán)骨架 for iter 1 : max_iter % 1. 各區(qū)域并行/串行求解子問題 for k 1 : n_region x_region{k} solve_region(k, x_boundary_prev, lambda_prev, params); end % 2. 收集邊界變量更新一致性變量取相鄰區(qū)域邊界變量均值或協(xié)調(diào)值 x_boundary_curr update_boundary(x_region, adjacency_matrix, params); % 3. 更新對偶乘子 lambda_curr lambda_prev params.rho * (x_boundary_curr - x_boundary_reference); % 4. 計算殘差 residual_prim norm(x_boundary_curr - x_boundary_prev, inf); residual_dual params.rho * norm(x_boundary_curr - x_boundary_prev_inner, inf); % 5. 自適應(yīng)調(diào)整罰參數(shù) if residual_prim 10 * residual_dual params.rho params.rho * 2; elseif residual_dual 10 * residual_prim params.rho params.rho / 2; end % 6. 收斂判斷 if residual_prim params.tol residual_dual params.tol break; end end實際編碼中需要注意幾個細節(jié)邊界變量的一致性處理不是簡單地取平均值。更標準的做法是引入一個參考變量更新時讓所有相關(guān)區(qū)域的邊界變量向其靠攏參考變量本身取各區(qū)域邊界變量的均值然后逐區(qū)域更新對偶變量并回傳。對偶乘子lambda的維度必須與邊界變量一致形狀不對會在矩陣運算時報錯這種錯誤很隱蔽建議在初始化后立即打印維度核對一遍。自適應(yīng)$\rho$調(diào)整雖然好用但有一個坑$\rho$如果加得太大子問題目標函數(shù)中的罰項會主導(dǎo)目標導(dǎo)致區(qū)域內(nèi)部約束被稀釋。所以要對$\rho$設(shè)上下限比如限制在[0.01, 100]區(qū)間內(nèi)避免參數(shù)漂移失去意義。4.4 性能調(diào)優(yōu)和經(jīng)驗心得實踐中我發(fā)現(xiàn)幾個直接影響計算效率的點整理出來供參考。第一個是區(qū)域子問題求解器的選擇。quadprog在MATLAB里對付凸二次規(guī)劃很快但它不支持二次約束。如果你的模型加了線路潮流二次約束或者新能源出力的二次約束還是要回到fmincon。fmincon用內(nèi)點法在小規(guī)模問題上足夠穩(wěn)但要做好初始值選擇否則容易進入局部解。第二個是稀疏矩陣的使用。電力系統(tǒng)的鄰接矩陣、節(jié)點導(dǎo)納矩陣天然稀疏在寫代碼時用稀疏存儲大規(guī)模算例下內(nèi)存和計算速度差距非常大。我這部分吃了虧最初用全矩陣存儲5區(qū)域30節(jié)點還不覺得擴展到100節(jié)點后明顯吃力。改成稀疏存儲后速度提升了一個量級。第三個是初始化的技巧。我習慣用各區(qū)域內(nèi)部的純經(jīng)濟調(diào)度結(jié)果作為邊界變量的初值也就是先不考慮跨區(qū)域耦合各自獨立跑一遍區(qū)域內(nèi)經(jīng)濟調(diào)度用這個結(jié)果去初始化邊界變量和對偶變量。這樣初始解已經(jīng)在可行域附近迭代初期殘差就不會太大。相比全零初始化大概能少迭代20到30輪。第四個是分階段驗證的策略。第一次跑通別直接上完整模型先把碳交易從目標函數(shù)里去掉只做常規(guī)經(jīng)濟調(diào)度確認ADMM框架本身沒問題然后加入碳交易成本項和集中式求解結(jié)果對比確認分布式解和集中式解一致最后再擴展場景、調(diào)參數(shù)。我的實際體會是這種“先框架、后業(yè)務(wù)”的遞進調(diào)試方式能讓問題定位時間縮短一半以上。5. 常見問題與排錯實錄5.1 迭代不收斂殘差一直震蕩這是ADMM跑出來的最經(jīng)典問題。殘差曲線如果呈現(xiàn)周期性震蕩最常見的原因是罰參數(shù)$\rho$取值不當。我調(diào)試時遇到過$\rho0.01$時原始殘差平穩(wěn)下降但對偶殘差幾乎不動一直跑到300輪還是達不到閾值把$\rho$調(diào)到1之后兩個殘差都在40輪左右降到閾值以下。另一個原因是邊界變量參考變量更新得太頻繁。如果每輪迭代都直接用當前各區(qū)域邊界變量均值覆蓋參考變量某些情況下會引起連鎖震蕩。我改用“帶慣性”的更新方式參考變量 0.7新均值 0.3舊參考值相當于給協(xié)調(diào)層加了阻尼曲線立刻平穩(wěn)了很多。5.2 分布式結(jié)果和集中式結(jié)果差異過大很多論文要求分布式ADMM結(jié)果逼近集中式最優(yōu)解實際跑下來可能差距不小。我先排查是不是模型分解時遺漏了約束。比如某些區(qū)域間的傳輸容量約束如果沒有轉(zhuǎn)成邊界一致性約束分布式模型和集中式模型的可行域就不一致結(jié)果自然對不上。還有一個常見原因是子問題求解精度設(shè)置過高或過低。fmincon的OptimalityTolerance設(shè)成1e-8雖然能保證子問題高精度但會顯著拖慢單次求解速度設(shè)置成1e-3又可能讓子問題解過于粗糙迭代后期每次邊界變量更新都比較小殘差下降緩慢。我最后折中取了OptimalityTolerance1e-6又給子問題加了最大迭代次數(shù)限制整體收斂速度和結(jié)果質(zhì)量都比較理想。5.3 碳價參數(shù)敏感性太高結(jié)果時好時壞碳交易成本在目標函數(shù)中所占比例如果過低模型基本不會主動調(diào)整機組出力碳排放量幾乎不變碳價如果過高碳交易成本又會蓋過發(fā)電成本模型可能過度壓制火電出力導(dǎo)致系統(tǒng)總成本暴增甚至無解。這里需要敏感性分析。我對碳價做了從10元/噸到500元/噸的掃描橫坐標碳價、縱坐標系統(tǒng)總成本和總排放量畫出一條曲線??梢郧宄吹教純r在50元/噸以內(nèi)時市場規(guī)模很溫和超過100元/噸后排放下降明顯加速。這個表格在論文里作為分析是很好的素材。5.4 MATLAB代碼層面的坑和避坑MATLAB有幾個具體的坑值得提醒。變量覆蓋MATLAB對變量名大小寫不敏感l(wèi)ambda和Lambda是同一個變量。我在代碼里同時用了lambda做對偶乘子、Lambda做線路導(dǎo)納矩陣結(jié)果跑出來的結(jié)果全是錯的排查了兩天才發(fā)現(xiàn)這個低級問題。建議代碼里的變量名區(qū)分度盡量大lambda就叫l(wèi)ambda_dualLambda就叫admit_matrix。parfor使用限制如果區(qū)域子問題求解用parfor并行注意子問題里不能有全局變量和隨機數(shù)。IEE30節(jié)點的5區(qū)域并行跑速度提升接近4倍但我也遇到過一次某個worker崩潰導(dǎo)致整個循環(huán)報錯的情況。穩(wěn)妥的辦法是設(shè)置好parpool的容錯機制或者干脆先用串行跑通再改并行。內(nèi)存泄漏每次調(diào)用fmincon或者quadprog時如果頻繁創(chuàng)建大結(jié)構(gòu)體數(shù)組且不清除迭代上百輪后內(nèi)存會越來越大。迭代循環(huán)里盡量復(fù)用結(jié)構(gòu)體變量不再使用就用clear及時清掉。5.5 結(jié)果可視化角度結(jié)果的可視化不只是為了好看更是排錯的必要手段。我強烈建議在調(diào)試階段就畫三張圖迭代收斂曲線、各區(qū)域聯(lián)絡(luò)線功率交換圖、機組出力與碳排量對比圖。迭代收斂曲線是最直接的排錯工具一眼可以看出殘差是單調(diào)下降還是震蕩。區(qū)域間交換功率圖可以驗證模型邏輯是否正確——比如兩個區(qū)域之間如果有聯(lián)絡(luò)線功率交換這張圖上應(yīng)該能看到方向一致的功率流向如果出現(xiàn)區(qū)域間功率來回倒灌基本說明邊界約束或方向定義有問題。最后一張圖可以直觀反映碳交易機制是否生效高碳排放機組出力是否有所下調(diào)低碳機組出力是否上升配額買賣量是否合理。6. 排錯之后的復(fù)盤幾個可以繼續(xù)擴展的方向基本模型跑通之后我個人覺得這個骨架的擴展空間非常大做課題或者工程落地都能在此基礎(chǔ)上疊加很多內(nèi)容。一個是把碳交易從常數(shù)碳價擴展為實時波動的碳價模型。真實碳市場價格波動有很強的時變特性調(diào)度模型可以把碳價當作外生隨機變量引入場景生成方法或者兩階段隨機優(yōu)化框架讓調(diào)度決策在碳價不確定條件下依然有可靠的期望收益。另一個是考慮需求側(cè)響應(yīng)和儲能。當前模型主要聚焦供給側(cè)出力和碳配額分配沒有涉及負荷側(cè)的柔性調(diào)度。加上可中斷負荷、電動汽車充放電管理可以在不增加太多碳排放的前提下提升系統(tǒng)靈活性這也是目前調(diào)度領(lǐng)域的熱點。再一個就是多時段耦合類約束的分布式處理。我前面提到爬坡約束和儲能SOC約束是跨時段約束在區(qū)域內(nèi)部處理起來相對容易。但如果要做全局多維度的分布式協(xié)調(diào)就需要引入時間維度上的耦合變量復(fù)制與一致性約束算法復(fù)雜度和通信量也會增加。這些擴展方向都是在現(xiàn)有ADMM框架上做增量變化邏輯鏈條是完整的。我自己已經(jīng)驗證過在模型里加儲能后的效果系統(tǒng)總成本下降約3%碳排放量下降約6%同時區(qū)域間功率交換的峰谷差顯著緩解。這樣的擴展結(jié)果比單純報一個收斂曲線更有說服力。如果你也在做類似的方向建議先把本文的模型框架跑通吃透再按自己的場景去擴展。有一個穩(wěn)定可靠的基礎(chǔ)實現(xiàn)比你一開始就上復(fù)雜模型高效得多。我踩過的這些坑尤其是罰參數(shù)調(diào)優(yōu)、邊界變量初始化、碳價敏感性分析那幾步希望能夠幫你節(jié)省一些調(diào)Debug的時間。