汽車(chē)協(xié)同調(diào)度:Matlab/Yalmip建模與求解實(shí)戰(zhàn))
做電力系統(tǒng)調(diào)度的同學(xué)尤其是研究可再生能源和電動(dòng)汽車(chē)入網(wǎng)方向的人大概率繞不開(kāi)“協(xié)同調(diào)度”這四個(gè)字。我前陣子為了碩士論文復(fù)現(xiàn)把“可再生能源發(fā)電與電動(dòng)汽車(chē)的協(xié)同調(diào)度策略”完整用Matlab走了一遍從場(chǎng)景生成、約束搭建到調(diào)用求解器踩了不少坑。這篇東西不是理論推導(dǎo)的復(fù)讀而是告訴你實(shí)際建模時(shí)怎么定義變量、怎么列約束、怎么讓求解器順利跑出結(jié)果以及哪些錯(cuò)誤是你大概率也會(huì)遇到的。這篇內(nèi)容的適用對(duì)象很明確正在準(zhǔn)備碩士論文里仿真章節(jié)的研究生、做微電網(wǎng)/配電網(wǎng)調(diào)度仿真的工程師還有那些裝了Matlab但不知道Yalmip到底怎么用的人。如果你只是想要一份能直接跑的代碼那這篇文章同樣能幫你搞清楚代碼每一步在做什么免得拿到開(kāi)源代碼后連報(bào)錯(cuò)都看不懂。1. 協(xié)同調(diào)度問(wèn)題拆解定位核心模型1.1 問(wèn)題邊界與決策變量先說(shuō)清楚模型邊界。絕大多數(shù)碩士論文里的協(xié)同調(diào)度不會(huì)把電網(wǎng)全模型都搬進(jìn)來(lái)而是把研究對(duì)象簡(jiǎn)化成一個(gè)微電網(wǎng)或者一個(gè)等效的配電網(wǎng)節(jié)點(diǎn)。我做的是微電網(wǎng)場(chǎng)景里面有風(fēng)電機(jī)組、光伏陣列、傳統(tǒng)燃煤機(jī)組、儲(chǔ)能系統(tǒng)還有一定數(shù)量的電動(dòng)汽車(chē)。電動(dòng)汽車(chē)既可以作為普通負(fù)荷充電也可以在電價(jià)合適的時(shí)候向電網(wǎng)放電V2G模式。這個(gè)模型要回答的問(wèn)題是在一天24小時(shí)或96個(gè)時(shí)段內(nèi)每臺(tái)機(jī)組出多少電、儲(chǔ)能什么時(shí)候充什么時(shí)候放、電動(dòng)汽車(chē)什么時(shí)候充電、允許多少車(chē)在某個(gè)時(shí)段放電才能讓總成本最低同時(shí)把可再生能源盡量用掉。決策變量分為連續(xù)變量和二進(jìn)制變量。連續(xù)變量包括常規(guī)機(jī)組出力、儲(chǔ)能充放電功率、電動(dòng)汽車(chē)充放電功率、向主網(wǎng)購(gòu)電和售電功率。二進(jìn)制變量則用于表示機(jī)組啟停狀態(tài)、電動(dòng)汽車(chē)充放電狀態(tài)。這里有一個(gè)容易忽略的地方電動(dòng)汽車(chē)不能同時(shí)充電又放電所以至少需要兩個(gè)二進(jìn)制變量來(lái)分別代表充電狀態(tài)和放電狀態(tài)并且要加上互斥約束u_ch u_dis 1。很多初學(xué)者把模型定義得太復(fù)雜一上來(lái)就考慮每輛車(chē)的行程、用戶行為、充電樁位置結(jié)果變量數(shù)量爆炸求解器根本算不動(dòng)。碩士論文復(fù)現(xiàn)階段我建議先把所有電動(dòng)汽車(chē)聚合成一個(gè)等效儲(chǔ)能池比如100輛車(chē)每輛車(chē)40kWh那么聚合容量就是4000kWh聚合最大充電功率就是700kW。這樣做雖然忽略了個(gè)體差異但能先把調(diào)度邏輯跑通后續(xù)再擴(kuò)展精細(xì)化模型。1.2 目標(biāo)函數(shù)與成本建模目標(biāo)函數(shù)看起來(lái)簡(jiǎn)單寫(xiě)起來(lái)容易亂因?yàn)槌杀卷?xiàng)實(shí)在太多。常見(jiàn)的目標(biāo)是最小化一天內(nèi)的系統(tǒng)總運(yùn)行成本可以拆成五個(gè)部分常規(guī)機(jī)組燃料成本、可再生能源發(fā)電的運(yùn)維成本通常很小、棄風(fēng)棄光的懲罰成本、儲(chǔ)能和電動(dòng)汽車(chē)的電池?fù)p耗成本以及從主網(wǎng)購(gòu)電的成本減去向主網(wǎng)售電的收益。常規(guī)機(jī)組成本通常寫(xiě)成輸出功率的二次函數(shù)C_G(P) a*P^2 b*P c。但二次函數(shù)會(huì)讓模型變成MIQP求解器求解速度明顯變慢。復(fù)現(xiàn)時(shí)我一般做分段線性化把功率范圍切成幾段每段用一個(gè)線性斜率表示這樣一來(lái)模型變成MILPGurobi和Cplex跑起來(lái)快得多。如果不做線性化遇到大場(chǎng)景數(shù)求解時(shí)間可能從幾分鐘變成一小時(shí)。棄風(fēng)棄光懲罰成本很關(guān)鍵它決定模型會(huì)優(yōu)先消納可再生能源。懲罰系數(shù)一般取5001000元/MWh遠(yuǎn)高于發(fā)電成本這樣模型寧可從電網(wǎng)買(mǎi)電也不會(huì)輕易棄風(fēng)。但注意懲罰系數(shù)不要設(shè)成1e6這種量級(jí)否則數(shù)值病態(tài)會(huì)讓求解器報(bào)出各種奇怪的可行性問(wèn)題。電動(dòng)汽車(chē)V2G放電時(shí)電池會(huì)額外老化所以目標(biāo)函數(shù)里要加放電懲罰項(xiàng)。基礎(chǔ)做法是給放電功率乘一個(gè)單位損耗成本比如0.2元/kWh。如果省掉這一項(xiàng)模型會(huì)為了賺峰谷電價(jià)差瘋狂放電產(chǎn)生不現(xiàn)實(shí)的調(diào)度結(jié)果。1.3 約束條件體系約束是調(diào)度模型的骨架少一條約束結(jié)果就可能是空中樓閣。最核心的是功率平衡約束所有電源常規(guī)機(jī)組、風(fēng)電、光伏、儲(chǔ)能放電、EV放電、購(gòu)電的功率之和必須等于所有負(fù)荷基礎(chǔ)負(fù)荷、儲(chǔ)能充電、EV充電、售電的功率之和。這條約束在每個(gè)時(shí)段都要滿足寫(xiě)成向量形式時(shí)別忘了用sum(x,1)來(lái)確保按時(shí)間維度求和。儲(chǔ)能約束包括SOC狀態(tài)轉(zhuǎn)移方程、充放電功率上下限、SOC上下限以及一個(gè)很重要的“最終SOC等于初始SOC”約束否則模型可以把蓄電池的能量偷走造成成本偏低。SOC計(jì)算時(shí)注意單位一致性功率單位是kW儲(chǔ)能容量單位是kWh時(shí)間步長(zhǎng)如果是1小時(shí)那么SOC變化量就是功率除以容量如果時(shí)間步長(zhǎng)是15分鐘必須乘上0.25否則電量會(huì)差4倍。這個(gè)坑我見(jiàn)過(guò)不止一次。電動(dòng)汽車(chē)約束比儲(chǔ)能多一層“充電需求約束”。每輛車(chē)每天至少需要充入一定的電量否則用戶沒(méi)電用。比如聚合體一天需要充入2000kWh那么所有時(shí)段充電總和減去放電總和后的凈充電量必須大于等于2000kWh。另外EV的SOC也要限定在10%到90%之間太深放電對(duì)電池不友好。最后是常規(guī)機(jī)組爬坡約束相鄰兩個(gè)時(shí)段的出力變化不能超過(guò)上限比如30MW/h。如果這一步漏了調(diào)度結(jié)果可能是機(jī)組出力劇烈波動(dòng)看起來(lái)最優(yōu)但實(shí)際沒(méi)法執(zhí)行。爬坡約束本身很簡(jiǎn)單就是abs(P_G(t)-P_G(t-1)) Ramp用Yalmip時(shí)寫(xiě)成P_G(:,2:T)-P_G(:,1:T-1) Ramp和P_G(:,1:T-1)-P_G(:,2:T) Ramp兩條。2. 可再生能源不確定性處理從場(chǎng)景生成到魯棒/隨機(jī)優(yōu)化2.1 場(chǎng)景生成方法光伏和風(fēng)電出力都有隨機(jī)性如果直接用期望值代替調(diào)度結(jié)果會(huì)很“天真”不考慮實(shí)際波動(dòng)。處理隨機(jī)性最常用的方法是場(chǎng)景法生成大量代表可能出力曲線的樣本然后在樣本上求期望成本。場(chǎng)景生成不是隨便造數(shù)據(jù)。風(fēng)電出力一般用威布爾分布描述風(fēng)速再通過(guò)風(fēng)功率曲線換算成出力光伏出力則用Beta分布描述光照強(qiáng)度。也可以用歷史出力數(shù)據(jù)直接采樣比如NREL或國(guó)內(nèi)電網(wǎng)公開(kāi)的出力數(shù)據(jù)集。我在復(fù)現(xiàn)時(shí)用Matlab自帶的randn配合正態(tài)擾動(dòng)生成200個(gè)初始場(chǎng)景每一步都加入時(shí)序相關(guān)性避免相鄰時(shí)段出力突變。一個(gè)容易被忽略的點(diǎn)場(chǎng)景不僅包含可再生能源出力還應(yīng)該包含負(fù)荷的波動(dòng)尤其是電動(dòng)汽車(chē)接入后的充電負(fù)荷。如果只考慮風(fēng)電隨機(jī)而忽略負(fù)荷隨機(jī)論文審稿人一眼就看出來(lái)了。博士生不會(huì)太在意但碩士論文還是要把基礎(chǔ)的不確定性框架搭完整。生成場(chǎng)景時(shí)要注意樣本數(shù)量。500個(gè)場(chǎng)景做仿真求解時(shí)間不可接受20個(gè)場(chǎng)景則可能丟失尾部風(fēng)險(xiǎn)。我建議先做400個(gè)削減到15個(gè)這樣兼顧速度和精度。2.2 場(chǎng)景削減算法場(chǎng)景削減的核心思想是用少數(shù)具有代表性的場(chǎng)景替代原場(chǎng)景集且保持概率分布特性。常見(jiàn)的算法有三種K-means聚類(lèi)、快速前向選擇FFS、同步回代消除SBR。K-means是最直觀的把400個(gè)場(chǎng)景聚成15類(lèi)取每個(gè)類(lèi)的中心作為代表場(chǎng)景概率為該類(lèi)樣本比例。但K-means對(duì)初始聚類(lèi)中心敏感聚類(lèi)結(jié)果可能局部最優(yōu)。FFS和SBR是經(jīng)典的啟發(fā)式場(chǎng)景削減基于場(chǎng)景兩兩間的距離通常用歐氏距離逐步合并。SBR的做法是每次找一對(duì)總概率最小的場(chǎng)景刪除其中一個(gè)把它被刪的概率加到另一個(gè)上直到目標(biāo)數(shù)量。這個(gè)方法能保留原場(chǎng)景集的分布形狀也比較容易手寫(xiě)實(shí)現(xiàn)。我用Matlab手寫(xiě)了一個(gè)SBR核心就是計(jì)算距離矩陣、更新概率。代碼量大約60行比調(diào)用復(fù)雜工具箱更可控。削減后要驗(yàn)證計(jì)算削減前后場(chǎng)景集的均值和方差看差異是否在可接受范圍內(nèi)。差異太大說(shuō)明目標(biāo)場(chǎng)景數(shù)太少。下表是我常用的出力和負(fù)荷場(chǎng)景對(duì)比指標(biāo)原始400場(chǎng)景削減后15場(chǎng)景誤差風(fēng)電平均出力/MW12.412.83.2%光伏平均出力/MW8.17.92.5%負(fù)荷峰值/MW21.721.50.9%風(fēng)電標(biāo)準(zhǔn)差3.22.99.4%標(biāo)準(zhǔn)差誤差稍高一點(diǎn)但對(duì)調(diào)度結(jié)果影響不大因?yàn)閮?yōu)化的是期望成本均值誤差更關(guān)鍵。2.3 不確定性建模選擇處理不確定性的范式有隨機(jī)規(guī)劃和魯棒優(yōu)化兩種。隨機(jī)規(guī)劃相當(dāng)于把多個(gè)場(chǎng)景都放進(jìn)約束里目標(biāo)函數(shù)是各場(chǎng)景成本的期望。實(shí)現(xiàn)方式就是在Yalmip里對(duì)每個(gè)場(chǎng)景分別建約束目標(biāo)函數(shù)是sum(p_s*Objective_s)。這種方式簡(jiǎn)單直接求解器能處理但需要保證每個(gè)場(chǎng)景下的約束都可行經(jīng)常會(huì)遇到某些極端場(chǎng)景導(dǎo)致問(wèn)題不可行。魯棒優(yōu)化則是找一個(gè)最壞情況下的最優(yōu)決策。典型表示為min max_s。解決魯棒優(yōu)化通常需要引入對(duì)偶變量把內(nèi)層max問(wèn)題轉(zhuǎn)化為約束條件數(shù)學(xué)推導(dǎo)繁瑣但所得方案在面對(duì)不確定時(shí)有更強(qiáng)的保障。碩士論文復(fù)現(xiàn)時(shí)如果原標(biāo)題只寫(xiě)了“協(xié)同調(diào)度”大概率是隨機(jī)優(yōu)化沒(méi)必要主動(dòng)把難度升到魯棒。我當(dāng)初直接選隨機(jī)優(yōu)化把精力放在如何設(shè)計(jì)約束保證所有場(chǎng)景可行比如引入可調(diào)變量如負(fù)荷削減來(lái)處理極端場(chǎng)景下的失負(fù)荷。3. Matlab代碼實(shí)現(xiàn)要點(diǎn)從建模到求解3.1 工具箱與求解器選擇Matlab里做優(yōu)化調(diào)度最推薦的方案是Yalmip商用求解器。Yalmip是一個(gè)建模工具箱它把模型翻譯成求解器能理解的內(nèi)部形式解完之后還能用value()把變量結(jié)果取出來(lái)。它支持Cplex、Gurobi、Mosek等。Gurobi學(xué)術(shù)版可以免費(fèi)申請(qǐng)license速度非??煊绕淝蠼釳ILP時(shí)比Matlab自帶的intlinprog強(qiáng)一個(gè)量級(jí)。Cplex現(xiàn)在對(duì)學(xué)術(shù)用戶也開(kāi)放免費(fèi)下載。如果不想申請(qǐng)也可以用免費(fèi)的SCIP或CBC求解器但大規(guī)模問(wèn)題會(huì)慢很多。安裝過(guò)程常出問(wèn)題很多同學(xué)把Yalmip下載后塞到當(dāng)前路徑但忘了把求解器路徑加進(jìn)Matlab。正確的做法是在startup.m里寫(xiě)入如下命令addpath(genpath(D:\yalmip)); addpath(genpath(D:\gurobi\win64\matlab)); gurobi_setup; savepath;然后運(yùn)行yalmiptest看到所有求解器都顯示OK才算裝好。如果Gurobi后裝的記得重新savepath不然Matlab重啟后還得重新添加。求解器選擇上如果模型是純線性規(guī)劃沒(méi)有0-1變量可以用Gurobi的LP如果有0-1變量Gurobi用MILP算法默認(rèn)會(huì)開(kāi)并發(fā)割平面。設(shè)置選項(xiàng)時(shí)我習(xí)慣這樣寫(xiě)solverOptions sdpsettings(solver,gurobi,verbose,2,gurobi.TimeLimit,300);設(shè)置時(shí)間限制很重要否則求解器可能陷入一個(gè)超大規(guī)模的MILP里跑幾小時(shí)。我自己復(fù)現(xiàn)時(shí)遇到過(guò)一次半天都沒(méi)跑完最后發(fā)現(xiàn)是二進(jìn)制變量定義多了幾百個(gè)把-SOC互斥約束拆成每個(gè)EV每個(gè)時(shí)段兩個(gè)變量100輛車(chē)96時(shí)段就19200個(gè)二進(jìn)制變量當(dāng)然慢。后來(lái)聚合建模后變量降到幾百個(gè)幾秒就出結(jié)果。3.2 代碼框架設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)不要把所有變量塞進(jìn)一個(gè)大腳本。我用四個(gè)文件組織代碼main.m負(fù)責(zé)總流程和調(diào)用data_define.m里放系統(tǒng)數(shù)據(jù)model_define.m里放Yalmip建模solve_and_plot.m負(fù)責(zé)求解和圖形輸出。如果后續(xù)要加多場(chǎng)景再加一個(gè)scenario_generate.m。變量定義的核心是用sdpvar聲明連續(xù)變量、用binvar聲明0-1變量。比如N_gen 3; T 24; P_G sdpvar(N_gen, T, full); % 常規(guī)機(jī)組出力 P_ev_ch sdpvar(N_ev, T, full); % EV充電功率 P_ev_dis sdpvar(N_ev, T, full); % EV放電功率 u_ch binvar(N_ev, T, full); % EV充電狀態(tài) u_dis binvar(N_ev, T, full); % EV放電狀態(tài)這里full參數(shù)特別重要。如果不加Yalmip默認(rèn)認(rèn)為變量是個(gè)n*n方陣如果你傳入的是1x24向量它會(huì)報(bào)維度錯(cuò)誤。很多新手在這里卡了一晚上。時(shí)間軸統(tǒng)一為行向量功率矩陣統(tǒng)一為變量數(shù) x T所有sum()操作明確指定維度sum(x,1)這樣約束構(gòu)建時(shí)不用反復(fù)轉(zhuǎn)置。3.3 核心約束構(gòu)建與目標(biāo)函數(shù)先寫(xiě)功率平衡約束。這里涉及一個(gè)常見(jiàn)問(wèn)題可再生能源出力在場(chǎng)景化之后是一個(gè)概率矩陣如果你用期望值那就退化成了確定性模型。我用削減后的場(chǎng)景集每個(gè)場(chǎng)景單獨(dú)建約束所以模型里會(huì)有一系列帶場(chǎng)景下標(biāo)(s)的變量。但在確定性驗(yàn)證時(shí)可以先不考慮場(chǎng)景只用一個(gè)代表場(chǎng)景。model_define.m中的示意如下Constraints []; % 功率平衡約束 % sum(P_G,1)P_windP_pvP_St_dissum(P_ev_dis,1)P_buy ... % P_base P_St_ch sum(P_ev_ch,1) P_sell Constraints [Constraints, ... sum(P_G,1)P_wind_sceP_pv_sceP_St_dissum(P_ev_dis,1)P_buy ... P_base P_St_ch sum(P_ev_ch,1) P_sell];這里P_wind_sce、P_pv_sce是給定場(chǎng)景下的出力序列。如果允許棄風(fēng)和棄光就把它們替換為P_wind_used并新增棄風(fēng)變量P_wind_curtail約束為P_wind_used P_wind_curtail P_wind_sce目標(biāo)函數(shù)中加入懲罰成本。EV充放電互斥約束Constraints [Constraints, u_ch u_dis 1]; Constraints [Constraints, P_ev_ch P_ev_ch_max * u_ch]; Constraints [Constraints, P_ev_dis P_ev_dis_max * u_dis];SOC約束要寫(xiě)成遞推式% SOC_ev(t1) SOC_ev(t) eta_ch*P_ev_ch(t)/Cap_ev - P_ev_dis(t)/(eta_dis*Cap_ev) - E_drive(t)/Cap_ev for t 1:T-1 Constraints [Constraints, SOC_ev(t1) SOC_ev(t) ... eta_ch*P_ev_ch(:,t)/Cap_ev ... - P_ev_dis(:,t)/(eta_dis*Cap_ev) ... - E_drive(:,t)/Cap_ev]; end注意E_drive代表該時(shí)段電動(dòng)汽車(chē)出行消耗的能量如果沒(méi)考慮出行可以設(shè)為零。目標(biāo)函數(shù)建議用分段線性機(jī)組成本的增量形式來(lái)實(shí)現(xiàn)。簡(jiǎn)單起見(jiàn)復(fù)現(xiàn)時(shí)可以直接用二次函數(shù)讓Gurobi當(dāng)作MIQP求解但一旦場(chǎng)景數(shù)超過(guò)100MIQP會(huì)慢到讓人崩潰。所以我用增量成本分段線性化定義機(jī)組出力在第k段的變量P_seg(i,k,t)成本就是各段斜率之和。這樣目標(biāo)函數(shù)保持線性。3.4 求解與結(jié)果輸出求解調(diào)用一行代碼result optimize(Constraints, Objective, sdpsettings(solver,gurobi,verbose,2));求解完之后第一件事是檢查狀態(tài)if result.problem 0 disp(求解成功); else yalmiperror(result.problem) end不要只依賴result.problem為0有時(shí)候求解器返回1警告但依然可以接受。yalmiperror能給出比較明確的錯(cuò)誤描述。結(jié)果提取用value()函數(shù)。例如P_G_opt value(P_G); P_ev_ch_opt value(P_ev_ch); P_ev_dis_opt value(P_ev_dis); SOC_ev_opt value(SOC_ev);畫(huà)圖時(shí)要注意時(shí)序?qū)R。MATLAB的stairs更適合畫(huà)電力系統(tǒng)調(diào)度圖因?yàn)楣β试跁r(shí)段內(nèi)保持恒定。使用subplot同時(shí)展示機(jī)組出力、EV充放電功率、儲(chǔ)能SOC和棄風(fēng)棄光量讓調(diào)度策略一目了然。有經(jīng)驗(yàn)的讀者都會(huì)再做一個(gè)“可行性檢查”把所有決策變量的最值打印出來(lái)看是否在合理區(qū)間內(nèi)。比如min(P_G_opt(:))如果出現(xiàn)負(fù)值那一定是有約束寫(xiě)錯(cuò)了。4. 復(fù)現(xiàn)過(guò)程中常見(jiàn)問(wèn)題與排查技巧4.1 求解失敗與收斂慢最常遇到的情況是求解器提示“Infeasible”也就是約束之間互相矛盾。第一步檢查可行性把約束拆分逐個(gè)添加進(jìn)模型測(cè)試。比如先只加功率平衡看看能不能解再加機(jī)組上下限直到定位到哪條約束導(dǎo)致不可行。還要注意數(shù)值尺度。通常功率單位用kW電價(jià)單位用元/kWhSOC是小數(shù)。如果目標(biāo)函數(shù)里某一部分是0.001量級(jí)另一部分是1e8量級(jí)求解器數(shù)值精度會(huì)出問(wèn)題。解決方法是統(tǒng)一量綱或者把大數(shù)值項(xiàng)除以一個(gè)基準(zhǔn)功率。求解速度慢時(shí)先看二進(jìn)制變量數(shù)量。如果二進(jìn)制變量上千MILP求解時(shí)間指數(shù)增長(zhǎng)。另一個(gè)常用技巧是設(shè)置“mipgap”也就是最優(yōu)間隙容忍度。調(diào)度問(wèn)題允許1%的間隙結(jié)果差距不大但速度能快很多ops sdpsettings(solver,gurobi,gurobi.MIPGap,0.01);4.2 維度不匹配與變量定義錯(cuò)誤Yalmip變量尺寸不一致是最容易報(bào)錯(cuò)的地方。比如你定義了P_G sdpvar(N_gen, T)這在Yalmip里默認(rèn)是一個(gè)方陣不對(duì)sdpvar(N_gen, T)創(chuàng)建的是N_gen行T列的矩陣沒(méi)有full也一樣。但如果你傳入了1作為第一個(gè)維度而T是24那么P_G是行向量后續(xù)約束里你可能以為它是列向量寫(xiě)P_G(:,1)會(huì)報(bào)錯(cuò)。最好的習(xí)慣是在變量定義前用assert(size(P_G,2)T)來(lái)校驗(yàn)。還有個(gè)常見(jiàn)坑是binvar默認(rèn)是不帶引用限制的。在不該用二進(jìn)制的地方用了binvar就會(huì)把問(wèn)題變成超大的MILP。比如表征“電動(dòng)汽車(chē)只能在充電樁接入時(shí)充電”不需要用二進(jìn)制變量可以用時(shí)間窗直接強(qiáng)制充電功率為0Constraints [Constraints, P_ev_ch(:, outside_window) 0];。4.3 場(chǎng)景削減后的結(jié)果偏差用場(chǎng)景法求期望成本結(jié)果往往比實(shí)際期望值偏樂(lè)觀因?yàn)橄鳒p后的場(chǎng)景覆蓋不到極端情況。解決辦法是做回代檢驗(yàn)把求出的最優(yōu)解固定住代入原始的400個(gè)場(chǎng)景計(jì)算真實(shí)的期望成本和模型里的期望成本對(duì)比。如果偏差超過(guò)5%需要增加保留場(chǎng)景數(shù)或者換成更好的削減算法。另外有些論文里不是單獨(dú)做場(chǎng)景削減而是直接用蒙特卡洛在約束里循環(huán)所有場(chǎng)景這種做法在小規(guī)模系統(tǒng)里可行但場(chǎng)景數(shù)一大就完蛋。如果堅(jiān)持這樣做至少要限制場(chǎng)景數(shù)在20以內(nèi)。4.4 電動(dòng)汽車(chē)參數(shù)設(shè)置的坑EV參數(shù)設(shè)置直接影響調(diào)度結(jié)果。常見(jiàn)問(wèn)題聚合容量過(guò)大導(dǎo)致EV放電能力比電網(wǎng)功率還大模型會(huì)安排大量V2G把儲(chǔ)能變成主力電源。實(shí)際中EV不可能全天候聯(lián)網(wǎng)所以要設(shè)定接入時(shí)段比如只允許18:00到次日8:00充放電。SOC的初值和終值必須一致否則模型會(huì)從初始SOC里“偷能量”。如果設(shè)置終值比初值低那么模型相當(dāng)于免費(fèi)用掉了電池里的電成本會(huì)偏低。我建議加約束SOC_ev(1) SOC_ev(T1)強(qiáng)制一個(gè)運(yùn)行周期內(nèi)電量守恒。充電需求每天最少多需要仔細(xì)定義。如果設(shè)定所有EV一天要充入2000kWh而模型為了多放電把SOC壓到很低然后集中在下半夜充電雖然滿足約束但可能不現(xiàn)實(shí)。更穩(wěn)妥的做法是設(shè)定每個(gè)EV的入網(wǎng)時(shí)間和離網(wǎng)時(shí)間離網(wǎng)時(shí)SOC要達(dá)到某個(gè)下限比如90%。但這樣就引入了跟具體時(shí)間相關(guān)的復(fù)雜約束我建議在聚合模型里簡(jiǎn)化為總凈充電量約束且最大放電功率不超過(guò)總負(fù)荷的30%確保V2G只是輔助手段。5. 擴(kuò)展方向與個(gè)人踩坑記錄5.1 從單節(jié)點(diǎn)到配電網(wǎng)潮流如果論文需要研究線路約束和電壓分布那就不能只在單節(jié)點(diǎn)上做功率平衡。最簡(jiǎn)單的是用DistFlow線性化LDF或二階錐松弛SOCP。DistFlow把功率、電壓、損耗關(guān)系寫(xiě)成線性或近似線性的等式適合有載調(diào)壓的設(shè)備SOCP則把潮流約束寫(xiě)成錐約束Yalmip能用cone或norm實(shí)現(xiàn)Gurobi支持二階錐。我在復(fù)現(xiàn)時(shí)最初沒(méi)有網(wǎng)絡(luò)約束后來(lái)加上了33節(jié)點(diǎn)配電網(wǎng)約束數(shù)量增加但性能還好。但需要提醒加入網(wǎng)絡(luò)約束后原本在單節(jié)點(diǎn)下可行的EV充放電策略在潮流模型下可能不可行尤其是節(jié)點(diǎn)電壓越限。需要把EV充放電功率和網(wǎng)絡(luò)邊界聯(lián)系起來(lái)。這一步如果做出來(lái)論文的含金量會(huì)上一個(gè)檔次。5.2 從單目標(biāo)到多目標(biāo)擴(kuò)展碩士論文常喜歡寫(xiě)“經(jīng)濟(jì)性環(huán)保性”協(xié)同優(yōu)化也就是多目標(biāo)優(yōu)化。最簡(jiǎn)單的是加權(quán)求和法和ε-約束法。加權(quán)求和法把碳排放和運(yùn)行成本加權(quán)成一個(gè)目標(biāo)函數(shù)但權(quán)重選取很主觀。ε-約束法則是把碳排放作為額外約束每取一個(gè)排放上限就求解一次得到帕累托前沿。在Matlab里用Yalmip配合循環(huán)就能輕松實(shí)現(xiàn)ε-約束法。我復(fù)現(xiàn)時(shí)先用加權(quán)法發(fā)現(xiàn)碳排放權(quán)重稍大調(diào)度就恨不得全部用EV放電成本劇增后來(lái)改用ε-約束法結(jié)果曲線更平滑。如果你也要寫(xiě)多目標(biāo)建議用ε-約束法并用帕累托圖展示。5.3 我的真實(shí)復(fù)現(xiàn)體驗(yàn)這個(gè)項(xiàng)目我前后花了約三周每天兩小時(shí)。第一周卡在場(chǎng)景削減和變量維度上第二周模型跑通但結(jié)果不合常理比如EV瘋狂放電導(dǎo)致SOC一直為零第三天突然發(fā)現(xiàn)SOC賦初值時(shí)用了0.8約束卻限制SOC下限是0.9當(dāng)然不可行。找到后真想拍桌子。個(gè)人最大的體會(huì)是一定要先從確定性模型開(kāi)始把所有約束用單場(chǎng)景跑通再引入隨機(jī)場(chǎng)景。不要一開(kāi)始就上Monte Carlo加場(chǎng)景削減否則報(bào)錯(cuò)時(shí)你根本不知道是場(chǎng)景出了問(wèn)題還是約束出了問(wèn)題。我調(diào)試順序是無(wú)EV、無(wú)儲(chǔ)能、有儲(chǔ)能、有EV一層層加。這樣加一個(gè)部分就驗(yàn)證一個(gè)部分效率最高。最后再分享一個(gè)小技巧所有功率和電量的單位用kW和kWh所有成本單位用元電價(jià)用元/kWhSOC用0到1的小數(shù)。寫(xiě)代碼前先把單位寫(xiě)在注釋里因?yàn)楫?dāng)你盯著滿屏數(shù)字找錯(cuò)誤時(shí)單位不一致是最隱蔽的元兇。跑通了之后記得保存一份“運(yùn)行正?!钡膫浞菰俑南乱徊竭@是我和我身邊人用血淚換來(lái)的經(jīng)驗(yàn)。