電熱雙層共享策略Matlab復(fù)現(xiàn)詳解)
做微電網(wǎng)或綜合能源方向的課題大概率會遇到這樣一個場景手上有好幾個微網(wǎng)的負(fù)荷、光伏、熱負(fù)荷和儲能數(shù)據(jù)每個微網(wǎng)都有自己的運(yùn)營方彼此不能互相指揮但物理上卻硬生生連在同一條聯(lián)絡(luò)線或供熱管道上。誰該多出力、誰該支援誰、電和熱怎么分?jǐn)偹阗~越來越難。我復(fù)現(xiàn)《基于納什博弈的多微網(wǎng)主體電熱雙層共享策略研究》時就是為了解決這個問題——借助納什博弈把多個利益不一的微網(wǎng)主體放進(jìn)同一個框架里博弈最后用Matlab把整套雙層共享策略從論文符號翻譯成可以運(yùn)行的代碼。這篇博文把完整的建模思路、代碼實現(xiàn)路徑和踩坑記錄寫下來適合兩類人想快速復(fù)現(xiàn)論文算法做對比實驗的研究生以及面對一堆公式不知道如何落地的實戰(zhàn)派從業(yè)者。1. 多微網(wǎng)電熱共享到底在共享什么1.1 單微網(wǎng)調(diào)度早已不夠用先把背景故事說清楚。微網(wǎng)是什么簡單講就是一塊區(qū)域內(nèi)把分布式光伏、風(fēng)電、燃?xì)廨啓C(jī)、儲能、電鍋爐、熱泵以及本地負(fù)荷打包在一起的自洽供電系統(tǒng)。它既能并網(wǎng)運(yùn)行也能獨立孤島運(yùn)行。單獨一個微網(wǎng)做調(diào)度時事情其實很單純在一個調(diào)度周期內(nèi)用最便宜的方式滿足本地電負(fù)荷和熱負(fù)荷。之前我做單微網(wǎng)能量管理系統(tǒng)時這本質(zhì)上就是一個確定性優(yōu)化問題光伏出力、負(fù)荷曲線給定燃?xì)廨啓C(jī)怎么開、儲能什么時候充放電把每天運(yùn)行成本優(yōu)化一遍就算完事。但實際工程里一個園區(qū)、一個區(qū)域往往不止一個微網(wǎng)。相鄰微網(wǎng)之間有聯(lián)絡(luò)線有的還共用熱力管道。這時候單微網(wǎng)調(diào)度就不夠用了——白天光伏大發(fā)而本地負(fù)荷低的微網(wǎng)看著自家的電白白棄掉另一個微網(wǎng)晚上負(fù)荷高企卻要從外部高價買電。如果各自為政系統(tǒng)整體利用率低成本也高如果直接拉通統(tǒng)一調(diào)度從物理層面看是最優(yōu)的從組織層面又行不通。原因在于每個微網(wǎng)都有自己的運(yùn)營商沒有人愿意無條件服從全局調(diào)度。這種“物理上互聯(lián)、管理上自治”的格局正是后面所有復(fù)雜模型的根源。多微網(wǎng)共享調(diào)度要做的就是在承認(rèn)各主體自治的前提下通過交易和策略實現(xiàn)比單干更好的結(jié)果。1.2 電和熱是兩套節(jié)奏完全不同的交易“電熱雙層共享”這六個字里最容易忽略的是電和熱的本質(zhì)差別。我自己復(fù)現(xiàn)早期就犯過想當(dāng)然的錯誤以為把電功率換成熱功率模型推導(dǎo)照葫蘆畫瓢就行結(jié)果算出來的調(diào)度方案完全不合理。電和熱雖然都是能量物理屬性差異卻非常大建議所有復(fù)現(xiàn)的人先把這張差異表建在心里。屬性電力共享熱力共享時間尺度秒級到分鐘級平衡實時性極強(qiáng)小時級響應(yīng)熱慣性大短時可不嚴(yán)格平衡傳輸介質(zhì)聯(lián)絡(luò)線上的有功功率損耗按線路電阻計算熱水或蒸汽存在延時與散熱損耗沿程溫度下降主要約束聯(lián)絡(luò)線容量、功率平衡、機(jī)組爬坡熱網(wǎng)傳輸容量、節(jié)點溫度上下限、蓄熱罐容量與充放速率核心設(shè)備燃?xì)廨啓C(jī)、光伏、儲能電池?zé)犭娐?lián)產(chǎn)、電鍋爐、熱泵、蓄熱罐計量結(jié)算有功電能表計量按kWh結(jié)算按熱量kJ/GJ結(jié)算計量相對復(fù)雜電的物理特性是“瞬間平衡”發(fā)多少用多少波動要靠儲能和機(jī)組調(diào)節(jié)去扛熱的物理特性是“有慣性”供熱管道里的水本身就是儲能介質(zhì)允許運(yùn)行時段之間有熱量盈余和虧欠只要終端溫度不越界就行。這也是模型里為什么要把電和熱分兩層處理的原因電層優(yōu)化需要精細(xì)的功率平衡約束熱層優(yōu)化則要考慮熱慣性、散熱損耗和溫度約束兩套邏輯不能用一個方程糊弄過去。1.3 多個“老板”坐在同一張桌上更關(guān)鍵的是每個微網(wǎng)背后都是一個利益主體。A微網(wǎng)有余電憑什么低價賣給B微網(wǎng)C微網(wǎng)的燃?xì)廨啓C(jī)余熱可以供熱但D微網(wǎng)不想付錢誰強(qiáng)制得了在工程實際里這種多主體利益沖突非常普遍也正是純物理優(yōu)化模型難以解決的問題——因為物理優(yōu)化默認(rèn)“大家都聽調(diào)度中心的”。然而真實的多微網(wǎng)系統(tǒng)里只存在合作意向不存在統(tǒng)一命令。因此在復(fù)現(xiàn)這篇論文時模型做的最重要的一步就是把每個微網(wǎng)當(dāng)作一個獨立決策者讓它以自身運(yùn)行成本最小為目標(biāo)去決定共享多少電、共享多少熱、接受什么價格。于是問題從“如何一起最優(yōu)”變成了“如何各自最優(yōu)且能共存”這個轉(zhuǎn)換一旦想通后面看納什博弈就順理成章。2. 納什博弈為什么能治多主體協(xié)調(diào)的病2.1 先分清兩類問題集中優(yōu)化和分散博弈很多第一次接觸多微網(wǎng)課題的人第一反應(yīng)是用集中式優(yōu)化把所有微網(wǎng)的數(shù)據(jù)匯總到調(diào)度中心以全局成本最小為目標(biāo)一步求出最優(yōu)解。這種方法從數(shù)學(xué)上講最漂亮KKT條件一寫求解器一跑就有解。但它有一個致命前提所有微網(wǎng)愿意把內(nèi)部數(shù)據(jù)和決策權(quán)交給調(diào)度中心。我實際參與某多微網(wǎng)模擬項目時各運(yùn)營方的反饋很明確“我們自己的運(yùn)行數(shù)據(jù)可以報但最終運(yùn)行方案要我們自己定?!奔袃?yōu)化模型做得再準(zhǔn)落地時也走不通。于是有了博弈的思路。如果用生活場景打比方集中式優(yōu)化像一家人坐在一起由家長統(tǒng)一安排每個月怎么花錢目標(biāo)是全家總支出最小博弈則更像一群朋友AA聚餐每個人各自選自己想吃的菜最后大家會根據(jù)別人的選擇調(diào)整自己的點單最終達(dá)到一個“沒有誰愿意獨自換菜”的狀態(tài)。多微網(wǎng)電熱共享本質(zhì)上更像聚餐大家共享餐桌電網(wǎng)和熱網(wǎng)但誰都不愿意被指揮于是只能用博弈來協(xié)調(diào)。2.2 納什均衡的通俗解讀與限定條件納什均衡是博弈論里最核心的概念。它的定義表述很簡潔所有參與者都選定了自己的策略后任何一個人單方面改變策略都不能讓自己過得更好那么這個策略組合就是納什均衡。注意它不一定是所有人加起來最好的解也不一定是公平的解它只是穩(wěn)定的解——誰也沒有動機(jī)單獨偏離。我復(fù)現(xiàn)時一度困惑的問題是納什均衡和帕累托最優(yōu)到底什么關(guān)系后來想明白了。帕累托最優(yōu)關(guān)注整體效率存在一個方案讓所有人都比現(xiàn)狀更好納什均衡關(guān)注個體穩(wěn)定性每個人在現(xiàn)有牌局里都不愿意單獨換牌。兩者不一定重合經(jīng)典例子是“囚徒困境”納什均衡是兩人都坦白而整體最優(yōu)是兩人都沉默卻沒人敢先沉默。多微網(wǎng)系統(tǒng)里同樣可能出現(xiàn)“整體效益差一點但個體穩(wěn)定”的均衡結(jié)果這正是多主體自治必須付出的代價。論文要做的事情是通過設(shè)計共享價格機(jī)制和雙層結(jié)構(gòu)把納什均衡盡量推向更接近帕累托最優(yōu)的結(jié)果。在使用納什均衡之前必須確認(rèn)存在性。如果策略空間不連續(xù)、目標(biāo)函數(shù)非凸均衡可能根本不存在或者不唯一。好在多微網(wǎng)主體模型里目標(biāo)函數(shù)通常寫成二次成本函數(shù)約束是線性等式和不等式每個主體的可行域是非空緊集目標(biāo)函數(shù)又是嚴(yán)格凸的純策略納什均衡的存在性基本有保障。這也是整個Matlab復(fù)現(xiàn)能穩(wěn)健跑通的數(shù)學(xué)基礎(chǔ)——如果模型連均衡都不保證存在代碼里看到的只會是一堆不收斂的迭代日志。2.3 雙層結(jié)構(gòu)里上層和下層分別管什么標(biāo)題里的“雙層”是整個模型的骨架。我一開始把雙層理解成兩個優(yōu)化問題直接串聯(lián)結(jié)果完全不對。認(rèn)真推導(dǎo)迭代邏輯后才發(fā)現(xiàn)這實際上是“一個博弈在上層、多個優(yōu)化在下層”的嵌套結(jié)構(gòu)。上層處理的是共享策略每個微網(wǎng)主體通過申報自己的共享電力、共享熱力功率或者通過協(xié)商形成的交易價格和其他主體一起迭代直到收斂到納什均衡。下層處理的是主體內(nèi)部的能量管理在上層給定的共享功率或價格下每個微網(wǎng)單獨求解自己機(jī)組出力、儲能充放電、蓄熱罐充放熱的優(yōu)化問題得出自身的最優(yōu)響應(yīng)。上層每個主體的策略變化會影響下層的優(yōu)化結(jié)果而下層的優(yōu)化結(jié)果又會反過來影響上層的共享策略循環(huán)往復(fù)直到整個系統(tǒng)達(dá)到一個內(nèi)外一致的穩(wěn)定狀態(tài)。用代碼來理解就是外層while循環(huán)是博弈迭代內(nèi)層for循環(huán)依次求解每個主體的子優(yōu)化問題。如果論文的數(shù)學(xué)公式里目標(biāo)函數(shù)有兩個優(yōu)化層級相互嵌套那基本就是這種結(jié)構(gòu)。復(fù)現(xiàn)時要特別注意上下層的決策變量維度不同、量級不同迭代時的收斂判據(jù)要分別設(shè)置不能用同一個絕對容差去卡否則很容易因為某一層殘差波動大導(dǎo)致外層始終無法收斂。3. 拆解SCI復(fù)現(xiàn)中的數(shù)學(xué)模型3.1 主體模型運(yùn)行成本怎么構(gòu)成把概念理清后可以進(jìn)入數(shù)學(xué)表達(dá)。先說明每個主體在下層優(yōu)化問題里到底在最小化什么。一個典型微網(wǎng)主體的運(yùn)行成本由幾塊組成燃?xì)廨啓C(jī)的燃料成本通常寫成出力的一次或二次函數(shù)、從共享網(wǎng)絡(luò)購電或購熱的費用或售電售熱收入符號需要注意、儲能的運(yùn)行損耗成本、設(shè)備維護(hù)費用。目標(biāo)函數(shù)可以簡單歸納為主體運(yùn)行成本 本地發(fā)電供熱成本 向共享網(wǎng)絡(luò)購買電熱的費用 - 向共享網(wǎng)絡(luò)出售電熱的收益我復(fù)現(xiàn)時最常犯的錯誤是正負(fù)號。購電費用要寫進(jìn)目標(biāo)函數(shù)售電收益要從成本里減掉但如果該主體是多賣方它的售電收益對于系統(tǒng)整體來講其實是另一主體的成本所以博弈的目標(biāo)函數(shù)在不同文獻(xiàn)里有不同寫法。建議按“自身現(xiàn)金流出最小”來理解這樣正負(fù)號不容易寫錯。目標(biāo)函數(shù)一般寫成二次凸函數(shù)min f_i Σ_t (a_i·P_i^2(t) b_i·P_i(t) c_i) Σ_t (c_e_buy·P_buy(t) - c_e_sell·P_sell(t)) 熱力部分對應(yīng)項其中P_i是主體本地機(jī)組的電出力P_buy和P_sell是主體與共享網(wǎng)絡(luò)的電力交換量。熱力部分的成本同理可能包括燃?xì)廨啓C(jī)余熱回收成本、電鍋爐消耗的電費、蓄熱罐維護(hù)費用等。需要提醒的是二次項系數(shù)a_i非常重要它決定了目標(biāo)函數(shù)的凸性和迭代收斂特性復(fù)現(xiàn)時不要為了省事把它改成線性項。3.2 電熱耦合設(shè)備與共享網(wǎng)絡(luò)約束主體內(nèi)部的約束才是復(fù)現(xiàn)工作的主要工作量約束可以分為三類設(shè)備約束、能量平衡約束、共享網(wǎng)絡(luò)約束。先看設(shè)備約束。燃?xì)廨啓C(jī)有出力上下限和爬坡約束儲能電池有容量狀態(tài)遞推方程、充放電功率上限、SOC上下限電鍋爐有輸出熱功率上下限蓄熱罐有儲熱狀態(tài)遞推、充放熱速率限制。其中儲能和儲熱罐的時序耦合約束特別容易寫錯尤其是狀態(tài)遞推方程的時間步索引漏一項或者錯一位結(jié)果就會出現(xiàn)“能量憑空消失”的離奇現(xiàn)象。電熱耦合設(shè)備的約束是另一個重點。一臺CHP機(jī)組發(fā)電和產(chǎn)熱不是獨立的電出力和熱出力存在一個熱電比范圍寫成約束就是熱出力等于電出力乘以熱電比或者熱出力落在某個區(qū)間內(nèi)。電鍋爐則是把電能轉(zhuǎn)化為熱能轉(zhuǎn)化效率通常在0.9以上。這些設(shè)備的存在讓電層和熱層在物理上無法割裂這也是為什么模型要強(qiáng)調(diào)“電熱雙層共享”而不是單純的電共享或熱共享。共享網(wǎng)絡(luò)約束包括聯(lián)絡(luò)線傳輸功率上限、熱力管道傳輸容量、節(jié)點溫度約束、共享功率方向限制等。復(fù)現(xiàn)時建議把共享功率設(shè)成有符號變量正值表示輸入負(fù)值表示輸出。傳輸容量約束寫絕對值約束或者拆成兩個線性不等式。熱力網(wǎng)絡(luò)往往還要考慮散熱損耗用固定比例系數(shù)對傳輸熱量打折扣即可。3.3 從模型到均衡的求解條件有了目標(biāo)和約束每個主體的子問題就是一個凸二次規(guī)劃可以用KKT條件描述最優(yōu)性。整體怎么形成納什均衡通常的做法是構(gòu)造一個博弈迭代每個主體在其他主體策略固定時求出自己的最優(yōu)響應(yīng)所有主體同步更新策略重復(fù)迭代。當(dāng)所有主體的策略殘差都小于容差時認(rèn)為到達(dá)納什均衡。在寫代碼之前強(qiáng)烈建議先做一遍嚴(yán)格凸性檢查。每個主體的目標(biāo)函數(shù)必須是關(guān)于自己決策變量的嚴(yán)格凸函數(shù)否則子問題可能有多個最優(yōu)解最優(yōu)化響應(yīng)是一個集合迭代過程就會在兩個甚至多個解之間來回抖動永遠(yuǎn)達(dá)不到收斂。論文里往往會保證這一點但復(fù)現(xiàn)時如果自己調(diào)整了參數(shù)比如把成本系數(shù)改成線性甚至更簡單就很可能會破壞凸性??傊?dāng)?shù)學(xué)上先確認(rèn)存在性和凸性代碼才可能收斂別一上來就埋頭寫while循環(huán)。4. Matlab實現(xiàn)的關(guān)鍵路徑與核心代碼邏輯4.1 復(fù)現(xiàn)前先做的事參數(shù)整理與單位統(tǒng)一很多復(fù)現(xiàn)失敗不是算法問題而是單位問題。論文里電力單位用MW熱量單位可能用GJ/h儲能容量用MWh時間分辨率是1小時到你自己造數(shù)據(jù)的時候一個不留神就把熱量和電力數(shù)值直接相加了模型跑出的結(jié)果自然是錯的。每次復(fù)現(xiàn)新模型第一件事是把所有參數(shù)列一張表統(tǒng)一單位固定時間分辨率。下面是我復(fù)現(xiàn)這套模型時用過的參數(shù)清單僅供參考。參數(shù)類別示例參數(shù)單位電源光伏、燃?xì)廨啓C(jī)出力上限kW負(fù)荷電負(fù)荷、熱負(fù)荷時序kW / kWth儲能電池容量、最大充放電功率kWh / kW儲熱蓄熱罐容量、充放熱速率上限kWh / kW耦合設(shè)備CHP電出力上限、熱電比、電鍋爐電熱效率kW / - / -共享網(wǎng)絡(luò)聯(lián)絡(luò)線容量、熱網(wǎng)傳輸容量、熱損失系數(shù)kW / kW / -價格購電電價、售電電價、共享電價元/kWh單位統(tǒng)一后在Matlab里把所有已知量放在一個結(jié)構(gòu)體里比如params。我習(xí)慣寫成params.pv、params.load_e、params.load_h這樣清晰的名字后面每個子問題都從params取數(shù)避免在公式里硬編碼數(shù)字。這是看起來瑣碎但收益極大的習(xí)慣。4.2 主體優(yōu)化與博弈迭代的代碼框架模型主體部分的偽代碼大致是這個結(jié)構(gòu)% 初始化各主體的共享策略 strategy zeros(n_agent, T); price initial_price(T); % 初始共享價格 max_iter 200; tol 1e-4; for k 1:max_iter % 下層各主體獨立求解自身最優(yōu)響應(yīng) for i 1:n_agent % 固定其他主體策略構(gòu)建第 i 個主體的約束和目標(biāo) x_i solve_agent_problem(i, price, strategy); new_strategy(i, :) x_i.share_e x_i.share_h; end % 上層根據(jù)所有主體的響應(yīng)更新共享價格或策略 residual max(abs(new_strategy - strategy), [], all); strategy alpha * new_strategy (1 - alpha) * strategy; % 阻尼更新 price update_price(strategy, price); % 價格調(diào)整 fprintf(iter%d, residual%.6f\n, k, residual); if residual tol break; end end真實代碼里還需要在solve_agent_problem內(nèi)部處理儲能約束、熱網(wǎng)約束等一般用Matlab優(yōu)化工具箱的quadprog就能解。根據(jù)我的經(jīng)驗求解工具夠用就好先跑通小規(guī)模算例再考慮引入更復(fù)雜的建模層和外部求解器。內(nèi)層每個主體問題只涉及一個微網(wǎng)的時間序列變量規(guī)模不大quadprog的耗時完全可以接受。阻尼更新系數(shù)alpha是穩(wěn)定性的關(guān)鍵。我實測alpha取0.5到0.8之間比較穩(wěn)alpha等于1時如果初始解離均衡點遠(yuǎn)容易振蕩等于0.2時收斂很慢。迭代判據(jù)要分別看策略殘差和價格殘差最好同時打印出來肉眼觀察兩個量是在同步下降還是互相拉扯。4.3 三個必須做的正確性驗證代碼跑通不等于模型正確。論文復(fù)現(xiàn)最容易出現(xiàn)“算得出結(jié)果但結(jié)果是錯的”。我通常做三組驗證見下表。驗證場景做法預(yù)期現(xiàn)象單主體退化把所有微網(wǎng)數(shù)據(jù)合并成一個主體博弈結(jié)果與集中式優(yōu)化結(jié)果一致或誤差在可接受范圍無互濟(jì)場景把聯(lián)絡(luò)線容量設(shè)為0、熱網(wǎng)解列各主體的調(diào)度結(jié)果應(yīng)等于各自獨立運(yùn)行的本地優(yōu)化結(jié)果極端負(fù)荷場景隨機(jī)生成100組負(fù)荷曲線跑敏感性分析均衡解落在合理范圍不出現(xiàn)功率越限或能量憑空消失第一組驗證尤其重要。如果多主體博弈代碼在最簡單的單主體情況下都不能和常規(guī)優(yōu)化對齊說明求解邏輯一定有bug如果兩組對齊了至少說明代碼的底層正確性有保障。第二組驗證用來檢查共享模塊有沒有引入不必要的耦合第三組用來檢查魯棒性。這三組驗證做完我才會拿代碼去復(fù)現(xiàn)論文里的圖表不然方向錯了后邊全是白費。有一個小細(xì)節(jié)值得提在單主體退化驗證時共享價格的初值并不會影響最終解因為此時所有物理量都在同一個主體內(nèi)部價格只是內(nèi)部記賬如果這個場景下價格還影響解說明目標(biāo)函數(shù)正負(fù)號或約束耦合寫錯了。5. 復(fù)現(xiàn)途中踩過的坑與排除過程5.1 迭代不收斂罰參數(shù)不是越大越好第一次跑博弈迭代時我的收斂曲線像心電圖殘差在第一輪下降后就開始來回跳。檢查了約束和初值都沒發(fā)現(xiàn)問題后來逐行分析外層循環(huán)才發(fā)現(xiàn)我在共享功率更新時引入了罰項想讓各主體的共享策略被“釘”在目標(biāo)值附近。罰參數(shù)取得很大本意是想讓策略不敢跑偏結(jié)果適得其反罰項過大主體每一步都過度反應(yīng)策略在下一次迭代時沖過頭形成持續(xù)振蕩。這就像彈簧兩端掛重物剛掛上去時彈性系數(shù)太大稍微動一下就來回彈。解決辦法是把罰參數(shù)調(diào)小并配合阻尼更新。我的經(jīng)驗是先用無罰項的版本跑通確認(rèn)迭代本身能收斂再加罰項加罰項后參數(shù)從一個較小值開始往上調(diào)觀察收斂速度和穩(wěn)態(tài)殘差找到一個讓迭代既快又不振蕩的區(qū)間。這個“先裸跑再加約束”的思路對幾乎所有分布式算法調(diào)試都適用。5.2 熱力約束的非凸性質(zhì)如何繞開熱電聯(lián)產(chǎn)設(shè)備和熱網(wǎng)約束帶進(jìn)來之后模型不再天然是凸的。典型麻煩來自兩類約束熱網(wǎng)管道中的流量乘以溫度形成的雙線性項以及某些CHP機(jī)組的熱電比可變區(qū)間在x-y平面上并非凸集。如果直接把這類約束寫進(jìn)優(yōu)化問題quadprog會直接報錯被迫回退到窮舉或啟發(fā)式算法收斂質(zhì)量難以保證。論文里通常有化簡前提比如假設(shè)熱水流量恒定、只控制供回水溫度或把熱網(wǎng)模型簡化為帶損耗系數(shù)的熱量傳輸。復(fù)現(xiàn)時建議嚴(yán)格遵照論文的簡化假設(shè)不要另起爐灶追求更精細(xì)的熱網(wǎng)模型。那些模型當(dāng)然更準(zhǔn)確但會破壞原有的凸性導(dǎo)致根本復(fù)現(xiàn)不出論文的數(shù)值結(jié)論。真正需要精細(xì)熱網(wǎng)模型時得換技術(shù)路線比如分解成兩個交替迭代的子問題每輪固定一側(cè)變量。5.3 初值選擇的經(jīng)驗法則與敏感性分析初值對博弈迭代的影響比想象中大得多。同一個模型初值不同最終可能跑到不同的均衡點遇到非嚴(yán)格凸的目標(biāo)函數(shù)時這種情況尤其常見。我第一次復(fù)現(xiàn)時直接在隨機(jī)初始策略下跑結(jié)果和論文里給出的均衡差異很大一度懷疑代碼寫錯。后來做敏感性分析才知道問題出在多均衡上不同初值落入了不同的均衡點。大多數(shù)論文會明確或暗示地給出均衡唯一性條件但復(fù)現(xiàn)時參數(shù)一改動條件可能被破壞。我的建議是先固定一組符合論文參數(shù)的初值跑出穩(wěn)定結(jié)果然后把初值在可行域內(nèi)隨機(jī)擾動幾百次統(tǒng)計均衡策略分布的離散程度。如果結(jié)果很集中說明均衡穩(wěn)定如果結(jié)果很分散就要檢查是否是目標(biāo)函數(shù)凸性出了問題或者模型存在多均衡。實際工程里也可以用“前一天的最優(yōu)解作為今天迭代初值”這種思路讓算法在時間序列上有連續(xù)性比每次從零開始隨機(jī)初值有效得多。還有一個經(jīng)驗是要把熱層和電層的迭代初值分開設(shè)置。由于電層響應(yīng)快、熱層響應(yīng)慢合并設(shè)置會讓熱層拖慢電層收斂單獨給熱層一個相對保守的初值再讓電層先跑幾輪整體收斂速度會明顯提升。這個細(xì)節(jié)論文里不會寫只有自己跑迭代才會發(fā)現(xiàn)。最后談一點復(fù)現(xiàn)這套模型后的實際感觸。論文里的雙層博弈模型看著公式復(fù)雜落到代碼上其實可以拆成很多個小而清晰的部分?jǐn)?shù)據(jù)結(jié)構(gòu)、參數(shù)表、每個主體的quadprog、外層迭代循環(huán)、結(jié)果可視化。我復(fù)現(xiàn)之前習(xí)慣先把論文公式抄一遍再寫代碼后來發(fā)現(xiàn)更高效的做法是先拿數(shù)據(jù)試算一個小例子哪怕只用兩個微網(wǎng)兩個時段的簡化版本把模型的手算結(jié)果和代碼輸出對上再擴(kuò)展到全規(guī)模。這樣能最快找出正負(fù)號、索引和單位的問題。如果你也在復(fù)現(xiàn)類似的多主體博弈論文建議從最小可運(yùn)行樣例出發(fā)逐步加約束、加主體、加時段每一步都有驗證點最后再和論文圖表對比。這個過程雖然慢但每次報錯都會有收獲等全套代碼跑通你對模型的理解深度遠(yuǎn)超過只看論文的層次。還想再提醒一句多微網(wǎng)博弈的初始條件、罰參數(shù)、迭代容差這些“工程味”很重的細(xì)節(jié)往往是復(fù)現(xiàn)出與論文一致結(jié)果的關(guān)鍵。論文里的框架是地圖這些細(xì)節(jié)才是導(dǎo)航。