域點(diǎn)對(duì)點(diǎn)能源共享與消納優(yōu)化復(fù)現(xiàn))
簡(jiǎn)介面向電力系統(tǒng)研究者與智能電網(wǎng)工程師這份資料完整復(fù)現(xiàn)了基于雙層演化博弈模型的多區(qū)域點(diǎn)對(duì)點(diǎn)P2P能源共享機(jī)制旨在解決分布式能源DERs高滲透率下配電網(wǎng)的能源共享難題。資源為單個(gè)PDF文檔約908KB內(nèi)含可運(yùn)行Python代碼及逐步解釋覆蓋Newman快速算法區(qū)域劃分、基于供需比的區(qū)域價(jià)格機(jī)制、買賣雙方雙層演化博弈模型構(gòu)建以及IEEE33節(jié)點(diǎn)系統(tǒng)驗(yàn)證流程。已有92人學(xué)習(xí)該內(nèi)容適合需要開(kāi)展相關(guān)仿真或理解博弈論應(yīng)用的讀者。通過(guò)代碼與講解讀者可掌握跨區(qū)交易費(fèi)用和節(jié)點(diǎn)電價(jià)調(diào)控的計(jì)算方法深入理解區(qū)域間功率優(yōu)化與本地消納率提升的實(shí)現(xiàn)路徑并能夠結(jié)合性能指標(biāo)評(píng)估機(jī)制在改善電壓偏差、增加產(chǎn)消者剩余等方面的效果。1. 為什么“多裝儲(chǔ)能”反而加劇了區(qū)域間功率阻塞雙層演化博弈模型要解決的就是這個(gè)做過(guò)新能源消納調(diào)度的人應(yīng)該都有過(guò)這種體驗(yàn)?zāi)硞€(gè)區(qū)域?yàn)榱藘?nèi)部達(dá)標(biāo)拼命上光伏和儲(chǔ)能結(jié)果外送聯(lián)絡(luò)線在午間被堵得死死的另一個(gè)區(qū)域卻在同時(shí)段高價(jià)購(gòu)電。單層優(yōu)化模型在這里會(huì)出現(xiàn)一個(gè)繞不開(kāi)的死結(jié)——它試圖用一個(gè)“上帝視角”的總目標(biāo)去命令所有區(qū)域但現(xiàn)實(shí)中每個(gè)區(qū)域都是有獨(dú)立利益訴求的運(yùn)營(yíng)主體陽(yáng)奉陰違的結(jié)果就是全局指標(biāo)更差。這也是為什么多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制不能靠傳統(tǒng)集中式優(yōu)化硬推得靠博弈論來(lái)處理利益沖突。本文圍繞“雙層演化博弈模型”展開(kāi)論文復(fù)現(xiàn)全流程把上層如何做區(qū)域間功率優(yōu)化、下層如何用演化博弈機(jī)制驅(qū)動(dòng)多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享、最終提升分布式能源消納的完整代碼和參數(shù)逐行拆開(kāi)講。適合正在做分布式能源調(diào)度、微電網(wǎng)群協(xié)同控制或電網(wǎng)側(cè)“源網(wǎng)荷儲(chǔ)”互動(dòng)的工程師和研究生對(duì)照代碼就能把復(fù)現(xiàn)落地而不是停留在論文公式里。2. 雙層演化博弈模型的理論地基為什么上層定規(guī)則、下層定策略能解決利益沖突2.1 單層集中式優(yōu)化為什么在“跨區(qū)域”場(chǎng)景下會(huì)失真先做一個(gè)思想實(shí)驗(yàn)。假設(shè)三個(gè)區(qū)域各自有分布式光伏和負(fù)荷集中式優(yōu)化器會(huì)把三個(gè)區(qū)域合并成一個(gè)大電網(wǎng)直接以全網(wǎng)總成本最小為目標(biāo)求解放電計(jì)劃。結(jié)果會(huì)怎樣第一個(gè)區(qū)域發(fā)電成本低第二個(gè)區(qū)域負(fù)荷大第三個(gè)區(qū)域電價(jià)高那么優(yōu)化器會(huì)拼命讓第一個(gè)區(qū)域往外送電第三個(gè)區(qū)域往里買電。這看起來(lái)很完美可實(shí)際執(zhí)行時(shí)第三個(gè)區(qū)域的運(yùn)營(yíng)商會(huì)發(fā)現(xiàn)自己明明可以壓低本地光伏出力來(lái)買更便宜的外區(qū)電從而減少本地設(shè)備的折舊和維護(hù)成本——于是它不會(huì)執(zhí)行集中式優(yōu)化給它下達(dá)的出力指令。這種“表面協(xié)同、實(shí)際博弈”的現(xiàn)象在電力市場(chǎng)化和多主體參與程度越來(lái)越高的今天非常常見(jiàn)。單層優(yōu)化模型在數(shù)學(xué)上是干凈的但它假設(shè)所有主體都服從指令這在跨區(qū)域、跨利益主體的場(chǎng)景中不成立。而雙層演化博弈模型天然把系統(tǒng)拆成兩層上層是系統(tǒng)調(diào)度者負(fù)責(zé)定電價(jià)信號(hào)和區(qū)域間功率傳輸約束下層是各個(gè)區(qū)域的獨(dú)立決策者根據(jù)電價(jià)和自身收益選擇共享策略。下層之間互相觀察、模仿和調(diào)整最終收斂到演化穩(wěn)定策略——這套邏輯本質(zhì)上是在模擬真實(shí)市場(chǎng)里的行為演化。2.2 演化博弈的復(fù)制者動(dòng)態(tài)方程與策略更新迭代演化博弈的核心不是求一次性最優(yōu)解而是模擬群體中策略頻率的動(dòng)態(tài)變化。在分布式能源共享場(chǎng)景中每個(gè)區(qū)域會(huì)選擇一個(gè)“共享意愿系數(shù)” (x_i \in [0,1])表示它愿意參與點(diǎn)對(duì)點(diǎn)能源共享的程度。收益函數(shù) (f_i(x_i, \mathbf{x}{-i})) 由共享收益、本地消納收益和外購(gòu)電成本三部分構(gòu)成。群體平均收益為 (\bar{f} \frac{1}{N} \sum{i1}^{N} f_i)那么復(fù)制者動(dòng)態(tài)方程寫(xiě)作[ \dot{x}_i x_i (f_i - \bar{f}) ]這個(gè)方程的含義非常直觀如果區(qū)域 i 當(dāng)前策略帶來(lái)的收益高于群體平均水平它的策略頻率就會(huì)上升即它會(huì)更“自信”地保持甚至加大共享意愿如果低于平均水平它就會(huì)在下一輪模擬中降低共享意愿。因?yàn)槲覀冏龅氖请x散時(shí)間仿真所以迭代更新公式寫(xiě)成[ x_i^{(t1)} x_i^{(t)} \alpha \cdot x_i^{(t)} (f_i^{(t)} - \bar{f}^{(t)}) ]其中 (\alpha) 是策略學(xué)習(xí)步長(zhǎng)取值太大會(huì)導(dǎo)致振蕩太小收斂太慢。我一般取 0.05 到 0.15 之間具體會(huì)在第 5 章的避坑部分分析它對(duì)收斂性的影響。這里要特別注意一個(gè)概念區(qū)分復(fù)制者動(dòng)態(tài)描述的是“高頻反復(fù)博弈”下的長(zhǎng)期趨勢(shì)它假設(shè)的是有限理性而非完全理性。完全理性的均衡是納什均衡而演化均衡是演化穩(wěn)定策略ESS前者要求對(duì)方策略絕對(duì)不變后者只要求在微小擾動(dòng)下策略能回歸。論文復(fù)現(xiàn)時(shí)如果不理解這個(gè)差別往往會(huì)在圖解中畫(huà)出錯(cuò)誤的均衡點(diǎn)。2.3 上下層迭代交互的變量傳遞關(guān)系雙層博弈模型之所以“能跑起來(lái)”核心在于上下層變量的傳遞。我在復(fù)現(xiàn)時(shí)把上層建模為一個(gè)約束優(yōu)化問(wèn)題下層建模為一個(gè)演化博弈迭代。上層調(diào)度器先根據(jù)當(dāng)前各區(qū)域的共享策略 (x_i^{(t)}) 計(jì)算出區(qū)域間聯(lián)絡(luò)線功率 (P_{ij}^{(t)}) 和內(nèi)部節(jié)點(diǎn)電價(jià) (\lambda^{(t)})然后把電價(jià)和聯(lián)絡(luò)線功率作為輸入傳給下層下層每個(gè)區(qū)域根據(jù)收到的電價(jià)更新自己的共享意愿 (x_i^{(t1)})再回傳給上層進(jìn)行下一輪計(jì)算。這樣外層循環(huán)反復(fù)迭代直到滿足收斂條件連續(xù)三輪的策略變化量小于閾值 (\epsilon 10^{-4})或者達(dá)到最大迭代輪數(shù)我通常設(shè) 200 輪上限。這個(gè)結(jié)構(gòu)看起來(lái)簡(jiǎn)單真正實(shí)現(xiàn)的時(shí)候有一個(gè)非常隱蔽的坑上層優(yōu)化器和下層演化博弈的迭代頻率不同步。如果上層每次都把優(yōu)化求解收斂到極緊的精度而下層策略還在劇烈變化整體迭代會(huì)因?yàn)椤吧蠈舆^(guò)度敏感”而反復(fù)振蕩。后面第 5 章會(huì)給出我踩過(guò)的具體現(xiàn)象和解決辦法。3. 上層模型構(gòu)建區(qū)域間功率優(yōu)化的目標(biāo)函數(shù)與約束條件代碼實(shí)現(xiàn)3.1 典型的區(qū)域間功率優(yōu)化模型構(gòu)成上層模型的目標(biāo)是實(shí)現(xiàn)區(qū)域間功率優(yōu)化同時(shí)保證分布式能源不被大量棄用。目標(biāo)函數(shù)包括運(yùn)行成本、棄風(fēng)棄光懲罰、區(qū)域間購(gòu)電費(fèi)用三個(gè)部分。下面給出三個(gè)區(qū)域的標(biāo)準(zhǔn)數(shù)學(xué)形式[ \min ; C \sum_{t1}^{T} \sum_{i1}^{N} \left( a_i P_{Gi}^2 b_i P_{Gi} c_i \lambda^{pen}{i} \cdot (P{RE,avail} - P_{RE,used}) \right) \sum_{t1}^{T} \sum_{i eq j} c_{buy}^{ij} P_{ij} ]約束條件包括區(qū)域內(nèi)功率平衡、發(fā)電出力上下限、聯(lián)絡(luò)線傳輸容量限制、可再生能源出力上限。其中棄風(fēng)棄光懲罰系數(shù) (\lambda^{pen}) 是整篇復(fù)現(xiàn)最容易調(diào)崩的參數(shù)。取值太小模型會(huì)寧可棄掉可再生能源去買便宜火電取值太大目標(biāo)函數(shù)數(shù)值量級(jí)失衡導(dǎo)致優(yōu)化求解器報(bào)數(shù)值困難。我在復(fù)現(xiàn)中一般取單位電量成本的 1.52 倍。3.2 用 Python 和 scipy.optimize 構(gòu)建上層優(yōu)化核心代碼論文復(fù)現(xiàn)時(shí)我建議直接用 scipy 的 SLSQP 算法來(lái)實(shí)現(xiàn)上層優(yōu)化因?yàn)椴恍枰~外裝 Gurobi 或 Cplex且對(duì)中小規(guī)模問(wèn)題足夠用。下面給出可以完整跑通的上層代碼骨架import numpy as np from scipy.optimize import minimize # 區(qū)域數(shù)量 N_REGIONS 3 T 24 # 調(diào)度周期單位小時(shí) # 發(fā)電成本系數(shù) a, b, c (元/MW^2h, 元/MWh, 元/h) a np.array([0.024, 0.018, 0.030]) b np.array([20.0, 25.0, 18.0]) c np.array([50.0, 40.0, 60.0]) # 可再生能源預(yù)測(cè)出力上限 (MW) P_re_max np.array([ [120, 100, 80, 90, 110, 130], # 簡(jiǎn)化示例僅展示6個(gè)時(shí)段實(shí)際T為24 [80, 70, 60, 75, 85, 100], [100, 90, 110, 120, 130, 140] ]) # 負(fù)荷預(yù)測(cè) (MW) P_load np.array([ [100, 90, 85, 95, 105, 110], [120, 115, 110, 105, 100, 98], [80, 75, 90, 100, 120, 130] ]) # 棄風(fēng)棄光懲罰系數(shù) (元/MWh) lambda_pen 45.0 # 聯(lián)絡(luò)線最大傳輸容量 (MW) P_line_max 80.0 def objective(x, t): # x 是決策向量包含每個(gè)區(qū)域的發(fā)電出力、實(shí)際消納的可再生能源、節(jié)點(diǎn)購(gòu)電 P_G x[:N_REGIONS] P_RE x[N_REGIONS:2*N_REGIONS] P_import x[2*N_REGIONS:3*N_REGIONS] # 從其它區(qū)域凈購(gòu)入功率 # 發(fā)電成本 gen_cost np.sum(a * P_G**2 b * P_G c) # 棄可再生能源懲罰 curtail_penalty np.sum(lambda_pen * (P_re_max[:, t] - P_RE)) # 區(qū)域間購(gòu)電成本 (假設(shè)統(tǒng)一購(gòu)電價(jià)格) buy_cost 55.0 * np.sum(np.maximum(P_import, 0)) return gen_cost curtail_penalty buy_cost def power_balance_constraint(x, t): # 功率平衡出力消納凈輸入 負(fù)荷 P_G x[:N_REGIONS] P_RE x[N_REGIONS:2*N_REGIONS] P_import x[2*N_REGIONS:3*N_REGIONS] return P_G P_RE P_import - P_load[:, t] def line_capacity_lower(x): # 聯(lián)絡(luò)線功率下限 return x[2*N_REGIONS:3*N_REGIONS] P_line_max def line_capacity_upper(x): # 聯(lián)絡(luò)線功率上限 return P_line_max - x[2*N_REGIONS:3*N_REGIONS] # 逐時(shí)段優(yōu)化 for t in range(T): # 初始猜測(cè)稍微偏離零避免奇異 x0 np.ones(N_REGIONS * 3) * 10.0 bounds [(0, 200)] * N_REGIONS [(0, P_re_max[:, t])] [(-P_line_max, P_line_max)] constraints [ {type: eq, fun: lambda x: power_balance_constraint(x, t)}, {type: ineq, fun: lambda x: line_capacity_lower(x)}, {type: ineq, fun: lambda x: line_capacity_upper(x)} ] result minimize(objective, x0, args(t,), methodSLSQP, boundsbounds, constraintsconstraints) # 提取優(yōu)化結(jié)果 P_opt result.x # 記錄該時(shí)段的影子價(jià)格用于下層演化博弈的收益計(jì)算 # scipy沒(méi)有直接給出Lagrange乘子需要從約束松弛估計(jì)后面會(huì)聊這段代碼里最關(guān)鍵的兩個(gè)參數(shù)是lambda_pen棄能懲罰和P_line_max聯(lián)絡(luò)線容量。lambda_pen為什么不能拍腦袋取一個(gè)很大的值因?yàn)榱P函數(shù)法的本質(zhì)是在目標(biāo)函數(shù)里加了一個(gè)“軟約束”如果這個(gè)軟約束的系數(shù)比發(fā)電成本系數(shù)高兩個(gè)數(shù)量級(jí)優(yōu)化器會(huì)把大量權(quán)重放在減少棄能上而忽略機(jī)組爬坡、經(jīng)濟(jì)調(diào)度等其它目標(biāo)導(dǎo)致整體的成本失真。我建議用以下公式做預(yù)標(biāo)定lambda_pen 1.8 * max(b)這樣在量級(jí)上天然匹配。另一個(gè)注意點(diǎn)是bounds的寫(xiě)法[(0, P_re_max[:, t])]在 Python 里是一個(gè)包含數(shù)組的元組實(shí)際運(yùn)行時(shí)需要展開(kāi)成每個(gè)區(qū)域一個(gè)邊界正確的寫(xiě)法應(yīng)該是list(zip(np.zeros(N_REGIONS), P_re_max[:, t]))。這種小 bug 在論文復(fù)現(xiàn)時(shí)特別容易消耗一兩個(gè)小時(shí)下文避坑章節(jié)會(huì)專門(mén)提出來(lái)。3.3 為什么上層優(yōu)化結(jié)果要提供“影子價(jià)格”而不是直接提供功率指令影子價(jià)格是雙層模型里上下層之間關(guān)鍵的“貨幣”。在 SLSQP 求解完成后可以通過(guò)拉格朗日乘子獲取但 scipy 的 minimize 返回對(duì)象不直接暴露乘子需要在求解后額外調(diào)用scipy.optimize.Lagrange或者用有限差分法近似。我一般會(huì)用一個(gè)小 trick把功率平衡約束的右側(cè)值加一個(gè)微小擾動(dòng)比如 0.01MW重新求解目標(biāo)函數(shù)看目標(biāo)函數(shù)的變化量這個(gè)差值近似就是該時(shí)段的節(jié)點(diǎn)電價(jià)。這個(gè)電價(jià)的含義是在該區(qū)域增加 1MWh 負(fù)荷的邊際成本。下層博弈中每個(gè)區(qū)域的收益函數(shù)直接由共享電價(jià)結(jié)算所以如果上層不給電價(jià)而給硬性功率指令下層演化博弈就失去了“基于收益調(diào)整策略”的驅(qū)動(dòng)力。很多復(fù)現(xiàn)失敗的項(xiàng)目問(wèn)題就出在這里——上層輸出的不是價(jià)格信號(hào)而是功率值導(dǎo)致下層博弈完全失效。4. 下層模型與完整迭代多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制與演化博弈求解器4.1 多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制的收益函數(shù)建模在多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制中每個(gè)區(qū)域不僅是購(gòu)電方也可能是售電方。機(jī)制的核心在于區(qū)域 i 和區(qū)域 j 之間直接進(jìn)行點(diǎn)對(duì)點(diǎn)交易而不經(jīng)過(guò)統(tǒng)一調(diào)度中心價(jià)格由雙方博弈決定。為了簡(jiǎn)化計(jì)算大多數(shù)論文復(fù)現(xiàn)會(huì)把 P2P 交易價(jià)格統(tǒng)一為輸出層影子價(jià)格的加權(quán)平均而各個(gè)區(qū)域通過(guò)調(diào)整共享意愿 (x_i) 來(lái)決定自己實(shí)際參與交易的份額。收益函數(shù)我建模如下[ f_i \pi_{p2p} \cdot P_{sell,i} - \pi_{buy} \cdot P_{buy,i} \lambda^{grid}{i} (P{load,i} - P_{RE,i}) ]其中 (P_{sell,i}) 是出口到共享池的電量(P_{buy,i}) 是從共享池購(gòu)入的電量(\pi_{p2p}) 是共享電價(jià)由上層迭代更新(\lambda^{grid}_{i}) 是區(qū)域內(nèi)部不參與共享時(shí)從主網(wǎng)購(gòu)電的零售電價(jià)。這個(gè)函數(shù)的建模關(guān)系到演化博弈收斂后是“全力共享”還是“各自為政”的兩種極端均衡。4.2 演化博弈求解器的核心代碼實(shí)現(xiàn)下面這段代碼實(shí)現(xiàn)演化博弈的復(fù)制者動(dòng)態(tài)更新是整個(gè)復(fù)現(xiàn)項(xiàng)目里最核心的模塊。它接收上一輪各區(qū)域的共享意愿、收益值并輸出下一輪更新后的共享意愿import numpy as np def evolutionary_game_update(sharing_intention, fitness, alpha0.08, mutation_prob0.01): 基于復(fù)制者動(dòng)態(tài)方程更新各區(qū)域的共享意愿 :param sharing_intention: 當(dāng)前各區(qū)域的共享意愿向量, 形狀 (N_REGIONS,) :param fitness: 各區(qū)域當(dāng)前策略下的收益向量, 形狀 (N_REGIONS,) :param alpha: 學(xué)習(xí)步長(zhǎng), 建議取值 0.05 ~ 0.15 :param mutation_prob: 變異概率用于模擬有限理性中的探索行為 :return: 更新后的共享意愿向量 N len(sharing_intention) avg_fitness np.mean(fitness) # 復(fù)制者動(dòng)態(tài)核心公式x_i_new x_i alpha * x_i * (f_i - avg_f) delta alpha * sharing_intention * (fitness - avg_fitness) new_intention sharing_intention delta # 邊界裁剪確保策略值在 [0, 1] 區(qū)間 new_intention np.clip(new_intention, 0.0, 1.0) # 變異項(xiàng)避免過(guò)早收斂到純策略模擬現(xiàn)實(shí)中區(qū)域運(yùn)營(yíng)者的試驗(yàn)行為 random_mask np.random.rand(N) mutation_prob if np.any(random_mask): new_intention[random_mask] np.random.rand(np.sum(random_mask)) return new_intention # 初始化共享意愿 np.random.seed(42) sharing_intention np.random.rand(3) # 模擬一輪收益計(jì)算簡(jiǎn)化示例 fitness_vals np.array([120.5, 95.3, 110.2]) # 執(zhí)行一次更新 updated_intention evolutionary_game_update(sharing_intention, fitness_vals, alpha0.1, mutation_prob0.01) print(更新后的共享意愿:, updated_intention)這段代碼里有幾個(gè)參數(shù)需要說(shuō)明。alpha是學(xué)習(xí)步長(zhǎng)我給出 0.050.15 的范圍實(shí)際調(diào)試中如果發(fā)現(xiàn)目標(biāo)函數(shù)呈鋸齒狀振蕩優(yōu)先把a(bǔ)lpha往小調(diào)而不是改收斂判據(jù)。mutation_prob是變異概率很多人會(huì)忽略這一項(xiàng)導(dǎo)致復(fù)現(xiàn)結(jié)果過(guò)于“極端”——所有區(qū)域都收斂到同一個(gè)策略這與實(shí)際市場(chǎng)行為不符。引入隨機(jī)探索項(xiàng)后系統(tǒng)能穩(wěn)定在一個(gè)混合策略的演化均衡更接近真實(shí)情況里的“有限理性”。4.3 雙層迭代主循環(huán)如何把上層優(yōu)化和下層博弈串成完整閉環(huán)完整復(fù)現(xiàn)不能只把兩段代碼單獨(dú)跑通更需要控制它們之間的交互邏輯。下面的主循環(huán)展示了完整的多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制迭代過(guò)程max_iter 200 convergence_threshold 1e-4 sharing_intention np.random.rand(N_REGIONS) for iteration in range(max_iter): # 記錄上一輪策略用于收斂判斷 prev_intention sharing_intention.copy() # 上層優(yōu)化根據(jù)當(dāng)前共享意愿修正各區(qū)域負(fù)荷曲線 # 共享意愿高的區(qū)域其可外送功率更大負(fù)荷經(jīng)過(guò)共享池調(diào)劑后減小 adjusted_load P_load - np.outer(sharing_intention, np.ones(T)) * (P_load - np.outer(sharing_intention * 0.5, np.ones(T))) # 注意上面的負(fù)荷修正是簡(jiǎn)化的示意實(shí)際應(yīng)從上層優(yōu)化結(jié)果中取節(jié)點(diǎn)電價(jià)和聯(lián)絡(luò)線功率 # 執(zhí)行上層優(yōu)化見(jiàn)第3章節(jié)的scipy代碼 optimized_result run_upper_optimization(adjusted_load) # 從上層優(yōu)化結(jié)果中提取影子價(jià)格 - 作為下層博弈的收益輸入 shadow_price extract_shadow_price(optimized_result) # 計(jì)算各區(qū)域收益 fitness calculate_fitness(shadow_price, sharing_intention) # 下層演化博弈更新 sharing_intention evolutionary_game_update(sharing_intention, fitness) # 收斂判斷連續(xù)三輪策略變化量小于閾值 delta np.max(np.abs(sharing_intention - prev_intention)) if delta convergence_threshold: print(f第 {iteration} 輪收斂策略變化量: {delta}) break # 最終輸出最優(yōu)共享意愿和區(qū)域間功率分配方案 print(最終共享意愿:, sharing_intention)主循環(huán)的迭代邏輯看上去簡(jiǎn)單但我要特別提醒一個(gè)細(xì)節(jié)上層優(yōu)化的頻率應(yīng)當(dāng)?shù)陀谙聦硬┺母碌念l率。也就是說(shuō)每更新一次上層方案下層要跑 1020 輪演化博弈讓策略先在這段固定電價(jià)下初步收斂再回傳給上層。這樣做的原因是上層電價(jià)變化過(guò)快時(shí)下層博弈永遠(yuǎn)在追一個(gè)移動(dòng)的目標(biāo)很難進(jìn)入穩(wěn)定狀態(tài)最終導(dǎo)致雙層迭代在 200 輪內(nèi)無(wú)法收斂。調(diào)整這個(gè)頻率比把a(bǔ)lpha調(diào)小更有效也是我復(fù)現(xiàn)這類論文最實(shí)用的經(jīng)驗(yàn)。5. 論文復(fù)現(xiàn)避坑指南雙層演化博弈模型最容易翻車的 4 個(gè)地方5.1 雙層迭代不收斂目標(biāo)函數(shù)在相鄰輪次間劇烈振蕩現(xiàn)象運(yùn)行主循環(huán)時(shí)上層目標(biāo)函數(shù)值不下降而是在某個(gè)區(qū)間來(lái)回跳甚至越跳越高200 輪耗盡也不滿足收斂判據(jù)。原因上層電價(jià)的更新速度遠(yuǎn)快于下層博弈的收斂速度。上層每輪都重新求解導(dǎo)致下層博弈始終面對(duì)一個(gè)“移動(dòng)靶心”復(fù)制者動(dòng)態(tài)無(wú)法收斂到穩(wěn)定策略。另一個(gè)次要原因是alpha學(xué)習(xí)步長(zhǎng)取值過(guò)大導(dǎo)致策略更新跨越了穩(wěn)定點(diǎn)。解決第一在主循環(huán)內(nèi)增加內(nèi)層博弈循環(huán)讓下層在固定電價(jià)下先跑 20 輪演化博弈第二將alpha從 0.15 下調(diào)到 0.05 左右第三對(duì)上層輸出電價(jià)做一階低通濾波每次取的電價(jià)是上輪電價(jià)和本輪優(yōu)化電價(jià)的加權(quán)平均系數(shù)取 0.5 左右能有效抑制振蕩。5.2 演化博弈結(jié)果全部收斂到邊界值 0 或 1結(jié)果過(guò)于極端現(xiàn)象算法運(yùn)行結(jié)束后所有區(qū)域的共享意愿都等于 0 或 1呈現(xiàn)“全有或全無(wú)”的局面與論文給出的混合策略均衡結(jié)果完全對(duì)不上。原因純復(fù)制者動(dòng)態(tài)方程在收益矩陣呈線性結(jié)構(gòu)時(shí)往往會(huì)讓群體收斂到純策略邊界這是數(shù)學(xué)上可以證明的性質(zhì)。真實(shí)市場(chǎng)中的有限理性通過(guò)“試探”、“犯錯(cuò)”來(lái)打破這種絕對(duì)化而代碼里缺失了變異項(xiàng)。解決在evolutionary_game_update中加入變異概率項(xiàng)mutation_prob每次更新時(shí)以 1% 左右的概率隨機(jī)重置某個(gè)區(qū)域的策略模擬現(xiàn)實(shí)中運(yùn)營(yíng)商的隨機(jī)試驗(yàn)行為。加了變異項(xiàng)后系統(tǒng)會(huì)收斂到一個(gè)內(nèi)部均衡點(diǎn)而不是邊界點(diǎn)結(jié)果也會(huì)更貼近真實(shí)調(diào)度場(chǎng)景。5.3 聯(lián)絡(luò)線功率越限但約束條件明明已經(jīng)寫(xiě)進(jìn)去了現(xiàn)象上層優(yōu)化完成后檢查結(jié)果發(fā)現(xiàn)某條聯(lián)絡(luò)線功率超過(guò)了P_line_max而且沒(méi)有再報(bào)約束違背錯(cuò)誤。原因這是雙層迭代中影子價(jià)格傳遞不當(dāng)導(dǎo)致的。上層優(yōu)化器約束確實(shí)保證了此輪松弛變量下的聯(lián)絡(luò)線不越限但在下層博弈調(diào)整共享意愿后整個(gè)共享功率分配發(fā)生偏移上層沒(méi)有重新求解就把功率傳給了下層導(dǎo)致實(shí)際執(zhí)行的聯(lián)絡(luò)線功率越限。解決需要在主循環(huán)里增加一個(gè)“執(zhí)行前校驗(yàn)”步驟用最終策略重新跑一次上層優(yōu)化強(qiáng)制把聯(lián)絡(luò)線越限的量削減到 0并把這個(gè)削減量作為懲罰項(xiàng)計(jì)入收益函數(shù)。也就是永遠(yuǎn)不要直接信任上一輪的上層優(yōu)化結(jié)論每當(dāng)策略變化超過(guò)閾值就要重新評(píng)估約束。5.4 所有量綱混用造成目標(biāo)函數(shù)中各項(xiàng)數(shù)量級(jí)差 1000 倍以上現(xiàn)象代碼跑出的結(jié)果雖然數(shù)值上“收斂”了但分析解后發(fā)現(xiàn)功率數(shù)值、電價(jià)數(shù)值全都偏離常識(shí)范圍例如某區(qū)域的外送功率高達(dá)幾十萬(wàn) MW。原因論文里公式推導(dǎo)時(shí)用的是標(biāo)幺值pu而你自己寫(xiě)代碼時(shí)用了有名值MW但在成本計(jì)算和約束方程中又把兩者直接混算。有名值的數(shù)值通常很大比如 100MW乘以成本系數(shù)后數(shù)量級(jí)可能在 10^4而棄風(fēng)懲罰可能只有 10 左右優(yōu)化器會(huì)把所有權(quán)重壓到懲罰項(xiàng)導(dǎo)致極度不均衡。解決我在復(fù)現(xiàn)時(shí)統(tǒng)一采用“兆瓦元”的有名值并對(duì)所有系數(shù)進(jìn)行預(yù)標(biāo)定確保目標(biāo)函數(shù)中每項(xiàng)數(shù)量級(jí)控制在 10^210^4 之間。尤其是棄風(fēng)懲罰系數(shù)不要取 10 萬(wàn)這種量級(jí)盡量從相鄰的燃料成本推導(dǎo)出來(lái)而不是憑空設(shè)定。如果硬要用標(biāo)幺值必須把所有功率的基準(zhǔn)值取同一個(gè) S_base并在提取結(jié)果時(shí)反變換回有名值存盤(pán)。6. 驗(yàn)證與進(jìn)階調(diào)參如何用“擾動(dòng)回落法”檢驗(yàn)?zāi)愕牟┺木馐遣皇钦娴姆€(wěn)最后一章分享一個(gè)我習(xí)慣用的驗(yàn)證技巧。論文復(fù)現(xiàn)做完之后最大的疑問(wèn)永遠(yuǎn)是“我的結(jié)果到底靠不靠譜”。純看目標(biāo)函數(shù)收斂曲線是不夠的因?yàn)榫植孔顑?yōu)也會(huì)收斂。我常用的驗(yàn)證方法是“擾動(dòng)回落測(cè)試”在得到最終均衡策略后人為把某個(gè)區(qū)域的策略強(qiáng)行拉到 0.5 或 0.9然后重新跑下層演化博弈迭代 50 輪觀察它是否能自動(dòng)回落到原始均衡點(diǎn)附近。如果能回落說(shuō)明這是一個(gè)演化穩(wěn)定策略即具備抗入侵能力如果它漂移到另一個(gè)完全不同的值說(shuō)明這個(gè)均衡點(diǎn)本質(zhì)上不穩(wěn)定你的參數(shù)設(shè)置有問(wèn)題。具體實(shí)現(xiàn)很簡(jiǎn)單# 假設(shè)均衡策略保存為 eq_intention eq_intention np.array([0.85, 0.62, 0.31]) # 人為擾動(dòng)第一個(gè)區(qū)域 perturbed eq_intention.copy() perturbed[0] 0.5 # 重新運(yùn)行50輪下層博弈 for step in range(50): fitness calculate_fitness(shadow_price_at_eq, perturbed) perturbed evolutionary_game_update(perturbed, fitness, alpha0.05) # 檢查是否回到均衡 print(擾動(dòng)后策略:, perturbed) print(原均衡策略:, eq_intention) assert np.max(np.abs(perturbed - eq_intention)) 0.05, 均衡不穩(wěn)定這個(gè)方法能幫你區(qū)分“數(shù)學(xué)上收斂”和“在實(shí)際市場(chǎng)中能穩(wěn)定存在”兩種狀態(tài)也是論文審稿人最喜歡刁難的問(wèn)題。對(duì)于參數(shù)調(diào)到什么樣的算完成我的標(biāo)準(zhǔn)是在 200 輪內(nèi)達(dá)到收斂閾值且擾動(dòng)回落測(cè)試通過(guò)同時(shí)區(qū)域間功率優(yōu)化結(jié)果不會(huì)出現(xiàn)大面積棄風(fēng)棄光棄能率控制在 5% 以內(nèi)就說(shuō)明這個(gè)方案具備實(shí)際投入?yún)⒖嫉膬r(jià)值。另外給一個(gè)提高迭代效率的小技巧在求解上層 SLSQP 時(shí)可以把上一時(shí)段的解作為當(dāng)前時(shí)段的初始猜測(cè)x0而不是每次用隨機(jī)值。因?yàn)橄噜彆r(shí)段的出力曲線本身就具有連續(xù)性這樣做可以讓上層優(yōu)化更快地滿足 KKT 條件整體耗時(shí)能縮短 30% 左右。從最初的“線性規(guī)劃 罰函數(shù)”一步步修到現(xiàn)在這套雙層演化博弈多區(qū)域點(diǎn)對(duì)點(diǎn)能源共享機(jī)制我最大的教訓(xùn)是不要迷信算法包的默認(rèn)參數(shù)每一個(gè)懲罰系數(shù)、步長(zhǎng)、變異概率都是從電網(wǎng)實(shí)際運(yùn)行邊界里摳出來(lái)的數(shù)字。希望這篇復(fù)現(xiàn)筆記能幫你在同樣的方向上少走幾步彎路。本文還有配套的精品資源點(diǎn)擊獲取