多階段魯棒調(diào)度模型MATLAB復現(xiàn)與CCG算法實踐)
做微電網(wǎng)調(diào)度的復現(xiàn)我印象最深的一課是在MATLAB里把確定性經(jīng)濟調(diào)度跑通之后信心滿滿地把風光預測誤差從±5%改到±30%結果同一套計劃直接讓儲能越限、功率平衡失配。從那之后我就明白只要系統(tǒng)里裝了可再生能源和儲能調(diào)度模型里不考慮不確定性的最優(yōu)大概率只是某個理想場景下的最優(yōu)。這篇內(nèi)容圍繞的就是一套含可再生能源和儲能的區(qū)域微電網(wǎng)多階段魯棒調(diào)度模型基于MATLAB完整復現(xiàn)核心思路是建立日前計劃日內(nèi)調(diào)整的兩階段魯棒框架用區(qū)間集合刻畫風光和負荷的預測偏差再通過列和約束生成算法CCG迭代求解最壞場景下的最優(yōu)運行方案。文章會從模型為什么這樣設計、不確定性集合怎么構建、CCG算法如何落地到MATLABYALMIPGurobi的代碼骨架和復現(xiàn)時容易踩的坑完整過一遍適合正在做微電網(wǎng)優(yōu)化調(diào)度、儲能配置或魯棒優(yōu)化應用研究的朋友參考。1. 可再生滲透率攀升后傳統(tǒng)確定性調(diào)度為什么越來越不好用1.1 確定性調(diào)度的假設與失效場景傳統(tǒng)的微電網(wǎng)經(jīng)濟調(diào)度模型無論是目標函數(shù)還是約束條件都默認風電、光伏和負荷在某個時段的出力是一個已知的確定值。模型看起來非常干凈目標函數(shù)是最小化運行成本包括向上級電網(wǎng)購電費用、微型燃氣輪機的燃料費用、儲能損耗成本約束包括功率平衡、儲能SOC上下限、充放電功率限制、機組出力限制、聯(lián)絡線功率限制。這種模型在可再生能源滲透率比較低、系統(tǒng)備用充足的時候還能湊合用。但一旦風機和光伏在微電網(wǎng)里的裝機占比上來了問題就暴露了。風電預測誤差通常在15%到25%之間波動光伏在天氣驟變時誤差可以超過30%負荷預測雖然相對準但在極端天氣下也會出現(xiàn)明顯偏離。確定性調(diào)度把所有預測值當成真實值來處理等于把全部風險都壓在了預測完全準確這個脆弱的假設上。我做過一個對比測試在一個24節(jié)點微電網(wǎng)測試系統(tǒng)里用確定性模型求出一組日前計劃然后把實際風光出力設定為預測值的70%和130%兩種偏差場景重新跑功率平衡校驗結果有多組約束直接違反儲能SOC甚至越過了下限。這就是典型的計劃趕不上變化。1.2 隨機優(yōu)化、機會約束與魯棒優(yōu)化三條技術路線的實際取舍面對不確定性學術界和工程界常用的解決方案有三類很多初學者一上來容易混在一起方法基本思路優(yōu)點主要問題隨機規(guī)劃用大量場景近似不確定性對場景求期望最優(yōu)結果貼合概率分布經(jīng)濟性較好需要精確的概率分布場景數(shù)量大時計算量爆炸分布估計不準時結果不可靠機會約束規(guī)劃允許約束以較高概率滿足如95%概率滿足功率平衡可以在安全性和經(jīng)濟性之間折中概率參數(shù)如何標定比較主觀分布信息不足時難以求解魯棒優(yōu)化假設不確定性落在某個集合內(nèi)保證最壞情況下約束也滿足不需要精確概率分布結果對極端場景穩(wěn)健計算效率相對可控結果偏保守成本一般高于隨機規(guī)劃在微電網(wǎng)這種規(guī)模不大、但安全約束要求高的場景下魯棒優(yōu)化是比較務實的選擇。原因也很直接你通常拿不到足夠多的歷史數(shù)據(jù)來精確擬合風電和光伏誤差的分布函數(shù)就算擬合出來分布參數(shù)本身也有估計誤差。與其在概率上賭一個精度不如直接說我知道誤差不會超過某個范圍在這個范圍內(nèi)怎么折騰我的調(diào)度方案都兜得住。1.3 標題里魯棒性和不確定性到底指什么標題里的魯棒性英文對應Robustness放在調(diào)度模型里指的就是當實際的風電、光伏出力偏離預測值時系統(tǒng)依然能通過儲能充放電調(diào)整、機組出力再調(diào)度、與主網(wǎng)功率交換等手段維持功率平衡并滿足所有安全約束。衡量魯棒性的標準不是平均工況下的成本而是最壞工況下的約束滿足能力。不確定性在這個問題里主要來自三個方向源端不確定性風機出力和光伏出力受氣象條件影響預測模型再準也有偏差荷端不確定性區(qū)域負荷受生產(chǎn)生活規(guī)律、天氣溫度等因素影響同樣存在預測誤差設備狀態(tài)不確定性比如某臺機組臨時故障、某條線路檢修但在調(diào)度主問題里通常把這類視為N-1預想故障單獨處理不會混進源荷不確定性里。在工程復現(xiàn)時通常把源荷不確定性統(tǒng)一建模為一個不確定集合U集合里的每一個元素代表一組可能的源荷出力偏差向量。魯棒優(yōu)化要求對U里的任意一個偏差向量系統(tǒng)都能通過第二階段調(diào)整找到可行解。這就是后面整個模型的核心出發(fā)點。2. 多階段魯棒調(diào)度模型的數(shù)學框架與不確定性集合設計2.1 兩階段模型的前后配合日前決策與日內(nèi)調(diào)整標題里寫的是多階段魯棒調(diào)度模型實際復現(xiàn)時最常見的落地形式是兩階段魯棒優(yōu)化模型也就是經(jīng)典的三層結構min-max-min。之所以叫多階段是因為調(diào)度決策本身是分層分時段的第一階段日前決策階段在獲知次日風光和負荷預測值之后提前決定機組的啟停狀態(tài)、儲能充放電基準計劃、向上級電網(wǎng)購電的日前計劃。這些決策的特點是必須在看到實際偏差之前做出所以也叫here-and-now決策。第二階段日內(nèi)調(diào)整階段當實際風光出力、負荷與預測出現(xiàn)偏差后在日前計劃的基礎上通過調(diào)節(jié)儲能出力、機組出力微調(diào)、可削減負荷等手段消除功率不平衡。這個階段的決策是在偏差揭曉之后才能做的叫wait-and-see決策。兩階段之間通過功率平衡約束和設備運行約束耦合在一起。模型的目標函數(shù)也相應地拆成兩塊min (第一階段運行成本) max_{u∈U} min_{y∈Ω(x,u)} (第二階段調(diào)整成本)外層min決定第一階段決策x內(nèi)層max尋找使第二階段成本最高的最壞偏差場景u中間層min則是在給定x和u之后尋找最優(yōu)的調(diào)整策略y。整個模型求的是在所有可能出現(xiàn)在的偏差場景下系統(tǒng)總成本的最壞情況最優(yōu)值。2.2 盒式、預算約束與橢球式不確定集合的適用場景不確定集合怎么建直接決定了模型的保守程度和求解難度。常見的有三種形式盒式集合Box直接把每個時段的不確定量限制在一個區(qū)間內(nèi)如u(t)∈[u_min(t), u_max(t)]。這種集合最簡單但要求所有時段同時達到最大偏差結果是最壞中的最壞過于保守。預算約束集合Budget在盒式集合基礎上增加一個總偏差比例限制形如Σ|u(t)-u_hat(t)|/δ(t) ≤ Γ。這里的Γ就是預算參數(shù)表示在調(diào)度周期內(nèi)最多允許多少個時段的偏差同時達到上限。Γ越小魯棒約束越寬松成本越低Γ越大方案越保守。這個設置非常貼合實際因為真實的風光出力偏差不太可能24個小時每個小時都頂在最大值上。橢球式集合Ellipsoidal用2-范數(shù)約束替代1-范數(shù)額外限制形如‖W(u-u_hat)‖? ≤ Ω。橢球集合考慮了變量之間的相關性數(shù)學上更精細但會引入二次約束計算復雜度明顯上升。在微電網(wǎng)調(diào)度里我最推薦的是盒式預算約束的組合。原因有三個物理意義清晰Γ可以理解為最壞情況下同時偏離預測的時間段數(shù)方便向工程人員解釋模型保持線性結構經(jīng)過對偶變換后仍然是LP或MILP可以用YALMIPGurobi穩(wěn)定求解通過調(diào)節(jié)Γ的取值可以畫出從激進到保守的完整成本曲線這是論文和報告里很有說服力的一張圖。2.3 目標函數(shù)與約束的完整數(shù)學表達以含風電、光伏、儲能和微型燃氣輪機的區(qū)域微電網(wǎng)為例完整的魯棒調(diào)度模型可以寫成決策變量第一階段燃氣輪機開機狀態(tài)z(t)、儲能充電功率P_ess_c(t)、儲能放電功率P_ess_d(t)、日前購電功率P_grid(t)、儲能SOC(t)。第二階段針對偏差場景u的儲能調(diào)整量ΔP_ess(t)、機組調(diào)整量ΔP_g(t)、可削減負荷量ΔP_load(t)。目標函數(shù)min Σ_t [ C_grid * P_grid(t) C_g * P_g(t) C_ess * (P_ess_c(t)P_ess_d(t)) ] max_{u∈U} min_Δ Σ_t [ C_penalty * (ΔP_load(t) 棄風棄光懲罰項) ]約束條件功率平衡約束 P_grid(t) P_wind(t) P_pv(t) P_g(t) P_ess_d(t) P_load(t) P_ess_c(t) ΔP_load(t)其中P_wind(t)和P_pv(t)在第二階段表示為P_wind_hat(t) u_w(t)、P_pv_hat(t) u_pv(t)。儲能約束 SOC(t1) SOC(t) η_c * P_ess_c(t) * Δt - P_ess_d(t) * Δt / η_d SOC_min ≤ SOC(t) ≤ SOC_max 0 ≤ P_ess_c(t) ≤ P_ess_c_max * z_ess(t) 0 ≤ P_ess_d(t) ≤ P_ess_d_max * (1 - z_ess(t))這里需要注意的是充放電狀態(tài)變量z_ess(t)的引入它保證儲能不會同時充電和放電這在后面代碼實現(xiàn)時是個關鍵細節(jié)。機組約束 z(t) * P_g_min ≤ P_g(t) ≤ z(t) * P_g_max 爬坡約束|P_g(t) - P_g(t-1)| ≤ Ramp_g與主網(wǎng)交互約束 P_grid_min ≤ P_grid(t) ≤ P_grid_max可削減負荷約束 0 ≤ ΔP_load(t) ≤ α * P_load(t)2.4 為什么多階段不等于多周期很多初學者會把多階段魯棒理解成把24小時的調(diào)度周期分成很多段每段做一個魯棒優(yōu)化這是一個明顯的誤區(qū)。多周期優(yōu)化只是把時間維度拉長決策變量在整個周期內(nèi)一次性規(guī)劃本質(zhì)上仍是開環(huán)調(diào)度。多階段魯棒優(yōu)化的關鍵不在于時間段的多少而在于決策的可調(diào)整性——第一階段決策做出后可以看到不確定性的實現(xiàn)然后第二階段再做出調(diào)整決策。這個特征對應的是閉環(huán)調(diào)度也就是日前計劃日內(nèi)實時調(diào)整的真實運行流程。用數(shù)學語言說真正的多階段魯棒模型必須具有min-max-min的嵌套結構而不是簡單的min-max或者包含很多時段的一次性min。在復現(xiàn)時如果你的模型只是每個時段都預留備用容量然后用魯棒約束包住所有時段這雖然也算魯棒但不是多階段魯棒。要體現(xiàn)多階段就必須顯式區(qū)分可調(diào)整變量如儲能的實時充放電調(diào)整量和不可調(diào)整變量如機組啟停、日前購電計劃并在目標函數(shù)中體現(xiàn)第二階段對最壞場景的應對成本。3. 列和約束生成CCG算法迭代框架的收斂邏輯3.1 主問題的最小費用加最壞場景切割線兩階段魯棒模型直接求解極其困難因為內(nèi)層嵌套了max-min優(yōu)化。工程上最常用的解法是列和約束生成算法核心思路是把原問題拆成一個主問題MP和一個子問題SP通過迭代逐步逼近最優(yōu)解。主問題的形式如下min c * x η s.t. 第一階段約束 η ≥ d * y_l, 對于已知的場景u_l x、y_l之間的耦合約束這里的關鍵是引入了輔助變量η它表示第二階段成本的上界估計。每輪迭代中子問題會找到一個最壞場景u_l主問題就把這個場景對應的第二階段變量y_l和約束作為切割加入模型讓η不斷收緊。主問題因為只考慮了已發(fā)現(xiàn)的最壞場景所以實際上是原問題的松弛版本它的最優(yōu)值給出原問題的下界LB。3.2 子問題的max-min對偶轉化子問題是在給定第一階段解x_star之后尋找使第二階段成本最大的場景u以及對應的最優(yōu)調(diào)整成本形式是f(x_star) max_{u∈U} min_{y∈Ω(x_star, u)} d * y這個max-min結構不能直接丟給求解器。標準做法是對內(nèi)層的min問題取強對偶。由于內(nèi)層是關于y的線性規(guī)劃只要可行域非空且有界強對偶成立就可以把min問題等價轉化為其對偶max問題然后和外層的max合并變成一個單層max問題f(x_star) max_{u∈U, λ∈Λ} λ * (b - A * x_star - C * u)其中λ是對偶變量它的符號由原約束方向決定。如果原約束是≤型λ非負如果是等式約束λ自由變量。合并之后子問題變成帶二次項的非線性問題因為λ和u相乘。在實際求解中這個雙線性項通??梢杂么驧法或直接交給支持MIQP的非線性求解器處理Gurobi可以直接求解這類帶雙線性項的小規(guī)模問題。需要強調(diào)一點內(nèi)層min問題必須滿足強對偶條件。因此第二階段調(diào)整問題必須建模為線性規(guī)劃不能隨意加入整數(shù)變量。如果第二階段需要決策是否切除某條線路這類0-1變量標準CCG就不適用了需要改成嵌套CCG或者引入其他分解方法。3.3 收斂判據(jù)與最大迭代次數(shù)CCG算法的主循環(huán)流程如下初始化UBinf, LB-inf, k0設置初始場景u_0通常取預測均值 while k ≤ K_max 且 UB - LB tol: 1. 求解主問題得到x_k*和η_k*更新LB c*x_k* η_k* 2. 將x_k*代入子問題求解最壞場景u_k*和最壞場景成本f(x_k*) 3. 更新UB min(UB, c*x_k* f(x_k*)) 4. if UB - LB ≤ tol: 收斂退出 5. 否則將u_k*作為新場景加入主問題添加對應的第二階段變量y_k和割約束 k k 1收斂判據(jù)一般取相對間隙或絕對間隙。我在復現(xiàn)時常用的組合是絕對誤差取1e-4最大迭代次數(shù)取20輪。在24時段微電網(wǎng)模型里通常3到8輪就能收斂到很緊的間隙很少會真的跑到20輪。3.4 CCG與Benders分解的選擇建議很多文獻會同時提到Benders分解和CCG兩者都是求解兩階段問題和分解主-子問題的經(jīng)典算法但適用場景有明顯差異對比維度Benders分解CCG切割信息通過對偶函數(shù)添加割平面直接添加最壞場景對應的完整約束迭代收斂對小規(guī)模問題收斂較快通常需要更少迭代次數(shù)尤其有連續(xù)變量時對整數(shù)變量的適應性一般需要處理整數(shù)對偶gap主問題中可以自然處理整數(shù)變量實現(xiàn)難度較低中等在微電網(wǎng)魯棒調(diào)度里第一階段通常包含機組啟停這類整數(shù)變量而CCG的切割是把具體場景u_l下的約束完整塞進主問題對整數(shù)變量天然友好所以實際復現(xiàn)時我基本都用CCG。只有當子問題規(guī)模特別大、每次求解SP耗時很高時才會回頭考慮Benders或者近似方法。4. MATLABYALMIPGurobi的關鍵代碼實現(xiàn)4.1 環(huán)境準備與求解器適配復現(xiàn)前先確認環(huán)境MATLAB版本R2020b及以上即可建議R2022b以上對sdpvar和optimizer的兼容性更好YALMIP直接從GitHub拉取最新release不要用十年前的老版本求解器Gurobi 10.x或11.x學術許可免費申請Mosek 10.x也可以但Gurobi在MILP上的速度通常更優(yōu)。在MATLAB里先跑一句驗證yalmiptest能列出Gurobi的LP、QP、MILP、MIQP支持狀態(tài)就說明環(huán)境沒問題。如果用了舊版MATLAB配新版Gurobi經(jīng)常會出現(xiàn)java相關報錯那是MATLAB版本太老、Java版本不匹配導致的屬于環(huán)境問題先升級MATLAB再排查。4.2 主問題的YALMIP建模代碼下面是主問題的核心建模骨架采用24時段、1小時為步長的設定。nT 24; % 第一階段變量 z_g binvar(1, nT); % 燃氣輪機啟停 P_g sdpvar(1, nT); % 燃氣輪機出力 P_ess_c sdpvar(1, nT); % 儲能充電功率 P_ess_d sdpvar(1, nT); % 儲能放電功率 z_ess binvar(1, nT); % 儲能充放電狀態(tài)1充電0放電 SOC sdpvar(1, nT1); % 荷電狀態(tài) P_grid sdpvar(1, nT); % 購電功率 eta sdpvar(1); % 最壞場景成本上界 % 目標函數(shù) objective_mp sum(grid_price .* P_grid) ... sum(g_fuel_cost * P_g) ... sum(ess_cost * (P_ess_c P_ess_d)) ... eta; % 約束 constraints_mp []; constraints_mp [constraints_mp, SOC(1) SOC_init]; for t 1:nT constraints_mp [constraints_mp, ... SOC(t1) SOC(t) eta_charge * P_ess_c(t) - P_ess_d(t) / eta_discharge, ... SOC_min SOC(t1) SOC_max, ... 0 P_ess_c(t) P_ess_c_max * z_ess(t), ... 0 P_ess_d(t) P_ess_d_max * (1 - z_ess(t)), ... z_g(t) * P_g_min P_g(t) z_g(t) * P_g_max, ... P_grid_min P_grid(t) P_grid_max, ... P_wind_forecast(t) P_pv_forecast(t) P_g(t) P_grid(t) P_ess_d(t) ... P_load_forecast(t) P_ess_c(t)]; end ops sdpsettings(solver, gurobi, verbose, 0, gurobi.NumericFocus, 3); optimize(constraints_mp, objective_mp, ops);這里有個細節(jié)給Gurobi設置NumericFocus為3可以明顯降低大M約束帶來的數(shù)值病態(tài)問題。如果模型里用到了大M這個設置幾乎是必加的。4.3 子問題的對偶化與最壞場景求解代碼第二階段的最壞場景求解是核心代碼分三步走第一步固定第一階段變量第二步構造第二階段LP并取對偶第三步求解單層max問題。% 固定第一階段變量 x_star value([P_g; P_grid; P_ess_c; P_ess_d; SOC]); % 不確定變量 u_w sdpvar(1, nT); % 風電偏差 u_pv sdpvar(1, nT); % 光伏偏差 u_l sdpvar(1, nT); % 負荷偏差 % 第二階段調(diào)整變量 delta_ess sdpvar(1, nT); % 儲能功率調(diào)整 delta_g sdpvar(1, nT); % 機組出力調(diào)整 delta_load sdpvar(1, nT); % 可削減負荷 % 不確定集合盒式預算 U_con [-u_w_max u_w u_w_max, ... -u_pv_max u_pv u_pv_max, ... -u_l_max u_l u_l_max, ... sum(abs(u_w) ./ u_w_max) sum(abs(u_pv) ./ u_pv_max) Gamma]; % 第二階段約束僅對應給定x_star SP_con [...]; SP_obj sum(penalty_load * delta_load penalty_curtail * (u_w u_pv) ... C_delta_g * abs(delta_g) C_delta_ess * abs(delta_ess)); % 通過YALMIP取對偶或直接用求解器求解最大最小問題 % 更通用的做法是手動構造對偶變量把max-min轉為單層max dual_lambda sdpvar(size(A_sp, 1), 1); dual_mu sdpvar(size(A_eq, 1), 1); % 對偶目標函數(shù)注意線性化雙線性項 dual_obj dual_lambda * (b_sp - A_sp * x_star_vec - B_u * [u_w; u_pv; u_l]) ... dual_mu * (b_eq - A_eq * x_star_vec); % 合并后的最壞場景問題 SP_merged_con [dual_lambda 0, dual_mu free, U_con]; result_sp optimize(SP_merged_con, -dual_obj, ops_sp);實際上當雙線性項存在時Gurobi會以MIQP方式求解變量數(shù)不大時速度可以接受。如果模型規(guī)模較大建議用big-M法把雙線性項線性化把問題轉成MILP。4.4 迭代主循環(huán)與結果保存主循環(huán)代碼框架如下UB inf; LB -inf; k 0; tol 1e-4; Kmax 20; cut_results {}; while k Kmax (UB - LB) tol k k 1; % 1. 求解主問題 optimize(constraints_mp, objective_mp, ops); LB value(objective_mp); x_cur value([P_g; P_grid; P_ess_c; P_ess_d; SOC]); % 2. 求解子問題 optimize(SP_merged_con, -dual_obj, ops_sp); sp_cost value(dual_obj); u_cur value([u_w; u_pv; u_l]); day_ahead_cost value(sum(grid_price .* P_grid) ... sum(g_fuel_cost * P_g) ... sum(ess_cost * (P_ess_c P_ess_d))); UB min(UB, day_ahead_cost sp_cost); fprintf(迭代%d: LB%.4f, UB%.4f, gap%.6f\n, k, LB, UB, UB-LB); % 3. 添加新場景切割到主問題 y_new sdpvar(size_y, 1); constraints_mp [constraints_mp, ... y_new對應的第二階段約束把u_cur作為常數(shù)代入, ... eta 第二階段成本表達式(y_new)]; cut_results{k}.u u_cur; cut_results{k}.cost sp_cost; end有幾個實現(xiàn)上的細節(jié)值得說不要把主問題的sdpvar變量每輪重新創(chuàng)建。變量結構要保持不變只是追加約束。否則MATLAB每輪都要重新解析整個符號表達式速度直接掉一個數(shù)量級。主問題的optimize結果如果返回problemsolver 信息先打印optimize的第二個輸出看看是primal infeasible還是numerical issues再決定調(diào)參數(shù)還是調(diào)模型。保存每輪的最壞場景u_cur最后畫圖時可以直接把最壞場景下的風電光伏曲線和基準預測曲線對比很直觀。4.5 代碼性能優(yōu)化的幾個細節(jié)復現(xiàn)完跑第一版10輪迭代可能要跑幾分鐘如果覺得慢按下面這幾個方向優(yōu)化通常能把時間壓到原來的三分之一用矩陣約束代替for循環(huán)。上面為了可讀性用了for循環(huán)實際寫代碼時盡量把所有時段的約束拼接成大矩陣一次性傳給constraints。YALMIP在拼接大規(guī)模符號矩陣時效率一般減少循環(huán)能明顯提升解析速度。子問題求解時不要用默認的optimize改用optimizer對象把x_star作為參數(shù)傳入省去每輪重建約束的開銷。子問題的對偶變量數(shù)量通常和約束數(shù)量一致如果第二階段約束很多先做約束化簡把明顯冗余的約束刪掉。Gurobi的線程數(shù)設為4到8ops.gurobi.Threads默認是0自動在共享計算環(huán)境里可以顯式設置。模型里大量使用abs()時YALMIP會引入輔助變量和不等式變量規(guī)模膨脹很快盡量在建模階段就用正負分解來避開abs。5. 完全復現(xiàn)中的參數(shù)設定、結果校核與常見坑5.1 推薦參考輸入?yún)?shù)參數(shù)設定直接影響收斂性和結果合理性下面這組參數(shù)是我在多個復現(xiàn)案例里校準過的參考值可以直接作為起點參數(shù)推薦值說明調(diào)度周期24時段1h/時段多階段魯棒最基本的設定風電裝機500 kW預測誤差取±15%光伏裝機300 kW預測誤差取±10%負荷峰值600 kW預測誤差取±5%儲能容量400 kWhSOC范圍20%~95%儲能最大充放電功率100 kW充放電效率均取0.95燃氣輪機容量200 kW最小出力50 kW爬坡率50kW/h購電價格上限1.2 元/kWh分時電價峰谷差越大越能體現(xiàn)儲能價值預算參數(shù)Γ3~5表示最多3~5個時段同時達到最大偏差收斂閾值1e-4絕對間隙最大迭代次數(shù)20實際通常8輪內(nèi)收斂5.2 怎么判斷你復現(xiàn)的模型確實魯棒跑通模型只是第一步關鍵是要會驗證。我復現(xiàn)完之后一般做三組校驗任何一組不過都說明模型有問題第一組最壞場景重放。把CCG最后一輪得到的最壞場景u_cur代入第二階段模型在固定第一階段決策的情況下重新求解第二階段調(diào)整問題。如果找不到可行解說明子問題建?;蛘咔懈钐砑佑袉栴}。第二組蒙特卡洛模擬。從風電、光伏、負荷的預測誤差分布中隨機抽樣生成1000個場景對每個場景調(diào)用第二階段模型檢驗是否可行。如果可行率低于98%說明不確定性集合設計偏激進需要調(diào)大?;驍U大盒式范圍。第三組Γ對比分析。分別取Γ0、1、3、6、12觀察總成本和最壞場景成本的變化。Γ0時模型退化為確定性問題總成本最低隨著Γ增大總成本單調(diào)上升這是符合預期的。如果曲線出現(xiàn)非單調(diào)或者劇烈跳變大概率是不確定集合的約束寫錯了。5.3 我實際踩過的幾個大坑第一個坑是儲能的SOC約束沒有處理好充放電同時性。模型里P_ess_c和P_ess_d是兩個獨立變量如果不加z_ess互斥約束求解器會出現(xiàn)一個時段既充電又放電的情況利用效率空轉降低成本看起來成本很漂亮實際上物理不可行。解決辦法就是代碼里用z_ess做互斥或者加入一個很小的同時充放電懲罰項。第二個坑是對偶變量符號搞錯。子問題在對偶化時如果原約束是Ax Bu ≤ b對偶變量必須是非負的如果是等式約束對偶變量自由。符號一錯對偶目標的值會偏離真實最壞場景成本導致UB和LB無法收斂甚至發(fā)散。第三個坑是無腦擴大M。在線性化雙線性項時M取值太小會剪掉有效解M取值太大會導致數(shù)值病態(tài)。解決方法是盡量用不確定變量的區(qū)間上下界來推導M的理論值而不是隨便取一個1e6。Gurobi的NumericFocus開啟后有一定緩解但不解決根本問題。第四個坑是YALMIP的符號展開。模型復雜時YALMIP默認會把所有約束展開成完整系數(shù)矩陣變量多的時候內(nèi)存占用會爆炸。設置sdpsettings(expand, 0)可以減輕這個問題但代價是求解器內(nèi)部的presolve工作量增加需要實測權衡。5.4 復現(xiàn)后如何擴展這個模型跑通基礎版之后有幾個很自然的擴展方向都能在不推翻框架的前提下增加價值分布魯棒優(yōu)化把固定盒式集合換成Wasserstein球利用歷史數(shù)據(jù)構建經(jīng)驗分布再以球內(nèi)最壞分布為目標。這個擴展只需要改不確定集合的建模和對偶約束CCG框架可以復用。多能互補在電儲能的基礎上加入蓄熱罐、燃氣鍋爐把區(qū)域微電網(wǎng)擴展成綜合能源系統(tǒng)。多能耦合會引入熱功率平衡約束但兩階段魯棒的結構完全一致。碳約束在目標函數(shù)中加入碳排放懲罰或碳配額約束分析碳交易價格對魯棒調(diào)度策略的影響。這類擴展對接雙碳主題在實際匯報中更有說服力。儲能容量優(yōu)化把儲能的額定容量和功率作為第一階段決策變量目標函數(shù)中加入儲能投資年化成本模型就變成了容量規(guī)劃魯棒調(diào)度聯(lián)合優(yōu)化問題CCG依然適用。我個人在多次復現(xiàn)這個模型后的體會是兩階段魯棒框架本身并不算特別難難的是把每個環(huán)節(jié)的物理意義和數(shù)學細節(jié)對齊。比如Γ怎么解釋給非優(yōu)化背景的同事聽比如儲能SOC方程里為什么充電效率在乘法位置、放電效率在除法位置這些細節(jié)如果不理清楚代碼復制過來改了參數(shù)結果不對勁都不知道去哪查。建議第一次復現(xiàn)的朋友先用小系統(tǒng)比如6節(jié)點、4時段把CCG迭代曲線畫出來確認LB和UB的收斂趨勢沒問題了再放大到24時段完整系統(tǒng)。小系統(tǒng)里能一眼看出的邏輯錯誤放大以后往往會被數(shù)值噪音掩蓋排查難度翻倍。這個模型跑通之后你再去讀其他魯棒調(diào)度相關的論文思路會清晰很多。