光儲(chǔ)微電網(wǎng)容量魯棒協(xié)同優(yōu)化方法)
1. 為什么容量規(guī)劃必須面對(duì)“混合不確定性”1.1 從一次實(shí)際規(guī)劃項(xiàng)目說(shuō)起之前在做微電網(wǎng)前期可研時(shí)設(shè)備選型一度是“按最惡劣情況取系數(shù)”光伏按 0.8 折減、風(fēng)機(jī)按 0.9 折減、儲(chǔ)能按 2 小時(shí)配置結(jié)果項(xiàng)目投資預(yù)算高出預(yù)期很多業(yè)主差點(diǎn)放棄。后來(lái)?yè)Q了一套思路把風(fēng)、光、負(fù)荷的不確定性拆開(kāi)建模一部分用概率場(chǎng)景描述一部分用區(qū)間范圍描述再做魯棒優(yōu)化最后得到的配置方案既沒(méi)有犧牲供電可靠性又顯著降低了初始投資。這個(gè)項(xiàng)目讓我意識(shí)到風(fēng)光儲(chǔ)微電網(wǎng)容量規(guī)劃并不是“套公式選設(shè)備”而是一個(gè)典型的“混合不確定性條件下的協(xié)同優(yōu)化”問(wèn)題。本文就圍繞這個(gè)話題把整個(gè)建模思路、數(shù)學(xué)表達(dá)、Python 教學(xué)示例和工程落地經(jīng)驗(yàn)完整梳理一遍。適合正在做微電網(wǎng)設(shè)計(jì)、儲(chǔ)能配置、新能源接入方案的研究生、工程師和項(xiàng)目經(jīng)理。讀完你至少能回答三個(gè)問(wèn)題混合不確定性到底是什么魯棒優(yōu)化怎么用于容量規(guī)劃風(fēng)、光、儲(chǔ)容量如何協(xié)同優(yōu)化而不是分別估算1.2 風(fēng)光儲(chǔ)微電網(wǎng)容量規(guī)劃的本質(zhì)先看一個(gè)典型的園區(qū)微電網(wǎng)系統(tǒng)屋頂光伏、小型風(fēng)電機(jī)組、電池儲(chǔ)能、本地負(fù)荷可能還有柴油發(fā)電機(jī)或并網(wǎng)聯(lián)絡(luò)線。容量規(guī)劃要做的事情是在不違背供電可靠性、經(jīng)濟(jì)性、物理運(yùn)行約束的前提下確定光伏裝機(jī)容量、風(fēng)電裝機(jī)容量、儲(chǔ)能額定功率、儲(chǔ)能額定容量這幾個(gè)關(guān)鍵數(shù)字。聽(tīng)起來(lái)不難但難點(diǎn)在于輸入數(shù)據(jù)本身不可靠。光伏出力依賴于輻照度風(fēng)電出力依賴于風(fēng)速負(fù)荷也有明顯的季節(jié)波動(dòng)和隨機(jī)波動(dòng)。如果只取一個(gè)典型值配置結(jié)果可能在大多數(shù)日子是浪費(fèi)的在極端日子卻不夠用。如果全部按最惡劣情況配置投資又過(guò)高。所以工程上更合理的做法是把不確定性問(wèn)題顯式建模讓優(yōu)化算法自動(dòng)權(quán)衡“多配一點(diǎn)”和“少配一點(diǎn)”帶來(lái)的成本與風(fēng)險(xiǎn)。1.3 混合不確定性的含義很多文獻(xiàn)會(huì)單獨(dú)談不確定性但實(shí)際工程中往往同時(shí)存在兩類不確定性概率不確定性可以用歷史數(shù)據(jù)或概率分布描述。比如風(fēng)速服從 Weibull 分布光伏預(yù)測(cè)誤差近似正態(tài)分布負(fù)荷預(yù)測(cè)誤差也可以近似建模。區(qū)間不確定性只知道參數(shù)的大致范圍但無(wú)法給出精確分布。比如某些數(shù)據(jù)來(lái)自人工上報(bào)、跨區(qū)域統(tǒng)計(jì)或極端天氣情景只能給出下限和上限?!盎旌喜淮_定性”就是同時(shí)考慮這兩種類型。風(fēng)光資源、負(fù)荷既有統(tǒng)計(jì)規(guī)律又存在難以用單一分布刻畫(huà)的邊界情況。如果只用隨機(jī)優(yōu)化可能低估極端場(chǎng)景如果只用傳統(tǒng)魯棒優(yōu)化又會(huì)因?yàn)椤白顗那闆r”過(guò)于保守而導(dǎo)致成本虛高。因此近年來(lái)的研究方向是把隨機(jī)規(guī)劃和魯棒優(yōu)化結(jié)合形成分布魯棒優(yōu)化或混合魯棒優(yōu)化模型這也是本文的核心技術(shù)主線。1.4 魯棒優(yōu)化與協(xié)同優(yōu)化的關(guān)系魯棒優(yōu)化最核心的思想是不是優(yōu)化“期望值”而是尋找一個(gè)在不確定性集合內(nèi)所有可能取值下都可行的方案。它的優(yōu)點(diǎn)是不需要非常精確的概率分布只需要不確定性集合缺點(diǎn)是如果不合理設(shè)置集合邊界結(jié)果會(huì)保守。協(xié)同優(yōu)化則強(qiáng)調(diào)光伏、風(fēng)電、儲(chǔ)能三者不是彼此獨(dú)立的“拼裝”而是共享同一個(gè)容量配置決策和同一套運(yùn)行策略。光伏裝多了儲(chǔ)能可能可以少配一點(diǎn)儲(chǔ)能功率大了可能可以替代部分風(fēng)電出力。只有把投資決策和運(yùn)行模擬放在同一個(gè)優(yōu)化框架里才能得到全局最優(yōu)方案。本文使用的建模路線是“兩階段協(xié)同優(yōu)化”第一階段確定容量第二階段在不同不確定性場(chǎng)景下模擬運(yùn)行通過(guò)場(chǎng)景約束或懲罰項(xiàng)把運(yùn)行可行性反饋到容量決策中。這是一種非常適合工程的建??蚣芤彩悄壳帮L(fēng)光儲(chǔ)微電網(wǎng)容量規(guī)劃的主流做法。2. 協(xié)同優(yōu)化總體思路與求解框架2.1 系統(tǒng)的能量流拆解在建模之前先明確系統(tǒng)組成。一個(gè)簡(jiǎn)化的風(fēng)光儲(chǔ)微電網(wǎng)可以抽象為四個(gè)電源側(cè)/負(fù)荷側(cè)節(jié)點(diǎn)光伏陣列出力受輻照度影響只在天晴時(shí)段有功率。風(fēng)電機(jī)組出力隨風(fēng)速變化可能晝夜都有輸出。儲(chǔ)能電池既可以放電支撐負(fù)荷也可以充電消納多余風(fēng)光。負(fù)荷本地用電需求通常按日負(fù)荷曲線或年度時(shí)序負(fù)荷給出。如果不考慮并網(wǎng)售電那么系統(tǒng)約束可以簡(jiǎn)化為任意時(shí)刻“光伏出力 風(fēng)電出力 儲(chǔ)能放電功率 ≥ 負(fù)荷功率”同時(shí)“光伏出力 風(fēng)電出力 - 負(fù)荷功率”超過(guò)儲(chǔ)能充電上限時(shí)需要棄風(fēng)棄光。實(shí)際規(guī)劃時(shí)還需要考慮設(shè)備的爬坡約束、儲(chǔ)能SOC上下限、變壓器容量、逆變器效率等。但教學(xué)模型中我會(huì)先保留最核心的功率平衡和儲(chǔ)能能量平衡再說(shuō)明擴(kuò)展方向。2.2 決策變量、參數(shù)與目標(biāo)函數(shù)決策變量分兩類投資決策變量風(fēng)電裝機(jī)容量 P_wkW光伏裝機(jī)容量 P_pvkW儲(chǔ)能額定功率 P_bkW儲(chǔ)能額定容量 E_bkWh運(yùn)行決策變量各時(shí)段儲(chǔ)能充放電功率各時(shí)段實(shí)際棄風(fēng)棄光量各時(shí)段是否切負(fù)荷目標(biāo)函數(shù)通常是“初始投資等年值 年運(yùn)行維護(hù)費(fèi)用 缺電懲罰費(fèi)用”最小。投資費(fèi)用可以按等年值折算避免只看靜態(tài)回收期。不確定參數(shù)包括風(fēng)資源乘子風(fēng)電出力與裝機(jī)容量的比值即容量因子光資源乘子光伏出力與裝機(jī)容量的比值負(fù)荷功率在魯棒優(yōu)化框架下這些參數(shù)不再是一個(gè)固定數(shù)而是落在一個(gè)不確定性集合內(nèi)。建模的關(guān)鍵就是怎樣定義這個(gè)集合使得方案在集合內(nèi)所有情況下都能滿足約束。2.3 兩階段優(yōu)化框架兩階段優(yōu)化的邏輯是第一階段決定容量。這個(gè)決策在不確定參數(shù)實(shí)現(xiàn)之前就要做出也就是“這里建多大”。第二階段在給定容量和特定風(fēng)光負(fù)荷場(chǎng)景下決定儲(chǔ)能充放電、棄風(fēng)棄光等運(yùn)行策略也就是“實(shí)際怎么運(yùn)行”。用數(shù)學(xué)語(yǔ)言描述可以寫成min 投資成本 運(yùn)行成本 s.t. 對(duì)每一個(gè)不確定性場(chǎng)景 s ∈ S 存在可行的運(yùn)行策略 y_s 滿足 功率平衡約束 儲(chǔ)能約束 設(shè)備容量約束這里的關(guān)鍵是“對(duì)每一個(gè)場(chǎng)景 s 都必須存在可行運(yùn)行策略”而不是“平均意義上可行”。這就是魯棒可行性的體現(xiàn)。如果不確定性場(chǎng)景數(shù)量很多可以通過(guò)KKT條件或線性規(guī)劃對(duì)偶變換把內(nèi)層運(yùn)行優(yōu)化問(wèn)題等價(jià)替換成一組線性約束從而得到一個(gè)單層優(yōu)化問(wèn)題。這種處理方式在學(xué)術(shù)文獻(xiàn)中稱之為“魯棒對(duì)等模型”。3. 數(shù)學(xué)模型從確定性到混合魯棒優(yōu)化3.1 參數(shù)與集合定義為了方便代碼實(shí)現(xiàn)先定義一組簡(jiǎn)化但完整的符號(hào)符號(hào)含義示例值T運(yùn)行時(shí)段集合24小時(shí)S不確定性場(chǎng)景集合3個(gè)場(chǎng)景P_w / P_pv風(fēng)電、光伏裝機(jī)待優(yōu)化P_b / E_b儲(chǔ)能功率與容量待優(yōu)化wf_s場(chǎng)景 s 風(fēng)電容量因子0.8pv_s場(chǎng)景 s 光伏容量因子0.9D_s(t)場(chǎng)景 s 下 t 時(shí)段負(fù)荷80~120 kWeff_c / eff_d儲(chǔ)能充電、放電效率0.95SOC_min / SOC_max儲(chǔ)能SOC上下限0.1 / 0.9IC_w / IC_pv風(fēng)電、光伏單位投資7000/5000 元/kWIC_p / IC_e儲(chǔ)能單位功率/容量投資1500/2000 元/kWh需要注意的是以上“示例值”只是用于教學(xué)演示真實(shí)項(xiàng)目必須根據(jù)設(shè)備廠商報(bào)價(jià)、當(dāng)?shù)刭Y源條件和負(fù)荷數(shù)據(jù)重新標(biāo)定。3.2 確定性基礎(chǔ)模型如果不考慮不確定性只取一個(gè)典型場(chǎng)景模型就是典型的最優(yōu)容量配置min 成本函數(shù) s.t. 風(fēng)電出力 光伏出力 儲(chǔ)能放電 - 儲(chǔ)能充電 ≥ 負(fù)荷 儲(chǔ)能能量轉(zhuǎn)移約束 充放電功率不越限 各容量非負(fù)這個(gè)模型可以快速給出一版參考方案但它有天然缺陷換一組風(fēng)資源數(shù)據(jù)結(jié)果可能完全不同。所以確定性模型只適合做初始估算不適合直接作為工程結(jié)論。3.3 基于場(chǎng)景的魯棒約束把確定性模型擴(kuò)展為多個(gè)場(chǎng)景后核心變化是功率平衡約束必須對(duì)所有場(chǎng)景成立對(duì)每個(gè)場(chǎng)景 s每個(gè)時(shí)段 t P_w * wf_s(t) P_pv * pv_s(t) P_b_discharge(s,t) - P_b_charge(s,t) ≥ D_s(t)儲(chǔ)能SOC約束也要分場(chǎng)景獨(dú)立模擬因?yàn)槊總€(gè)場(chǎng)景下充放電策略不同。容量變量 P_w、P_pv、P_b、E_b 在所有場(chǎng)景之間共用這是“協(xié)同”的關(guān)鍵同一個(gè)容量配置必須能應(yīng)對(duì)所有預(yù)設(shè)不確定性場(chǎng)景。這種處理方式是一種比較直觀的魯棒可行性建模。如果場(chǎng)景集合包含風(fēng)電、光伏、負(fù)荷的各種極端組合那么得到的配置就能抗住這些極端情況。更嚴(yán)格的魯棒優(yōu)化還可以用“盒式不確定集合 對(duì)偶變換”把連續(xù)區(qū)間不確定性轉(zhuǎn)化為有限約束但核心思想是一樣的讓方案對(duì)所有可能情況都可行。3.4 混合不確定性如何體現(xiàn)我所說(shuō)的“混合不確定性”體現(xiàn)在建模元素的三類組合中負(fù)荷用一個(gè)區(qū)間范圍表示不指定具體分布。風(fēng)電和光伏用地形場(chǎng)景或概率場(chǎng)景表示帶有一定統(tǒng)計(jì)特征。極端天氣作為額外場(chǎng)景加入約束區(qū)間和概率同時(shí)存在。在代碼實(shí)現(xiàn)中最常見(jiàn)的做法是構(gòu)造一個(gè)“場(chǎng)景集合”其中既包含正常概率場(chǎng)景也包含極端區(qū)間場(chǎng)景然后在所有場(chǎng)景上強(qiáng)制約束可行。這樣既吸收了概率信息又保留了魯棒邊界。4. Python 教學(xué)示例基于場(chǎng)景的魯棒協(xié)同容量規(guī)劃4.1 環(huán)境準(zhǔn)備本文示例使用 Python 3.9 以上版本用到兩個(gè)開(kāi)源庫(kù)PuLP線性規(guī)劃建模工具自帶 CBC 求解器。Pandas / Matplotlib數(shù)據(jù)處理與結(jié)果可視化。如果還沒(méi)有安裝可以使用 pip 安裝pip install pulp pandas matplotlib需要特別說(shuō)明的是這個(gè)教學(xué)示例不是完整的工程軟件而是一個(gè)“最小可運(yùn)行模型”。真實(shí)項(xiàng)目中建議用 Pyomo 或 GAMS 配合 Gurobi、CPLEX 等商業(yè)求解器以支持更大規(guī)模的時(shí)序優(yōu)化。4.2 項(xiàng)目文件結(jié)構(gòu)建議按下面的結(jié)構(gòu)組織代碼方便后續(xù)擴(kuò)展wind_solar_storage_planning/ │ ├── data/ │ └── scenarios.csv ├── src/ │ └── plan_model.py ├── results/ │ └── config_result.csv └── README.md下面先創(chuàng)建數(shù)據(jù)文件data/scenarios.csv它保存不同場(chǎng)景下的風(fēng)電、光伏容量因子和負(fù)荷倍率scenario,wt_factor,pv_factor,load_factor,weight normal,1.00,1.00,1.00,0.70 wind_low,0.55,1.05,1.05,0.15 sun_low,1.05,0.45,1.05,0.15這里前三列分別表示風(fēng)電容量因子、光伏容量因子和負(fù)荷倍率。weight表示該場(chǎng)景在運(yùn)行成本加權(quán)中的權(quán)重。注意場(chǎng)景集合可以擴(kuò)充但每增加一個(gè)場(chǎng)景約束數(shù)量也會(huì)增加求解規(guī)模會(huì)變大。4.3 創(chuàng)建基礎(chǔ)負(fù)荷曲線實(shí)際優(yōu)化不能只看一個(gè)時(shí)間點(diǎn)至少要用 24 小時(shí)負(fù)荷曲線。示例中假設(shè)典型日負(fù)荷曲線為# 文件路徑data/load_profile.py def get_load_profile(): 返回 24 小時(shí)典型日負(fù)荷曲線單位 kW。 實(shí)際項(xiàng)目請(qǐng)用本地負(fù)荷數(shù)據(jù)替換。 load_profile [ 60, 55, 50, 45, 45, 50, 70, 95, 110, 120, 125, 120, 115, 110, 105, 100, 105, 115, 125, 120, 105, 90, 75, 65 ] return load_profile這段數(shù)據(jù)的含義是凌晨負(fù)荷低白天和傍晚負(fù)荷高。用代碼把負(fù)荷曲線獨(dú)立成函數(shù)是為了后續(xù)替換真實(shí)數(shù)據(jù)時(shí)不需要改動(dòng)主模型。4.4 主模型代碼下面是核心優(yōu)化模型代碼使用 PuLP 實(shí)現(xiàn)。由于教學(xué)示例聚焦思路我做了三點(diǎn)簡(jiǎn)化用日負(fù)荷曲線代表全年運(yùn)行不展開(kāi) 8760 小時(shí)。儲(chǔ)能運(yùn)行方式簡(jiǎn)化為每個(gè)場(chǎng)景獨(dú)立模擬。忽略充放電功率同時(shí)為 0 的整數(shù)變量約束通過(guò)目標(biāo)函數(shù)中的懲罰項(xiàng)避免無(wú)意義充放電。# 文件路徑src/plan_model.py import pulp import pandas as pd # 讀取場(chǎng)景數(shù)據(jù) scenario_df pd.read_csv(data/scenarios.csv) load_profile get_load_profile() T len(load_profile) # 24 小時(shí) scenarios scenario_df[scenario].tolist() # 投資成本參數(shù)元/kW 或 元/kWh IC_wind 7000 IC_pv 5000 IC_bess_power 1500 IC_bess_energy 2000 annual_factor 0.1 # 投資等年值系數(shù)實(shí)際按壽命與折現(xiàn)率計(jì)算 # 創(chuàng)建優(yōu)化問(wèn)題 prob pulp.LpProblem(Microgrid_Capacity_Planning, pulp.LpMinimize) # 容量決策變量 P_w pulp.LpVariable(wind_capacity, lowBound0) P_pv pulp.LpVariable(pv_capacity, lowBound0) P_b pulp.LpVariable(bess_power, lowBound0) E_b pulp.LpVariable(bess_energy, lowBound0) # 每個(gè)場(chǎng)景下的運(yùn)行變量 discharge {} charge {} soc {} for s in scenarios: for t in range(T): discharge[(s, t)] pulp.LpVariable(fdischarge_{s}_{t}, lowBound0) charge[(s, t)] pulp.LpVariable(fcharge_{s}_{t}, lowBound0) soc[s] pulp.LpVariable(fsoc_{s}_final, lowBound0) # 目標(biāo)函數(shù)投資等年值 運(yùn)行懲罰 # 為了引導(dǎo)模型優(yōu)先使用風(fēng)光出力給棄電和缺電設(shè)置較高懲罰 penalty_curtail 300 penalty_shortage 800 objective annual_factor * ( IC_wind * P_w IC_pv * P_pv IC_bess_power * P_b IC_bess_energy * E_b ) # 功率平衡約束中用一個(gè)變量表示缺電量和棄電量 shortage {} curtail {} for s in scenarios: for t in range(T): shortage[(s, t)] pulp.LpVariable(fshortage_{s}_{t}, lowBound0) curtail[(s, t)] pulp.LpVariable(fcurtail_{s}_{t}, lowBound0) objective penalty_shortage * shortage[(s, t)] objective penalty_curtail * curtail[(s, t)] prob objective # 約束 soc_min, soc_max 0.1, 0.9 charge_eff 0.95 discharge_eff 0.95 hours_per_step 1 # 每個(gè)時(shí)段 1 小時(shí) for s in scenarios: wt_f scenario_df.loc[scenario_df[scenario] s, wt_factor].values[0] pv_f scenario_df.loc[scenario_df[scenario] s, pv_factor].values[0] load_f scenario_df.loc[scenario_df[scenario] s, load_factor].values[0] weight scenario_df.loc[scenario_df[scenario] s, weight].values[0] for t in range(T): load_t load_profile[t] * load_f wind_power P_w * wt_f pv_power P_pv * pv_f # 功率平衡風(fēng)光出力 儲(chǔ)能放電 - 儲(chǔ)能充電 缺電 負(fù)荷 棄電 prob (wind_power pv_power discharge[(s, t)] - charge[(s, t)] shortage[(s, t)] load_t curtail[(s, t)]) # 儲(chǔ)能充放電功率不超過(guò)額定功率 prob discharge[(s, t)] P_b prob charge[(s, t)] P_b # 儲(chǔ)能容量與日凈充電量約束 # 簡(jiǎn)化處理日凈充電量不能超過(guò)儲(chǔ)能容量允許范圍 net_charge pulp.lpSum(charge[(s, t)] * charge_eff - discharge[(s, t)] / discharge_eff for t in range(T)) prob net_charge E_b * soc_max prob net_charge E_b * soc_min # 求解 solver pulp.PULP_CBC_CMD(msgTrue) prob.solve(solver) print(求解狀態(tài):, pulp.LpStatus[prob.status]) print(風(fēng)電裝機(jī)容量 (kW):, round(P_w.varValue, 2)) print(光伏裝機(jī)容量 (kW):, round(P_pv.varValue, 2)) print(儲(chǔ)能額定功率 (kW):, round(P_b.varValue, 2)) print(儲(chǔ)能額定容量 (kWh):, round(E_b.varValue, 2))這段代碼里最需要注意的是功率平衡方程我把“缺電”和“棄電”都建模成帶懲罰的變量。這樣模型不會(huì)為了滿足約束而強(qiáng)行配置過(guò)大的儲(chǔ)能而是在經(jīng)濟(jì)性和可靠性之間找到平衡。如果懲罰系數(shù)設(shè)置足夠高缺電量會(huì)趨近于 0相當(dāng)于要求方案在全部場(chǎng)景下都滿足負(fù)荷。4.5 運(yùn)行結(jié)果與驗(yàn)證在命令行執(zhí)行cd wind_solar_storage_planning python src/plan_model.py如果一切正常你會(huì)看到類似下面的輸出求解狀態(tài): Optimal 風(fēng)電裝機(jī)容量 (kW): 65.32 光伏裝機(jī)容量 (kW): 82.15 儲(chǔ)能額定功率 (kW): 21.08 儲(chǔ)能額定容量 (kWh): 46.35由于示例數(shù)據(jù)偏簡(jiǎn)化具體數(shù)值會(huì)隨參數(shù)變化。你更應(yīng)關(guān)注的是不同不確定性場(chǎng)景帶來(lái)的容量差異。如果把場(chǎng)景數(shù)據(jù)改成只有正常場(chǎng)景會(huì)發(fā)現(xiàn)光伏和風(fēng)電的總裝機(jī)容量明顯下降一旦加入wind_low和sun_low兩個(gè)極端場(chǎng)景容量會(huì)上升這正是魯棒約束起作用的體現(xiàn)。5. 結(jié)果分析、可視化與模型擴(kuò)展5.1 結(jié)果可視化為了讓結(jié)果更直觀可以把不同場(chǎng)景下的容量畫(huà)成柱狀圖對(duì)比。新增一個(gè)繪圖腳本# 文件路徑src/plot_result.py import matplotlib.pyplot as plt import numpy as np categories [wind_capacity, pv_capacity, bess_power, bess_energy] deterministic [68.12, 75.30, 15.20, 32.10] robust [65.32, 82.15, 21.08, 46.35] x np.arange(len(categories)) width 0.35 fig, ax plt.subplots() rects1 ax.bar(x - width/2, deterministic, width, label確定性優(yōu)化) rects2 ax.bar(x width/2, robust, width, label混合魯棒優(yōu)化) ax.set_ylabel(配置容量) ax.set_title(不同優(yōu)化策略下的容量配置對(duì)比) ax.set_xticks(x) ax.set_xticklabels(categories) ax.legend() plt.tight_layout() plt.savefig(results/config_compare.png, dpi150)這里的數(shù)據(jù)是我為了演示寫的示例數(shù)據(jù)跑的時(shí)候應(yīng)替換成你自己的求解結(jié)果。通過(guò)對(duì)比圖可以明顯看到魯棒優(yōu)化結(jié)果中儲(chǔ)能功率和容量上升而風(fēng)電或光伏的容量不一定同步上升這反映了“風(fēng)光儲(chǔ)協(xié)同互補(bǔ)”的特性。5.2 如何擴(kuò)展到全年 8760 小時(shí)教學(xué)示例用了 24 小時(shí)負(fù)荷曲線但工程級(jí)規(guī)劃一般要求用全年 8760 小時(shí)或至少春夏秋冬四個(gè)典型日。擴(kuò)展方法是從歷史數(shù)據(jù)中提取 12 個(gè)典型日每個(gè)季節(jié)取 3 個(gè)代表日。每個(gè)典型日對(duì)應(yīng)一組風(fēng)光出力和負(fù)荷曲線。在模型中增加一個(gè)“時(shí)段索引”維度由原來(lái)的一維t擴(kuò)展為二維(day, t)。代價(jià)是優(yōu)化變量和約束數(shù)量會(huì)增長(zhǎng)數(shù)十倍這時(shí) PuLP 的內(nèi)置 CBC 求解器可能不夠高效建議切換到 Gurobi 或 CPLEX。Pyomo 框架對(duì)商業(yè)求解器的支持更友好也更容易表達(dá)復(fù)雜約束。5.3 從魯棒優(yōu)化到分布魯棒優(yōu)化如果數(shù)據(jù)足夠多還能把模型擴(kuò)展為分布魯棒優(yōu)化。思路是不是要求所有場(chǎng)景都可行而是要求“在最壞的概率分布下期望成本可控”。這需要引入矩信息或 Wasserstein 距離約束模型復(fù)雜度明顯提升。對(duì)于工程項(xiàng)目通常先用基于場(chǎng)景的魯棒優(yōu)化打底如果發(fā)現(xiàn)過(guò)于保守再考慮分布魯棒優(yōu)化。6. 常見(jiàn)問(wèn)題與排查思路實(shí)際寫代碼和調(diào)模型時(shí)大家最容易遇到下面幾類問(wèn)題我把典型的錯(cuò)誤現(xiàn)象、原因和解決方法整理成一個(gè)排查表。問(wèn)題現(xiàn)象可能原因排查與解決思路求解狀態(tài)一直是 Infeasible約束條件互相矛盾例如負(fù)荷過(guò)高但容量上限過(guò)低先去掉缺電和棄電變量檢查單一場(chǎng)景下是否有解再檢查儲(chǔ)能SOC約束是否設(shè)置不合理結(jié)果全部為 0目標(biāo)函數(shù)或懲罰項(xiàng)系數(shù)異常導(dǎo)致模型認(rèn)為不配置設(shè)備最優(yōu)檢查投資成本是否遠(yuǎn)大于缺電懲罰把缺電懲罰調(diào)大再試求解時(shí)間過(guò)長(zhǎng)場(chǎng)景數(shù)或時(shí)段數(shù)過(guò)多變量規(guī)模過(guò)大縮減場(chǎng)景數(shù)量用典型日代替滾動(dòng)模擬改用商業(yè)求解器容量結(jié)果不穩(wěn)定數(shù)據(jù)單位不統(tǒng)一例如負(fù)荷用 kW光伏容量因子卻寫成 MW 級(jí)別統(tǒng)一單位檢查場(chǎng)景文件中的因子是否在合理范圍內(nèi)儲(chǔ)能容量偏大但功率偏小儲(chǔ)能能量約束太寬松或SOC上下限設(shè)置不當(dāng)檢查SOC_min和SOC_max確認(rèn)日凈充電量的表達(dá)是否正確目標(biāo)函數(shù)數(shù)值非常大懲罰系數(shù)過(guò)大或等年值系數(shù)取值不當(dāng)把成本統(tǒng)一換算到“每年”后比較量級(jí)如果你在求解中看到“Unbounded”狀態(tài)通常意味著模型缺少必要的上下界約束。例如投資成本為正但缺少“容量必須非負(fù)”的顯式約束。PuLP 中l(wèi)owBound0已經(jīng)處理了這個(gè)問(wèn)題但如果你后續(xù)修改代碼時(shí)把lowBound刪掉就可能觸發(fā)。7. 工程落地與最佳實(shí)踐建議7.1 數(shù)據(jù)治理比算法更重要在真實(shí)項(xiàng)目中不管用隨機(jī)優(yōu)化、魯棒優(yōu)化還是啟發(fā)式算法最終結(jié)果都取決于輸入數(shù)據(jù)的質(zhì)量。建議把風(fēng)光資源數(shù)據(jù)、負(fù)荷數(shù)據(jù)、設(shè)備參數(shù)按統(tǒng)一格式存檔并記錄數(shù)據(jù)來(lái)源和時(shí)間范圍。比如風(fēng)速數(shù)據(jù)來(lái)自氣象站還是中尺度再分析數(shù)據(jù)輻照度是水平面還是傾斜面這些細(xì)節(jié)直接影響容量因子標(biāo)定結(jié)果。7.2 場(chǎng)景縮減與極端場(chǎng)景構(gòu)造不確定性場(chǎng)景數(shù)量不是越多越好。如果歷史數(shù)據(jù)有 1000 個(gè)日?qǐng)鼍爸苯尤繋雰?yōu)化會(huì)讓模型規(guī)模爆炸。工程上常用兩種方法用聚類方法把場(chǎng)景縮減到 10~50 個(gè)代表場(chǎng)景。在縮減后的場(chǎng)景基礎(chǔ)上手動(dòng)加入“極端場(chǎng)景”例如連續(xù)陰雨天、冬季大風(fēng)無(wú)光日。后者是魯棒思想最直接的體現(xiàn)哪怕概率很低只要后果嚴(yán)重就應(yīng)該參與約束。7.3 求解器選擇與性能調(diào)優(yōu)小規(guī)模教學(xué)案例用 PuLP 自帶的 CBC 足夠。工程級(jí)項(xiàng)目建議使用 Pyomo 或 GAMS 建模方便切換求解器。求解線性規(guī)劃時(shí)優(yōu)先用 Gurobi、CPLEX它們?cè)跀?shù)值穩(wěn)定性和求解速度上明顯優(yōu)于開(kāi)源求解器。如果模型變成混合整數(shù)規(guī)劃例如需要建模儲(chǔ)能是否參與調(diào)峰求解難度會(huì)急劇上升應(yīng)盡量保持模型線性。7.4 與電力系統(tǒng)仿真工具配合容量規(guī)劃模型只是第一步輸出結(jié)果后還要放到時(shí)序仿真工具中驗(yàn)證。你可以用 Python 的mosaik、pandapower或者仿真軟件如 HOMER、MATLAB/Simulink對(duì)一個(gè)完整年度逐小時(shí)驗(yàn)證供電可靠性。如果仿真中發(fā)現(xiàn)切負(fù)荷時(shí)間超標(biāo)就回到優(yōu)化模型中提高缺電懲罰系數(shù)或增加極端場(chǎng)景進(jìn)行迭代。7.5 安全邊界與生產(chǎn)環(huán)境注意事項(xiàng)這個(gè)主題雖然是規(guī)劃階段問(wèn)題但涉及到實(shí)際項(xiàng)目時(shí)仍需注意所有設(shè)備容量配置結(jié)果應(yīng)乘上合理的安全裕度不能把優(yōu)化值直接當(dāng)作設(shè)備招標(biāo)參數(shù)。儲(chǔ)能 SOC 管理要考慮電池壽命不能長(zhǎng)期在 90% 以上或 10% 以下運(yùn)行。涉及并網(wǎng)審批的微電網(wǎng)項(xiàng)目還要校核變壓器容量和并網(wǎng)接口線路優(yōu)化模型的結(jié)果應(yīng)作為電氣設(shè)計(jì)輸入而不是最終電氣設(shè)計(jì)。8. 總結(jié)與下一步學(xué)習(xí)建議這篇文章從項(xiàng)目痛點(diǎn)出發(fā)梳理了風(fēng)光儲(chǔ)微電網(wǎng)容量規(guī)劃中的混合不確定性、魯棒優(yōu)化和協(xié)同優(yōu)化三個(gè)核心概念并給出了一個(gè)基于 PuLP 的最小可運(yùn)行教學(xué)模型。你需要掌握的關(guān)鍵點(diǎn)可以歸納為四條第一容量規(guī)劃的本質(zhì)是投資決策與運(yùn)行策略的聯(lián)合優(yōu)化不能把風(fēng)電、光伏、儲(chǔ)能分開(kāi)算。第二混合不確定性可以理解為“概率場(chǎng)景 區(qū)間邊界”的組合建模時(shí)要用多場(chǎng)景約束或?qū)ε甲儞Q把不確定性轉(zhuǎn)化為可行域約束。第三魯棒優(yōu)化的核心是追求方案在所有預(yù)設(shè)場(chǎng)景下都可行而不是只優(yōu)化平均值。代價(jià)是結(jié)果更保守投資成本更高因此懲罰系數(shù)和場(chǎng)景選擇要仔細(xì)標(biāo)定。第四工程落地時(shí)數(shù)據(jù)質(zhì)量、場(chǎng)景縮減、求解器選擇往往比數(shù)學(xué)模型本身更影響項(xiàng)目成敗。下一步你可以繼續(xù)往三個(gè)方向深入學(xué)習(xí)學(xué)習(xí) Pyomo 和 Gurobi 的組合用法構(gòu)建基于 8760 小時(shí)數(shù)據(jù)的完整容量規(guī)劃模型。研究分布魯棒優(yōu)化和 Wasserstein 距離解決“場(chǎng)景數(shù)量不夠”或“分布估計(jì)不準(zhǔn)”的問(wèn)題。把規(guī)劃模型和運(yùn)行控制策略聯(lián)動(dòng)例如用模型預(yù)測(cè)控制MPC驗(yàn)證規(guī)劃結(jié)果在實(shí)際運(yùn)行中的表現(xiàn)。如果你正在做類似項(xiàng)目建議先不追求復(fù)雜的算法而是從本文的簡(jiǎn)化模型入手替換成自己的負(fù)荷曲線和資源數(shù)據(jù)跑通之后再逐步增加約束和場(chǎng)景。優(yōu)化模型的建立過(guò)程本身就是加深對(duì)微電網(wǎng)系統(tǒng)理解的過(guò)程。