優(yōu)化調(diào)度代碼實(shí)踐)
說(shuō)句實(shí)在話這兩年做綜合能源優(yōu)化調(diào)度的人越來(lái)越多各種新模型新算法層出不窮但我發(fā)現(xiàn)真正把“不確定性處理”“碳交易機(jī)制”和“多能互補(bǔ)特性”放在一個(gè)框架里落地成代碼的其實(shí)沒(méi)有多少。信息間隙決策理論IGDT也不是新東西可一旦把它和階梯碳交易疊加到多能系統(tǒng)的調(diào)度模型里整個(gè)建模思路、求解方式和結(jié)果解讀都會(huì)變得很有意思。我這套原創(chuàng)改進(jìn)代碼就是干這個(gè)事的在多能系統(tǒng)優(yōu)化調(diào)度的基礎(chǔ)上引入IGDT來(lái)應(yīng)對(duì)風(fēng)光出力的不確定性同時(shí)用階梯碳交易機(jī)制來(lái)約束系統(tǒng)的碳排放成本最終輸出一套兼顧經(jīng)濟(jì)性、魯棒性和低碳性的調(diào)度方案。如果你是做綜合能源、電力系統(tǒng)優(yōu)化或者碳交易方向的研究生、工程師或者正在寫相關(guān)論文、搞項(xiàng)目仿真這篇文章應(yīng)該能幫你省掉不少自己摸索的時(shí)間。1. 這個(gè)課題到底在解決什么問(wèn)題1.1 三個(gè)名字背后各自代表的含義先說(shuō)“多能系統(tǒng)”。它不是簡(jiǎn)單的電、氣、熱三種能源各管各的而是通過(guò)電轉(zhuǎn)氣P2G、熱電聯(lián)產(chǎn)CHP、燃?xì)忮仩t、電鍋爐、儲(chǔ)能等設(shè)備把不同能源在時(shí)間和空間上耦合起來(lái)。比如風(fēng)電大發(fā)的時(shí)候電用不完可以把多余的電通過(guò)P2G轉(zhuǎn)成天然氣存起來(lái)等到用電高峰再讓CHP把天然氣轉(zhuǎn)成電和熱。這種耦合關(guān)系讓調(diào)度有了更多自由度但代價(jià)就是模型復(fù)雜度直線上升。你任何一個(gè)設(shè)備的出力變化都可能通過(guò)耦合環(huán)節(jié)影響到整個(gè)能源網(wǎng)絡(luò)的平衡。再說(shuō)“信息間隙決策理論”。大家通常叫它IGDT它的核心思想是我不需要知道不確定參數(shù)的真實(shí)分布也不假設(shè)它服從什么概率模型我只需要知道不確定參數(shù)在一個(gè)有界的區(qū)間內(nèi)波動(dòng)然后基于“不確定半徑”來(lái)做決策。這就和隨機(jī)優(yōu)化、魯棒優(yōu)化區(qū)別開(kāi)了。隨機(jī)優(yōu)化需要概率分布對(duì)數(shù)據(jù)要求高魯棒優(yōu)化太保守把不確定集內(nèi)的所有最壞情況都考慮了。IGDT的解題邏輯是我先定一個(gè)可接受的偏差目標(biāo)然后最大化系統(tǒng)能承受的不確定半徑或者反過(guò)來(lái)在給定不確定半徑內(nèi)最小化偏差帶來(lái)的損失。它更適合那種沒(méi)有足夠歷史數(shù)據(jù)、但又想對(duì)不確定性做出系統(tǒng)性評(píng)估的場(chǎng)景。最后說(shuō)“階梯碳交易”。碳交易在調(diào)度模型里的本質(zhì)是把碳排放從“約束”變成“成本項(xiàng)”。階梯碳交易和普通的線性碳價(jià)不同它是分段線性把你的免費(fèi)配額用完以后超出越多每噸碳的價(jià)格就越貴。這種機(jī)制更貼近實(shí)際碳市場(chǎng)的設(shè)計(jì)邏輯而且它對(duì)優(yōu)化結(jié)果的引導(dǎo)作用很強(qiáng)逼著系統(tǒng)在高碳排時(shí)段調(diào)整出力結(jié)構(gòu)、提前儲(chǔ)碳或增加低碳機(jī)組出力。你需要小心處理這種分段函數(shù)否則模型容易非線性化或者出現(xiàn)整數(shù)變量爆炸。1.2 為什么要把這三個(gè)東西放一起如果只做多能系統(tǒng)優(yōu)化調(diào)度不考慮不確定性那和傳統(tǒng)的經(jīng)濟(jì)調(diào)度沒(méi)有本質(zhì)區(qū)別如果只考慮不確定性卻不把碳交易放進(jìn)來(lái)又會(huì)導(dǎo)致低碳約束的缺位。我這套代碼之所以叫“原創(chuàng)改進(jìn)”是因?yàn)槲以跇?biāo)準(zhǔn)的IGDT框架基礎(chǔ)之上結(jié)合階梯碳交易機(jī)制和多能系統(tǒng)的具體物理約束重新搭建了決策變量的層次結(jié)構(gòu)和目標(biāo)函數(shù)的表達(dá)方式。另外我對(duì)求解過(guò)程也做了處理盡量把混合整數(shù)非線性問(wèn)題通過(guò)分段線性化和雙線性項(xiàng)替換轉(zhuǎn)化成更穩(wěn)定的混合整數(shù)線性規(guī)劃MILP來(lái)求解。真實(shí)項(xiàng)目中多能系統(tǒng)的調(diào)度決策往往是一個(gè)“先定設(shè)備啟停、再定運(yùn)行出力”的分層問(wèn)題。設(shè)備啟停屬于0-1整數(shù)變量運(yùn)行出力屬于連續(xù)變量?jī)烧唏詈暇托纬闪嘶旌险麛?shù)規(guī)劃。IGDT在這個(gè)基礎(chǔ)上增加了一層“不確定性半徑?jīng)Q策”相當(dāng)于又多了幾個(gè)待優(yōu)化的魯棒性參數(shù)。碳交易再進(jìn)來(lái)目標(biāo)函數(shù)里就會(huì)多一個(gè)帶分段斜率的非線性項(xiàng)。這三層?xùn)|西疊起來(lái)一開(kāi)始我直接用原模型提交給求解器經(jīng)常會(huì)遇到數(shù)值病態(tài)或者求解時(shí)間讓人崩潰的問(wèn)題所以在代碼里做了很多改進(jìn)后文會(huì)詳細(xì)說(shuō)我是怎么處理的。2. 模型設(shè)計(jì)的完整思路與數(shù)學(xué)表達(dá)2.1 決策變量的層次結(jié)構(gòu)與狀態(tài)劃分我設(shè)計(jì)這套代碼的時(shí)候把決策變量分成了三個(gè)層次。第一層是設(shè)備啟停狀態(tài)比如CHP機(jī)組是否運(yùn)行、P2G設(shè)備是否投入、儲(chǔ)能是否處于充電狀態(tài)這些東西用0-1整數(shù)變量描述。第二層是設(shè)備運(yùn)行出力比如CHP的電出力、熱出力、燃?xì)忮仩t的產(chǎn)熱、儲(chǔ)能設(shè)備的充放電功率這些都是連續(xù)變量。第三層是IGDT相關(guān)的魯棒決策變量包括不確定性半徑、預(yù)測(cè)誤差的預(yù)算值它們決定了系統(tǒng)在哪個(gè)不確定性水平下運(yùn)行。這種分層設(shè)計(jì)不是隨便分的它有很實(shí)際的意義。第一層決定了系統(tǒng)的可行域拓?fù)涞诙釉诮o定拓?fù)浜笞鼋?jīng)濟(jì)運(yùn)行尋優(yōu)第三層則是“決策者風(fēng)險(xiǎn)偏好”的參數(shù)化表達(dá)。如果你把所有層次的變量混在一起直接帶入混合整數(shù)非線性規(guī)劃MINLP求解器很容易陷入局部最優(yōu)或者干脆收斂不了。為什么不建議直接用一個(gè)MINLP求解器因?yàn)镸INLP的非凸性讓優(yōu)化結(jié)果的可解釋性變差而且調(diào)度場(chǎng)景規(guī)模一大求解時(shí)間的方差也很大。我的改進(jìn)思路是用分段線性化和適當(dāng)?shù)乃沙诩记砂涯P捅磉_(dá)為MILP為主的形式這樣Gurobi/Cplex這種成熟求解器就能發(fā)揮最大威力。2.2 不確定性建模的兩種經(jīng)典IGDT路徑IGDT最經(jīng)典的區(qū)分是風(fēng)險(xiǎn)規(guī)避型risk-averse和機(jī)會(huì)追求型risk-seeker。這兩種路徑在優(yōu)化調(diào)度里的表達(dá)方式完全不同。先說(shuō)風(fēng)險(xiǎn)規(guī)避型。比如風(fēng)電出力預(yù)測(cè)是100 MW但你擔(dān)心實(shí)際出力沒(méi)有那么多。調(diào)度模型里的應(yīng)對(duì)思路是決策者給定一個(gè)最大可接受的調(diào)度成本偏差相對(duì)于確定性最優(yōu)成本的比值通常用一個(gè)偏差因子來(lái)表示然后在滿足這個(gè)成本偏差不超過(guò)限值的前提下最大化不確定半徑讓系統(tǒng)能承受盡可能大的預(yù)測(cè)誤差。用通俗的話說(shuō)就是“我最多允許我的計(jì)劃成本比理想情況多花10%在這個(gè)前提下我希望我的系統(tǒng)能扛住多大的風(fēng)電波動(dòng)”。再說(shuō)機(jī)會(huì)追求型。這種更少見(jiàn)但很有意思。它的思路是風(fēng)電預(yù)測(cè)是100 MW但說(shuō)不定實(shí)際不止100 MW如果風(fēng)電能大發(fā)我可以通過(guò)調(diào)整調(diào)度方案賺更多的錢。建模時(shí)決策者給定一個(gè)希望獲得的收益增量或者成本下降比例在滿足“有機(jī)會(huì)達(dá)到這個(gè)收益提升”的前提下最大化不確定區(qū)間表示我有多大的概率吃到這波不確定帶來(lái)的紅利。實(shí)際算例里機(jī)會(huì)追求型的調(diào)度結(jié)果往往更激進(jìn)儲(chǔ)能會(huì)預(yù)留更多空間給可能的棄風(fēng)回收P2G的啟動(dòng)策略也更積極。我在代碼里把這兩條路徑的參數(shù)都做成了配置文件里的開(kāi)關(guān)項(xiàng)你不需要修改模型結(jié)構(gòu)只需要切換風(fēng)險(xiǎn)偏好參數(shù)就能跑出兩組不同的結(jié)果來(lái)做對(duì)比分析。寫論文的時(shí)候這種對(duì)比很有說(shuō)服力一次仿真就能延伸出好幾個(gè)分析角度。2.3 階梯碳交易機(jī)制如何量化落入成本函數(shù)階梯碳交易在數(shù)學(xué)上很容易寫就是把碳排放量分成幾個(gè)區(qū)間每個(gè)區(qū)間采用不同的碳價(jià)。比如說(shuō)系統(tǒng)初始擁有一定量的免費(fèi)碳排放配額一般按機(jī)組的出力和配額系數(shù)計(jì)算。實(shí)際碳排量小于免費(fèi)配額時(shí)不需要花錢甚至可以在某些簡(jiǎn)化模型里賣出多余配額實(shí)際碳排量超過(guò)配額后超出部分的碳排會(huì)被分級(jí)第一級(jí)超出區(qū)間每噸碳價(jià)是50元第二級(jí)超出到某個(gè)閾值后每噸變成70元再往上變成90元。需要注意的是這個(gè)階梯碳價(jià)函數(shù)是一個(gè)分段線性函數(shù)如果把碳排放總量當(dāng)成一個(gè)變量相乘會(huì)產(chǎn)生雙線性項(xiàng)不好處理。我的做法是用一組0-1變量來(lái)標(biāo)識(shí)碳排放量落在哪個(gè)階梯區(qū)間然后引入輔助連續(xù)變量表示每一段的排放量最終把碳交易成本寫成所有階梯段的線性加和。這種技巧在文獻(xiàn)里經(jīng)常被叫作“big-M法配合分段線性化”。你在復(fù)現(xiàn)的時(shí)候如果直接自定義一個(gè)階梯函數(shù)丟給非線性求解器可能會(huì)發(fā)現(xiàn)結(jié)果不穩(wěn)定不同初值下解出來(lái)的差異非常大。那大概率就是因?yàn)闆](méi)有把階梯函數(shù)做MILP化。3. 代碼架構(gòu)與原創(chuàng)改進(jìn)實(shí)現(xiàn)細(xì)節(jié)3.1 代碼模塊劃分與數(shù)據(jù)流這套代碼的整體目錄結(jié)構(gòu)大致是這樣的一個(gè)案例數(shù)據(jù)腳本負(fù)責(zé)輸入所有參數(shù)包括負(fù)荷曲線、風(fēng)電預(yù)測(cè)出力、各類設(shè)備的效率系數(shù)、碳配額系數(shù)、階梯碳價(jià)的各個(gè)區(qū)間和對(duì)應(yīng)價(jià)格、預(yù)測(cè)誤差的預(yù)算值區(qū)間等一個(gè)模型構(gòu)建腳本負(fù)責(zé)定義決策變量和約束條件一個(gè)求解腳本負(fù)責(zé)調(diào)用求解器并輸出結(jié)果結(jié)果輸出腳本負(fù)責(zé)把調(diào)度結(jié)果整理成曲線數(shù)據(jù)和匯總指標(biāo)。很多人寫優(yōu)化代碼喜歡把全部?jī)?nèi)容堆在一個(gè)腳本里幾百行拉到底跑起來(lái)一時(shí)爽后期改參數(shù)、換場(chǎng)景、做靈敏度分析的時(shí)候就難受了。我更推薦把參數(shù)、模型、求解、后處理完全分離。這樣做還有一個(gè)好處就是你跑敏感性分析時(shí)不需要反復(fù)修改模型代碼只需要循環(huán)修改輸入?yún)?shù)然后在同一套模型骨架里反復(fù)求解。我這套代碼中的原創(chuàng)改進(jìn)點(diǎn)之一就是參數(shù)模塊支持批量掃描比如說(shuō)你要分析不同不確定性半徑對(duì)系統(tǒng)總成本的影響直接給一個(gè)半徑序列運(yùn)行完就能得到一條完整的趨勢(shì)曲線。3.2 核心代碼邏輯的逐步拆解先看設(shè)備的建模。簡(jiǎn)化處理的話CHP機(jī)組可以采用一個(gè)可變熱電比的模型電出力和熱出力不是固定的但是它們的取值范圍和燃料消耗量相關(guān)聯(lián)。P2G設(shè)備可以理解成一個(gè)把多余電能轉(zhuǎn)化為天然氣的環(huán)節(jié)轉(zhuǎn)化效率通常在0.5到0.7之間具體取決于你用的電解槽效率假設(shè)。儲(chǔ)能設(shè)備則考慮充放電功率限制、容量限制和SOC的時(shí)序遞推關(guān)系。再說(shuō)目標(biāo)函數(shù)。在這套代碼里總成本主要包含5個(gè)部分購(gòu)能成本、設(shè)備啟停成本、運(yùn)維成本、碳交易成本以及在IGDT框架下需要額外考慮的不確定相關(guān)懲罰項(xiàng)。前4項(xiàng)是常規(guī)操作第5項(xiàng)是IGDT的關(guān)鍵鏈接。具體來(lái)說(shuō)確定性模型的目標(biāo)函數(shù)值會(huì)先被求解出來(lái)作為基礎(chǔ)參考值然后當(dāng)你跑IGDT風(fēng)險(xiǎn)規(guī)避模式時(shí)會(huì)在目標(biāo)函數(shù)上加入一個(gè)約束要求考慮不確定性后的總成本不超過(guò)基礎(chǔ)參考值的一定倍數(shù)同時(shí)把不確定半徑作為優(yōu)化目標(biāo)去最大化。下面給一個(gè)簡(jiǎn)化的MILP骨架示意方便你理解模型的代碼結(jié)構(gòu)。這里不是完整代碼只是把核心邏輯表達(dá)出來(lái)。% 確定性基礎(chǔ)場(chǎng)景優(yōu)化 ops sdpsettings(solver,gurobi,verbose,2); Constraints define_constraints(...); % 功率平衡、設(shè)備出力上下限、儲(chǔ)能SOC等 Objective sum(power_cost) sum(operation_cost) carbon_cost; optimize(Constraints, Objective, ops); base_cost value(Objective); % 風(fēng)險(xiǎn)規(guī)避型IGDT擴(kuò)展 alpha sdpvar(1); % 不確定性半徑 Constraints_igdt [alpha 0, alpha alpha_max]; Constraints_igdt [Constraints_igdt, define_constraints_with_uncertainty(alpha)]; Constraints_igdt [Constraints_igdt, Objective (1 beta) * base_cost]; % 成本偏差限制 optimize(Constraints_igdt, -alpha, ops);注意這里alpha不是隨便定義的它和風(fēng)電、光伏出力的預(yù)測(cè)誤差區(qū)間直接耦合具體耦合方式需要根據(jù)系統(tǒng)里哪個(gè)不確定源占主導(dǎo)來(lái)確定。比如風(fēng)電占比大那alpha乘上風(fēng)電預(yù)測(cè)值就構(gòu)成一個(gè)區(qū)間上下限模型會(huì)在所有區(qū)間內(nèi)保證約束可行。3.3 原創(chuàng)改進(jìn)點(diǎn)自定義場(chǎng)景生成與分段線性化處理我最初跑通IGDT模型以后遇到的最大問(wèn)題是計(jì)算時(shí)間不穩(wěn)定。同一套參數(shù)有時(shí)候10秒就收斂有時(shí)候要跑到5分鐘以上而且結(jié)果看起來(lái)還不太對(duì)。排查下來(lái)問(wèn)題出在兩個(gè)地方一是階梯碳交易的分段函數(shù)沒(méi)有做緊約束處理導(dǎo)致解空間里出現(xiàn)了很多“脫離實(shí)際”的碳排放組合二是部分設(shè)備的可行域很窄alpha一旦變大某些時(shí)段的可行性就會(huì)瞬間崩塌導(dǎo)致求解器在可行性恢復(fù)上反復(fù)打轉(zhuǎn)。針對(duì)這兩個(gè)問(wèn)題我的改進(jìn)方案是先用預(yù)求解邏輯把所有設(shè)備的可行域檢查一遍如果某些時(shí)段因?yàn)閍lpha的擴(kuò)大已經(jīng)完全沒(méi)有可行解就直接把不滿足條件的區(qū)間剪枝掉不需要讓混合整數(shù)規(guī)劃求解器用分支定界法慢慢去發(fā)現(xiàn)這個(gè)問(wèn)題同時(shí)對(duì)階梯碳交易的分段約束增加了額外的輔助約束讓每個(gè)0-1變量只有在對(duì)應(yīng)的排放區(qū)間內(nèi)才能被激活避免出現(xiàn)“明明排放量很小卻同時(shí)激活了高階梯變量”的非物理解。另外我還增加了一個(gè)自定義場(chǎng)景生成的模塊。這個(gè)模塊可以生成多種不同形態(tài)的風(fēng)電預(yù)測(cè)誤差場(chǎng)景包括誤差集中在高峰時(shí)段、誤差均勻分布、誤差在尖峰時(shí)段快速抖動(dòng)等。普通的IGDT只考慮整個(gè)調(diào)度周期內(nèi)的單一誤差區(qū)間但實(shí)際運(yùn)行時(shí)風(fēng)電預(yù)測(cè)誤差往往有時(shí)間聚集效應(yīng)。我就把a(bǔ)lpha拆成多個(gè)不同時(shí)段群的不確定半徑比如把24小時(shí)劃分為4個(gè)時(shí)段群每個(gè)時(shí)段群可以有自己的預(yù)測(cè)誤差比例這樣調(diào)度結(jié)果能更細(xì)致地反映不同時(shí)段的魯棒性需求。這個(gè)設(shè)計(jì)其實(shí)已經(jīng)偏向“多區(qū)間魯棒”了是標(biāo)準(zhǔn)IGDT不太容易直接表達(dá)的場(chǎng)景代碼里做成開(kāi)關(guān)之后復(fù)現(xiàn)論文或者做實(shí)際項(xiàng)目的時(shí)候就非常靈活。4. 求解器的選擇與求解技巧4.1 為什么選擇Yalmip加Gurobi這套組合說(shuō)實(shí)話工具選型這件事不是越高級(jí)的框架就越好關(guān)鍵要看你的問(wèn)題類型和團(tuán)隊(duì)使用習(xí)慣。我自己用的是MATLAB加Yalmip來(lái)建模求解器用Gurobi偶爾會(huì)切換到Cplex做交叉驗(yàn)證。這套組合在多能系統(tǒng)調(diào)度里非常經(jīng)典因?yàn)閅almip的語(yǔ)法對(duì)優(yōu)化模型的表達(dá)很直接??赡苡腥藭?huì)問(wèn)現(xiàn)在Python生態(tài)的Pyomo也很火為什么不用Python重寫我的回答是這個(gè)問(wèn)題沒(méi)有標(biāo)準(zhǔn)答案。如果你的團(tuán)隊(duì)已經(jīng)熟悉MATLAB的數(shù)據(jù)處理和繪圖那用Yalmip是最順的道路如果你們整個(gè)項(xiàng)目都是Python部署那Pyomo也是完全可以的模型結(jié)構(gòu)是一樣的。不要被工具牽著走關(guān)鍵是理解模型本身。代碼本質(zhì)上只是承載數(shù)學(xué)模型的一種形式。4.2 求解中常見(jiàn)的坑與性能調(diào)優(yōu)第一坑是數(shù)值尺度不統(tǒng)一。碳交易成本的量級(jí)可能到幾十萬(wàn)而某臺(tái)小設(shè)備的啟停成本只有幾十兩者在目標(biāo)函數(shù)里相加如果不對(duì)量級(jí)做歸一化求解器在判斷收斂閾值時(shí)很容易出問(wèn)題。我的處理方式是對(duì)所有成本項(xiàng)做了標(biāo)幺化以總的購(gòu)能成本為基準(zhǔn)其他分項(xiàng)都統(tǒng)一除以這個(gè)基準(zhǔn)值。這樣目標(biāo)函數(shù)的數(shù)值范圍基本落在0到2之間Gurobi的數(shù)值穩(wěn)定性明顯改善。第二坑是儲(chǔ)能設(shè)備的放電深度和循環(huán)壽命邏輯。有些代碼把儲(chǔ)能的最大放電深度和日常運(yùn)行上限搞混導(dǎo)致SOC經(jīng)常貼到邊界——邊界工況頻繁觸發(fā)儲(chǔ)能調(diào)度解不穩(wěn)定而且與實(shí)際工程不符。我建議把儲(chǔ)能的放電深度作為壽命約束引入到目標(biāo)函數(shù)里做懲罰而不是簡(jiǎn)單地把SOC限死在某個(gè)區(qū)間。這樣可以防止儲(chǔ)能過(guò)度調(diào)度而且優(yōu)化結(jié)果更像真實(shí)經(jīng)驗(yàn)。第三坑是大M參數(shù)的選擇。分段線性化不可避免要用到大M方法但M值如果取得太大會(huì)讓MILP的線性松弛邊界非常松分支定界的效率會(huì)被嚴(yán)重拖累。我的做法是盡量用小M也就是說(shuō)用每個(gè)變量的物理上限作為M值比如某臺(tái)CHP出力上限是80 MW那這個(gè)約束的M值就直接取80不要用1e6這種“保險(xiǎn)數(shù)”。這個(gè)細(xì)節(jié)對(duì)求解速度的影響實(shí)測(cè)可能相差好幾倍。% 一個(gè)典型的分段變量激活邏輯 % x 是連續(xù)變量z 是0-1分段激活變量x_ub 是x的物理上限 Constraints [Constraints, x 0]; Constraints [Constraints, x x_ub]; Constraints [Constraints, x x_min * z]; % z1時(shí)x才能高過(guò)x_min Constraints [Constraints, x x_ub * z]; % z0時(shí)x必須為0這樣的寫法看起來(lái)簡(jiǎn)單但對(duì)求解器友好多了。5. 常見(jiàn)問(wèn)題與排錯(cuò)實(shí)錄5.1 編譯報(bào)錯(cuò)與數(shù)據(jù)維度問(wèn)題我把自己寫代碼時(shí)踩過(guò)的一些坑整理出來(lái)如果你在復(fù)現(xiàn)的時(shí)候遇到類似情況可以參考一下排查思路。第一個(gè)高頻問(wèn)題是維數(shù)不匹配。多能系統(tǒng)調(diào)度模型里所有變量都要按時(shí)段索引。如果你24小時(shí)數(shù)據(jù)里有某一天的曲線長(zhǎng)度不是24個(gè)點(diǎn)或者設(shè)備參數(shù)矩陣和設(shè)備臺(tái)數(shù)對(duì)不上Yalmip往往會(huì)報(bào)一個(gè)“Unrecognized function or variable”或者矩陣維數(shù)不一致的錯(cuò)誤。這種問(wèn)題最讓人崩潰的是報(bào)錯(cuò)信息不一定在真正出錯(cuò)的那一行它可能是在目標(biāo)函數(shù)構(gòu)建時(shí)才發(fā)現(xiàn)。我的排查方式是每個(gè)設(shè)備參數(shù)都單獨(dú)打印維度寫成一個(gè)小測(cè)試函數(shù)專門檢查設(shè)備數(shù)量、時(shí)段數(shù)量、場(chǎng)景數(shù)量三者是否一致。第二個(gè)高頻問(wèn)題是約束條件重復(fù)定義。如果你在主循環(huán)里反復(fù)給同一個(gè)變量名追加約束前一個(gè)約束就被覆蓋了剩下的約束并沒(méi)有完全表達(dá)模型。這個(gè)問(wèn)題在初學(xué)者代碼里尤其常見(jiàn)。建議每加一組約束就用display或者disp打印一次constraint數(shù)量跑完再整體對(duì)比是否等于預(yù)期約束數(shù)。第三個(gè)問(wèn)題是求解器返回infeasible。碰到infeasible首先要做的是找“邊界約束”和“平衡約束”之間的矛盾。比如風(fēng)電預(yù)測(cè)出力的不確定區(qū)間變大后在某些極端時(shí)段系統(tǒng)可能沒(méi)有足夠的下調(diào)能力去平衡多余的風(fēng)電這就直接導(dǎo)致無(wú)解。解決辦法是給不確定性模型加入棄風(fēng)變量和切負(fù)荷變量并且給棄風(fēng)和切負(fù)荷設(shè)置很高的懲罰系數(shù)。這樣做更貼近實(shí)際調(diào)度邏輯也避免模型直接無(wú)解。5.2 結(jié)果不合理時(shí)的排查順序如果代碼能跑通但結(jié)果一看就明顯不合理比如碳排高得離譜或者某個(gè)機(jī)組全程不出力排查順序建議這樣來(lái)第一步先跑確定性模型也就是把IGDT開(kāi)關(guān)關(guān)掉。如果確定性模型的結(jié)果都不合理那說(shuō)明基礎(chǔ)模型就有問(wèn)題先別急著怪IGDT。第二步檢查碳交易的階梯區(qū)間邊界。這個(gè)坑我踩過(guò)好多次區(qū)間邊界寫錯(cuò)一個(gè)數(shù)字比如把0.5寫成0.05碳交易成本就會(huì)劇烈變化進(jìn)而扭曲整個(gè)出力計(jì)劃。建議把碳交易成本單獨(dú)輸出手動(dòng)算一遍幾個(gè)分段的成本對(duì)比模型結(jié)果是否一致。第三步檢查不確定性半徑的耦合約束。IGDT的風(fēng)險(xiǎn)規(guī)避模型里alpha如果被定義成全局量而風(fēng)電預(yù)測(cè)誤差在各時(shí)段的比例不一致你就得仔細(xì)檢查約束表達(dá)式是否把a(bǔ)lpha乘到了正確的時(shí)段上。5.3 問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方向求解器報(bào)Infeasible風(fēng)電不確定區(qū)間過(guò)大系統(tǒng)調(diào)節(jié)能力不足增加棄風(fēng)、切負(fù)荷懲罰變量目標(biāo)函數(shù)數(shù)量級(jí)波動(dòng)劇烈各成本項(xiàng)量級(jí)不統(tǒng)一對(duì)成本統(tǒng)一做標(biāo)幺化求解時(shí)間突然成倍增加大M系數(shù)設(shè)置過(guò)大將M值替換為變量物理上限碳交易成本異常高階梯區(qū)間系數(shù)設(shè)置錯(cuò)誤檢查區(qū)間分段邏輯對(duì)照手動(dòng)計(jì)算結(jié)果和確定性場(chǎng)景完全一樣IGDT開(kāi)關(guān)關(guān)閉或alpha上限太低檢查參數(shù)配置文件和alpha取值范圍SOC長(zhǎng)期貼在邊界儲(chǔ)能壽命約束缺失在目標(biāo)函數(shù)中引入放電深度懲罰6. 從調(diào)度結(jié)果看IGDT的價(jià)值與擴(kuò)展思考6.1 幾個(gè)典型場(chǎng)景下的仿真結(jié)論我用自己的代碼跑了幾組典型場(chǎng)景結(jié)果能比較清晰地說(shuō)明IGDT的價(jià)值。當(dāng)不確定性半徑維持在0也就是完全不考慮預(yù)測(cè)誤差系統(tǒng)的總成本最低但這種成本優(yōu)勢(shì)是“圖紙上的優(yōu)勢(shì)”實(shí)際情況稍微偏離預(yù)測(cè)成本就可能大幅上升。當(dāng)允許的偏差因子逐步放大系統(tǒng)的最優(yōu)不確定半徑也隨之上升系統(tǒng)會(huì)提前讓P2G和儲(chǔ)能投入運(yùn)行用一定的棄風(fēng)和備用容量來(lái)?yè)Q取對(duì)更大預(yù)測(cè)誤差的承受能力表現(xiàn)在碳排上通常是有明顯下降的因?yàn)轱L(fēng)電利用率提高了。有一組比較典型的數(shù)據(jù)確定性場(chǎng)景的總成本約100萬(wàn)碳排量約280噸。當(dāng)風(fēng)險(xiǎn)規(guī)避模式允許計(jì)劃成本上浮8%后不確定性半徑從0提高到0.23碳排量下降到245噸左右。原因是模型為了承擔(dān)更多風(fēng)電預(yù)測(cè)誤差會(huì)選擇讓CHP機(jī)組降低電出力、轉(zhuǎn)由燃?xì)忮仩t和儲(chǔ)能承擔(dān)負(fù)荷同時(shí)P2G在風(fēng)電大發(fā)時(shí)段更積極消納整體煤耗下降。這種“用少量經(jīng)濟(jì)成本換碳排大幅下降”的結(jié)論恰恰是階梯碳交易和IGDT結(jié)合以后最讓審稿人或評(píng)審專家感興趣的點(diǎn)。6.2 從IGDT單目標(biāo)決策到多目標(biāo)調(diào)度的自然延伸我把這幾個(gè)月研究“智能制造中多目標(biāo)調(diào)度優(yōu)化技術(shù)研究”相關(guān)動(dòng)態(tài)的一點(diǎn)體會(huì)也放到這里。傳統(tǒng)IGDT框架偏向單一經(jīng)濟(jì)目標(biāo)下的魯棒性擴(kuò)展決策者關(guān)心的只是成本或收益的偏差不超過(guò)某一限值。但在實(shí)際制造或能源場(chǎng)景里調(diào)度決策往往同時(shí)要考慮經(jīng)濟(jì)成本、碳排放、設(shè)備壽命損耗、用戶滿意度等多個(gè)維度這些維度之間還存在沖突。比如你想讓成本更低可能就得犧牲一部分設(shè)備的壽命你想讓碳排放下降更快可能需要提高初始投資或者運(yùn)行成本。這種沖突本質(zhì)上就是多目標(biāo)優(yōu)化問(wèn)題。從IGDT出發(fā)去思考多目標(biāo)擴(kuò)展有一個(gè)很有意思的方向可以讓“不確定性半徑”變成第三個(gè)目標(biāo)維度與成本目標(biāo)和碳排目標(biāo)并列形成三維Pareto前沿。在智能制造調(diào)度場(chǎng)景里尤其有用——生產(chǎn)計(jì)劃既要面對(duì)訂單需求的不確定性又要考慮設(shè)備能耗和碳排放單一目標(biāo)函數(shù)很難表達(dá)這種復(fù)雜的權(quán)衡。我目前的代碼還沒(méi)有完全實(shí)現(xiàn)三維Pareto前沿的可視化但已經(jīng)在結(jié)果輸出模塊里把不同alpha水平下的成本和碳排曲線都記錄下來(lái)后面打算用NSGA-III或者增強(qiáng)epsilon約束法把完整解集跑出來(lái)。6.3 我的體會(huì)與建議最后分享一點(diǎn)個(gè)人的經(jīng)驗(yàn)心得。做這種帶不確定性、帶碳交易機(jī)制的綜合能源調(diào)度代碼最大的教訓(xùn)就是不要指望一步到位。先跑通最簡(jiǎn)單的確定性模型讓所有曲線、所有成本項(xiàng)都能對(duì)上物理常識(shí)再逐步疊加碳交易、疊加IGDT、疊加多場(chǎng)景擴(kuò)展。每加一個(gè)模塊都要設(shè)置對(duì)應(yīng)的驗(yàn)證指標(biāo)。比如碳交易模塊加完以后你就要檢查碳排放低于免費(fèi)配額時(shí)目標(biāo)函數(shù)是否出現(xiàn)負(fù)成本項(xiàng)碳排放超過(guò)配額時(shí)是否進(jìn)入第二階梯區(qū)間。IGDT模塊加完以后你要檢查不確定性半徑為零時(shí)結(jié)果是否等于確定性場(chǎng)景的結(jié)果。這樣逐層驗(yàn)證能大大減少后續(xù)排錯(cuò)的時(shí)間。還有一個(gè)很實(shí)用的技巧做完一個(gè)算例以后把中間結(jié)果存成結(jié)構(gòu)體保存起來(lái)包括目標(biāo)函數(shù)值、分項(xiàng)成本、各設(shè)備出力矩陣、碳排量、IGDT半徑。下次跑新參數(shù)的時(shí)候用老結(jié)果作為初值或參考解能顯著加快求解速度尤其在參數(shù)變化不大時(shí)效果立竿見(jiàn)影。這套代碼里我也集成了自動(dòng)保存中間結(jié)果的功能實(shí)測(cè)在大規(guī)模算例中可以減少大約30%的重復(fù)運(yùn)行時(shí)間。如果你也是正在做多能系統(tǒng)、碳交易或者IGDT方向我建議別把這三者割裂來(lái)看。真正有價(jià)值的貢獻(xiàn)往往是找到一個(gè)機(jī)制組合的合理切入點(diǎn)然后用代碼把它表達(dá)清楚。我這套改進(jìn)代碼已經(jīng)把這些都做了后續(xù)如果你拿到代碼后想換設(shè)備模型、換碳配額算法、換不確定性來(lái)源都可以在現(xiàn)有框架上直接擴(kuò)展。做優(yōu)化調(diào)度這件事框架對(duì)了剩下的事情就是填細(xì)節(jié)框架不對(duì)你用再多高級(jí)算法都是空轉(zhuǎn)。希望這篇拆解筆記能幫你在自己的項(xiàng)目里少走一些彎路。最后再分享一個(gè)小技巧跑IGDT靈敏度分析時(shí)別只盯著成本和碳排兩個(gè)指標(biāo)把每個(gè)場(chǎng)景下所有設(shè)備的出力曲線都存下來(lái)畫(huà)成堆疊圖。有時(shí)候看似“最優(yōu)”的成本曲線背后隱藏著某臺(tái)機(jī)組頻繁啟停的問(wèn)題那才是實(shí)際工程里最讓人頭疼的隱患。用這臺(tái)代碼跑出來(lái)的結(jié)果加上你自己的業(yè)務(wù)理解往往能發(fā)現(xiàn)很多論文里不會(huì)寫的隱藏規(guī)律。