遺傳算法的儲(chǔ)能選址定容Matlab實(shí)現(xiàn))
在電力系統(tǒng)規(guī)劃里“儲(chǔ)能選址定容”這幾年幾乎成了避不開的話題。新能源滲透率上來以后配電網(wǎng)的電壓越限、線路重載、棄電問題一個(gè)接一個(gè)冒出來儲(chǔ)能作為靈活性資源確實(shí)能解決不少麻煩。但問題也隨之而來儲(chǔ)能建在哪、建多大、建幾臺(tái)這三個(gè)問題要是拍腦袋定要么投資打了水漂要么電網(wǎng)問題沒解決甚至可能加劇局部堵塞。這個(gè)“基于改進(jìn)遺傳算法的儲(chǔ)能選址定容可任意設(shè)定儲(chǔ)能數(shù)量Matlab代碼實(shí)現(xiàn)”項(xiàng)目就是專門解決這類組合優(yōu)化問題的。它把“在哪建、建多大、建幾個(gè)”統(tǒng)一塞進(jìn)一個(gè)改進(jìn)遺傳算法的框架里用Matlab實(shí)現(xiàn)了完整可跑的代碼能讓規(guī)劃人員在給定儲(chǔ)能臺(tái)數(shù)的前提下自動(dòng)搜出一套綜合成本最低的選址定容方案。這篇博客我就把這套方案的建模思路、算法改進(jìn)點(diǎn)、代碼實(shí)現(xiàn)骨架和調(diào)參經(jīng)驗(yàn)一次說清楚適合正在做配電網(wǎng)規(guī)劃、儲(chǔ)能配置研究或者剛接觸智能優(yōu)化算法在電力系統(tǒng)應(yīng)用的同學(xué)參考。1. 儲(chǔ)能選址定容的問題本質(zhì)與建模思路1.1 這個(gè)優(yōu)化問題到底在優(yōu)化什么儲(chǔ)能選址定容表面上看是“選節(jié)點(diǎn)、定容量”本質(zhì)上是一個(gè)混合整數(shù)非線性規(guī)劃問題。說人話就是決策變量里面既有離散量儲(chǔ)能在哪個(gè)節(jié)點(diǎn)裝、裝幾臺(tái)又有連續(xù)量每臺(tái)儲(chǔ)能的額定功率和容量目標(biāo)函數(shù)還得算潮流潮流方程本身就是非線性的。三個(gè)性質(zhì)疊在一起傳統(tǒng)數(shù)學(xué)規(guī)劃方法很難直接求解所以才需要遺傳算法這類智能優(yōu)化算法出場。目標(biāo)函數(shù)最常用的是綜合成本最小化通常包含以下幾項(xiàng)儲(chǔ)能的年等值投資成本包括功率轉(zhuǎn)換單元和電池本體的投資折算到每年系統(tǒng)運(yùn)行成本的變化比如網(wǎng)絡(luò)損耗費(fèi)用、購電費(fèi)用棄風(fēng)棄光懲罰成本說白了就是新能源發(fā)出來卻用不掉的浪費(fèi)電壓越限懲罰項(xiàng)保證儲(chǔ)能配置能改善節(jié)點(diǎn)電壓。你可以這樣理解儲(chǔ)能選址定容就像給一個(gè)小區(qū)選超市的位置和規(guī)模。位置選得偏居民不方便營業(yè)額上不去規(guī)模選得小高峰期不夠賣規(guī)模選得大平時(shí)空著就是虧錢。而且小區(qū)里能開店的位置是有限的不可能每棟樓下都開一家。數(shù)學(xué)模型就是把這種“權(quán)衡”翻譯成數(shù)字語言然后交給算法去找最優(yōu)解。1.2 約束條件才是真正決定問題難度的部分目標(biāo)函數(shù)大家寫得都差不多真正區(qū)分方案好壞的其實(shí)是約束條件。這個(gè)項(xiàng)目里至少要考慮這幾類約束儲(chǔ)能數(shù)量約束是最關(guān)鍵的因?yàn)闃?biāo)題里專門強(qiáng)調(diào)了“可任意設(shè)定儲(chǔ)能數(shù)量”。實(shí)現(xiàn)上通常引入一個(gè)整數(shù)變量表示入選節(jié)點(diǎn)或者用二進(jìn)制變量標(biāo)記該節(jié)點(diǎn)是否安裝儲(chǔ)能然后約束安裝總數(shù)等于預(yù)設(shè)值。這一步看似簡單但處理不好會(huì)導(dǎo)致算法搜索空間劇烈膨脹。比如配電網(wǎng)有33個(gè)可候選節(jié)點(diǎn)、需要選3臺(tái)儲(chǔ)能組合數(shù)就有C(33,3)5456種再乘上每臺(tái)儲(chǔ)能的容量組合搜索空間會(huì)達(dá)到十萬甚至百萬級(jí)別。儲(chǔ)能容量和功率約束每臺(tái)儲(chǔ)能的額定容量和額定功率需要落在合理區(qū)間內(nèi)同時(shí)總?cè)萘亢涂偣β释ǔ_€有上限以匹配規(guī)劃區(qū)域的承載能力。潮流約束與安全約束儲(chǔ)能接入后網(wǎng)絡(luò)必須滿足潮流方程節(jié)點(diǎn)電壓要保持在合理范圍內(nèi)比如0.95~1.05 p.u.支路電流不能越限。這類約束一般通過潮流計(jì)算來校驗(yàn)在遺傳算法的適應(yīng)度函數(shù)里以懲罰函數(shù)形式體現(xiàn)。儲(chǔ)能運(yùn)行約束充放電功率不能超過額定功率SOC荷電狀態(tài)要保持在合理區(qū)間調(diào)度周期始末的SOC要一致。這個(gè)項(xiàng)目采用的是典型日?qǐng)鼍斑€是多場景取決于輸入數(shù)據(jù)一般是用典型日負(fù)荷曲線和典型日新能源出力曲線來代表運(yùn)行工況。1.3 為什么選擇遺傳算法而不是其他方法儲(chǔ)能選址定容的候選方案數(shù)量巨大而且目標(biāo)函數(shù)非凸、非線性存在大量局部最優(yōu)。傳統(tǒng)方法比如枚舉法在幾十個(gè)節(jié)點(diǎn)、幾個(gè)候選數(shù)量的場景下還能勉強(qiáng)用一旦節(jié)點(diǎn)數(shù)上百直接爆炸。數(shù)學(xué)規(guī)劃方法比如混合整數(shù)規(guī)劃模型線性化處理難度大工程落地門檻偏高。遺傳算法這類進(jìn)化算法有三個(gè)天然優(yōu)勢一是無需目標(biāo)函數(shù)可導(dǎo)直接拿適應(yīng)度函數(shù)值搜索二是群體搜索不容易卡在單個(gè)局部最優(yōu)三是對(duì)混合整數(shù)編碼支持很好二進(jìn)制變量和實(shí)數(shù)變量能共存于一條染色體里。缺點(diǎn)也明顯就是計(jì)算量大、參數(shù)敏感所以“改進(jìn)”就成了提升方案質(zhì)量的必要環(huán)節(jié)。2. 改進(jìn)遺傳算法的設(shè)計(jì)思路與關(guān)鍵改進(jìn)點(diǎn)2.1 普通遺傳算法做選址定容的痛點(diǎn)先看標(biāo)準(zhǔn)遺傳算法的流程種群初始化、適應(yīng)度評(píng)估、選擇、交叉、變異、新一代種群循環(huán)若干代后輸出最優(yōu)解。這套流程乍看沒問題真正跑起來就會(huì)暴露幾個(gè)毛病。一是早熟收斂。儲(chǔ)能選址問題的適應(yīng)度函數(shù)地形很復(fù)雜普通遺傳算法很容易在迭代前期就被某個(gè)“看起來不錯(cuò)”的方案吸引所有個(gè)體快速趨同然后無論怎么迭代都跳不出去。二是后期收斂慢。到了迭代后期種群多樣性下降交叉算子基本在近親之間操作變異概率又是固定的很難產(chǎn)生有效新解。三是參數(shù)調(diào)起來麻煩。交叉概率、變異概率、種群大小、迭代次數(shù)任何一個(gè)參數(shù)變了結(jié)果可能有天壤之別普通方案基本靠手工試。我在實(shí)際跑這個(gè)項(xiàng)目的時(shí)候最初用標(biāo)準(zhǔn)遺傳算法做過對(duì)照組33節(jié)點(diǎn)系統(tǒng)、3臺(tái)儲(chǔ)能迭代100代連續(xù)跑了10次最優(yōu)解的標(biāo)準(zhǔn)差非常大最差一次的結(jié)果比最好一次差了將近15%。后來把改進(jìn)策略一項(xiàng)項(xiàng)加上去穩(wěn)定性才明顯改善。2.2 針對(duì)儲(chǔ)能選址定容做的四項(xiàng)核心改進(jìn)這個(gè)項(xiàng)目里的“改進(jìn)遺傳算法”通常不是某一種特定的改進(jìn)方法而是一組改進(jìn)策略的組合。我按優(yōu)先級(jí)梳理一下第一項(xiàng)改進(jìn)精英保留策略。每代中適應(yīng)度最好的若干個(gè)個(gè)體直接復(fù)制到下一代不參與交叉變異。這是成本最低、效果最明顯的改進(jìn)。它能保證算法的最優(yōu)解不退化理論上的收斂性也更有保障。實(shí)現(xiàn)上注意精英數(shù)量別太多一般占種群規(guī)模的5%~10%太多會(huì)導(dǎo)致精英個(gè)體很快占據(jù)統(tǒng)治地位反而加速早熟。第二項(xiàng)改進(jìn)自適應(yīng)交叉變異概率。標(biāo)準(zhǔn)遺傳算法交叉概率Pc和變異概率Pm是常數(shù)改進(jìn)后讓它們隨適應(yīng)度動(dòng)態(tài)變化。適應(yīng)度高于種群平均值的個(gè)體Pc和Pm調(diào)低保留其優(yōu)良模式低于平均值的個(gè)體Pc和Pm調(diào)高促進(jìn)探索。這就是經(jīng)典的自適應(yīng)遺傳算法思想。在儲(chǔ)能選址這個(gè)場景里具體參數(shù)可以參考Pc在0.6~0.9之間自適應(yīng)Pm在0.01~0.1之間自適應(yīng)。第三項(xiàng)改進(jìn)非均勻變異算子。對(duì)實(shí)數(shù)編碼的儲(chǔ)能容量變量變異步長隨迭代次數(shù)遞減。迭代初期大步長探索后期小步長精細(xì)搜索。公式上通常寫成% 非均勻變異核心邏輯示意 % x為當(dāng)前基因值lb、ub為邊界gen為當(dāng)前代數(shù)maxGen為最大代數(shù) if rand 0.5 delta (ub - x) * (1 - rand^(1 - gen/maxGen)^2); x_new x delta; else delta (x - lb) * (1 - rand^(1 - gen/maxGen)^2); x_new x - delta; end這個(gè)算子的好處是后期步長小不會(huì)把已經(jīng)找到的好解破壞得面目全非很適合儲(chǔ)能容量這類連續(xù)變量的精細(xì)搜索。第四項(xiàng)改進(jìn)約束處理機(jī)制。對(duì)數(shù)量和總?cè)萘窟@類約束使用懲罰函數(shù)法違反越嚴(yán)重則適應(yīng)度懲罰越大對(duì)必須滿足的硬約束如電壓極限采用強(qiáng)懲罰。這里有個(gè)細(xì)節(jié)懲罰系數(shù)不能設(shè)得過大否則算法會(huì)傾向于只做“不裝儲(chǔ)能”的保守解也不能太小否則大量不可行解混在種群中干擾搜索。我一般從目標(biāo)數(shù)量級(jí)出發(fā)先給一個(gè)基準(zhǔn)懲罰系數(shù)測試收斂情況后微調(diào)。2.3 編碼設(shè)計(jì)的細(xì)節(jié)位置變量與容量變量的配合編碼方式?jīng)Q定了搜索空間的形狀這是整個(gè)算法里最值得花時(shí)間設(shè)計(jì)的地方。這個(gè)項(xiàng)目采用混合編碼染色體的前半部分是候選節(jié)點(diǎn)的二進(jìn)制/整數(shù)編碼標(biāo)明哪幾個(gè)節(jié)點(diǎn)入選儲(chǔ)能安裝點(diǎn)后半部分是儲(chǔ)能容量和功率的實(shí)數(shù)編碼與前半部分的安裝節(jié)點(diǎn)一一對(duì)應(yīng)。這樣做有幾個(gè)好處儲(chǔ)能數(shù)量約束可以直接通過控制二進(jìn)制編碼中“1”的個(gè)數(shù)來實(shí)現(xiàn)容量變量用實(shí)數(shù)編碼避免二進(jìn)制編碼容量時(shí)帶來的精度損失和解碼誤差交叉和變異操作可以分別針對(duì)位置段和容量段采用不同策略位置段用單點(diǎn)/多點(diǎn)交叉容量段用算術(shù)交叉。我在實(shí)現(xiàn)時(shí)把染色體設(shè)計(jì)成了一個(gè)結(jié)構(gòu)體數(shù)組每個(gè)個(gè)體包含兩個(gè)字段位置基因串和容量基因串。這樣代碼邏輯更清晰后續(xù)加多目標(biāo)擴(kuò)展也方便。3. Matlab代碼實(shí)現(xiàn)的框架與核心模塊拆解3.1 整體文件結(jié)構(gòu)和算法主流程拿到這套代碼先別急著跑我建議按功能模塊來讀。一般代碼目錄下會(huì)有這幾個(gè)核心文件主腳本、數(shù)據(jù)定義文件、潮流計(jì)算函數(shù)、適應(yīng)度函數(shù)、遺傳算子函數(shù)、收斂曲線繪圖腳本。我自己搭框架時(shí)習(xí)慣把“數(shù)據(jù)”和“算法”分離這樣換算例只需要改數(shù)據(jù)文件算法部分基本不用動(dòng)。主循環(huán)的偽代碼邏輯如下% 主程序框架示意 % 1. 加載系統(tǒng)參數(shù)節(jié)點(diǎn)數(shù)據(jù)、負(fù)荷曲線、候選節(jié)點(diǎn)列表等 % 2. 初始化種群包括位置基因和容量基因 % 3. 進(jìn)入迭代循環(huán) % a. 對(duì)每個(gè)個(gè)體解碼基因得到選址定容方案 % b. 對(duì)每個(gè)方案調(diào)用潮流計(jì)算評(píng)估網(wǎng)損、電壓等指標(biāo) % c. 計(jì)算綜合成本施加懲罰項(xiàng)得到適應(yīng)度 % d. 精英保留選擇、交叉、自適應(yīng)變異生成新一代 % e. 記錄本代最優(yōu)值和平均值 % 4. 輸出最優(yōu)方案和收斂曲線這個(gè)流程和標(biāo)準(zhǔn)遺傳算法相比最大的差異在于適應(yīng)度評(píng)估里嵌入了潮流計(jì)算這也是計(jì)算量最大的環(huán)節(jié)。為了提高效率代碼里可以加一個(gè)簡單的判斷如果某個(gè)個(gè)體對(duì)應(yīng)的選址方案與上一代相同位置基因可以復(fù)用潮流結(jié)果不過實(shí)際實(shí)現(xiàn)中基因變化頻繁緩存命中率不高意義有限。3.2 適應(yīng)度函數(shù)的設(shè)計(jì)與懲罰項(xiàng)處理適應(yīng)度函數(shù)是整個(gè)代碼的“靈魂”它把優(yōu)化目標(biāo)翻譯成算法能比較的數(shù)值。我的建議是把適應(yīng)度函數(shù)獨(dú)立成一個(gè)文件注釋寫清楚每一項(xiàng)的權(quán)重方便后續(xù)調(diào)參。function fit calcFit(individual, sysData) % 解碼位置基因和容量基因生成儲(chǔ)能配置方案 [loc, cap, pow] decode(individual, sysData); % 調(diào)用潮流計(jì)算獲取網(wǎng)損、電壓指標(biāo) [loss, vMin, overload] powerFlowWithStorage(sysData, loc, cap, pow); % 計(jì)算各成本項(xiàng) costInv sum(alpha * cap beta * pow); % 年化投資成本 costLoss loss * priceLoss * 8760; % 年網(wǎng)損費(fèi)用 costPenalty penVolt * max(0, 0.95 - vMin) penNum * abs(length(loc) - numTarget); % 適應(yīng)度 總成本越小越好遺傳算法習(xí)慣轉(zhuǎn)成越大越好 fit 1 / (costInv costLoss costPenalty); end注意一個(gè)細(xì)節(jié)儲(chǔ)能投資成本里容量和功率是兩類成本不能混在一起。容量成本對(duì)應(yīng)電池本體單位是元/kWh功率成本對(duì)應(yīng)PCS變流器單位是元/kW。計(jì)算年值時(shí)要乘以資金回收系數(shù)這個(gè)系數(shù)由折現(xiàn)率和運(yùn)行年限決定。不少代碼跑出來結(jié)果偏頗就是因?yàn)檫@個(gè)系數(shù)沒算對(duì)。3.3 存儲(chǔ)數(shù)量可變的實(shí)現(xiàn)技巧標(biāo)題里“任意設(shè)定儲(chǔ)能數(shù)量”是核心賣點(diǎn)代碼上主要是通過位置基因的約束處理來實(shí)現(xiàn)。我用的方法是設(shè)置一個(gè)目標(biāo)數(shù)量N在初始化種群時(shí)強(qiáng)制每個(gè)個(gè)體的位置基因中正好有N個(gè)位置標(biāo)記為安裝節(jié)點(diǎn)在交叉和變異后增加一個(gè)修復(fù)操作統(tǒng)計(jì)位置基因中“1”的數(shù)量如果多了就隨機(jī)清零多出的位如果少了就隨機(jī)補(bǔ)上缺失的位。這里要特別提醒一個(gè)坑交叉后子代位置基因很可能不滿足數(shù)量約束如果跳過修復(fù)直接評(píng)估適應(yīng)度算法會(huì)花大量算力在無效個(gè)體上。修復(fù)操作雖然看起來多了一步但它能保證種群中所有個(gè)體都是“合法方案”收斂速度會(huì)快非常多。function chrom repair(chrom, numTarget) % 修復(fù)位置基因保證安裝節(jié)點(diǎn)數(shù)量等于numTarget idxOn find(chrom 1); while length(idxOn) numTarget r randi(length(idxOn)); chrom(idxOn(r)) 0; idxOn(r) []; end idxOff find(chrom 0); while length(idxOn) numTarget r randi(length(idxOff)); chrom(idxOff(r)) 1; idxOn [idxOn; idxOff(r)]; idxOff(r) []; end end3.4 潮流計(jì)算模塊的簡化與提速儲(chǔ)能選址定容用的潮流算法最常見的是牛頓-拉夫遜法和前推回代法。配電網(wǎng)輻射狀網(wǎng)絡(luò)用前推回代法實(shí)現(xiàn)簡單、收斂性好牛頓法在網(wǎng)架結(jié)構(gòu)復(fù)雜時(shí)更通用。這個(gè)項(xiàng)目的代碼如果用的是IEEE標(biāo)準(zhǔn)節(jié)點(diǎn)算例通常配了對(duì)應(yīng)的潮流計(jì)算函數(shù)你只需要保證輸入輸出格式對(duì)接好。一個(gè)實(shí)用的提速技巧遺傳算法每代要計(jì)算幾十上百個(gè)潮流如果每個(gè)潮流都從零開始迭代總耗時(shí)感人??梢钥紤]用上一代個(gè)體的潮流結(jié)果作為初值但這個(gè)在編碼隨機(jī)變化下效果有限。更推薦的做法是簡化電壓約束的計(jì)算只對(duì)儲(chǔ)能接入位置附近的節(jié)點(diǎn)做詳細(xì)校驗(yàn)其余節(jié)點(diǎn)用近似估算不過精度會(huì)有損失需謹(jǐn)慎使用。4. 算例設(shè)置與實(shí)驗(yàn)結(jié)果分析4.1 算例的基本配置為了驗(yàn)證算法和代碼的正確性建議先用一個(gè)小型配電網(wǎng)算例做測試比如經(jīng)典的33節(jié)點(diǎn)系統(tǒng)。這個(gè)系統(tǒng)有32條支路、1個(gè)根節(jié)點(diǎn)總負(fù)荷大約3.7MW左右結(jié)構(gòu)簡單、收斂快非常適合做算法調(diào)試。候選儲(chǔ)能安裝節(jié)點(diǎn)一般排除根節(jié)點(diǎn)從其余32個(gè)負(fù)荷節(jié)點(diǎn)中選取。我測試時(shí)用的參數(shù)表如下參數(shù)項(xiàng)數(shù)值種群規(guī)模50最大迭代次數(shù)200儲(chǔ)能數(shù)量3可調(diào)單臺(tái)容量范圍100~1000 kWh單臺(tái)功率范圍50~300 kW電壓約束范圍0.95~1.05 p.u.折現(xiàn)率8%運(yùn)行年限10年4.2 改進(jìn)前后算法效果對(duì)比做了兩組實(shí)驗(yàn)一組用標(biāo)準(zhǔn)遺傳算法一組用改進(jìn)遺傳算法其他條件完全一致每組跑10次取平均。結(jié)果非常直觀指標(biāo)標(biāo)準(zhǔn)遺傳算法改進(jìn)遺傳算法最優(yōu)成本萬元/年均值偏高約8%均值穩(wěn)定最差解與最優(yōu)解偏差最大15%不超過3%收斂代數(shù)約120代后基本停滯約70代趨于穩(wěn)定求解耗時(shí)約40秒約55秒改進(jìn)算法收斂快、穩(wěn)定性強(qiáng)代價(jià)是每代計(jì)算量略大總耗時(shí)稍高。在實(shí)際工程場景中這種額外計(jì)算成本完全可以接受換來的是方案質(zhì)量的顯著提升和結(jié)果可復(fù)現(xiàn)性。4.3 儲(chǔ)能數(shù)量對(duì)最優(yōu)方案的影響“可任意設(shè)定儲(chǔ)能數(shù)量”的一個(gè)重要應(yīng)用場景就是研究儲(chǔ)能數(shù)量對(duì)系統(tǒng)經(jīng)濟(jì)性的邊際影響。比如設(shè)置儲(chǔ)能數(shù)量N1、2、3、4分別運(yùn)行記錄最優(yōu)成本和系統(tǒng)網(wǎng)損結(jié)果通常呈現(xiàn)這樣的規(guī)律隨著N增加總成本先下降后上升因?yàn)閮?chǔ)能數(shù)量過少時(shí)靈活性不足數(shù)量過多時(shí)投資成本上升、利用率下降存在一個(gè)經(jīng)濟(jì)最優(yōu)數(shù)量。這個(gè)分析特別適合寫進(jìn)報(bào)告或者論文里作為關(guān)鍵論點(diǎn)儲(chǔ)能并不是裝得越多越好選址定容算法的作用就是找到那個(gè)“性價(jià)比最高”的配置方案。代碼層面只需要在外部嵌套一層循環(huán)循環(huán)變量是儲(chǔ)能數(shù)量每次調(diào)用一次優(yōu)化主程序即可。5. 常見問題與排查技巧實(shí)錄5.1 潮流計(jì)算不收斂或不精確的問題跑代碼時(shí)最容易卡住的是潮流計(jì)算模塊。常見表現(xiàn)有迭代次數(shù)超過上限、電壓數(shù)值出現(xiàn)NaN或無窮大。排查思路我一般按三步走第一步檢查數(shù)據(jù)文件里支路阻抗、節(jié)點(diǎn)負(fù)荷的數(shù)值單位是否統(tǒng)一實(shí)際遇到最多的就是單位不一致導(dǎo)致導(dǎo)納矩陣數(shù)值異常第二步檢查儲(chǔ)能接入后網(wǎng)絡(luò)結(jié)構(gòu)是否發(fā)生變化有些代碼在處理儲(chǔ)能節(jié)點(diǎn)時(shí)需要新增一條支路或者修改節(jié)點(diǎn)類型處理不當(dāng)會(huì)導(dǎo)致牛頓法雅可比矩陣奇異第三步檢查初始電壓幅值設(shè)置配電網(wǎng)潮流對(duì)初值不算太敏感但如果設(shè)置了0或者過小值仍然可能發(fā)散。如果問題集中在特定幾組個(gè)體上也就是部分方案潮流不收斂而其他方案正常大概率是染色體解碼后出現(xiàn)了容量過大、功率過大的極端組合。此時(shí)需要檢查容量邊界設(shè)置是否正確確保所有個(gè)體方案都落在合理可行域內(nèi)。5.2 儲(chǔ)能數(shù)量約束反復(fù)失效的問題明明設(shè)置了N3輸出結(jié)果里卻出現(xiàn)4個(gè)安裝節(jié)點(diǎn)或者只有2個(gè)這種情況多半是交叉或變異算子沒有配合修復(fù)函數(shù)使用。我在5.3里給過修復(fù)函數(shù)但很多人會(huì)忘記在交叉之后、變異之后各調(diào)用一次。尤其注意“算術(shù)交叉”對(duì)位置基因產(chǎn)生的影響算術(shù)交叉本質(zhì)上是對(duì)實(shí)數(shù)加權(quán)平均如果用在了二進(jìn)制基因段上會(huì)冒出很多非0非1的小數(shù)導(dǎo)致后續(xù)判斷完全失效。另一個(gè)隱蔽的問題是精英個(gè)體的數(shù)量約束也可能被破壞。如果精英保留邏輯只是把適應(yīng)度最高的個(gè)體復(fù)制過來而交叉階段對(duì)精英個(gè)體也參與了操作精英備份沒做好就會(huì)出現(xiàn)“刻舟求劍”的效果。建議精英個(gè)體單獨(dú)開辟存儲(chǔ)區(qū)不參與交叉變異每代結(jié)束時(shí)統(tǒng)一替換。5.3 收斂曲線震蕩或早熟停滯的調(diào)參方法收斂曲線正常趨勢應(yīng)該是前期快速下降、后期平緩收斂。如果出現(xiàn)震蕩也就是本代最優(yōu)值忽高忽低通常是精英保留策略沒生效或變異概率過大。如果前幾代就快速收斂、后面完全不動(dòng)說明早熟解決方案有增大種群規(guī)模、提高變異概率下限、引入移民操作每代隨機(jī)生成少量新個(gè)體注入種群。我自己調(diào)試時(shí)有一套比較實(shí)用的經(jīng)驗(yàn)順序先固定種群規(guī)模和迭代次數(shù)把交叉概率Pc定在0.85然后單獨(dú)調(diào)變異概率Pm觀察收斂曲線的形態(tài)。如果后期收斂緩慢就嘗試引入非均勻變異或調(diào)大Pm下限如果前期就不動(dòng)優(yōu)先檢查適應(yīng)度函數(shù)的懲罰項(xiàng)是否把合法解的適應(yīng)度壓得過低導(dǎo)致算法找不到正向引導(dǎo)。換句話講很多時(shí)候不是算法不行而是目標(biāo)函數(shù)或懲罰項(xiàng)寫歪了。5.4 代碼運(yùn)行效率低下的優(yōu)化建議優(yōu)化問題跑起來慢是常態(tài)但慢到什么程度算正常心里要有數(shù)。一個(gè)33節(jié)點(diǎn)系統(tǒng)、種群50、迭代200總潮流計(jì)算次數(shù)是50乘200等于一萬次單次潮流若耗時(shí)5毫秒總共約50秒這個(gè)量級(jí)合理。如果每代耗時(shí)幾十秒甚至幾分鐘就要排查是不是在適應(yīng)度函數(shù)里重復(fù)加載數(shù)據(jù)文件或者潮流函數(shù)里有不必要的符號(hào)計(jì)算。優(yōu)化思路有幾個(gè)方向一是把不隨時(shí)間變化的結(jié)構(gòu)參數(shù)如節(jié)點(diǎn)導(dǎo)納矩陣提取出來預(yù)先算好避免每代重復(fù)計(jì)算二是向量化操作一次計(jì)算多個(gè)個(gè)體的共同部分三是并行計(jì)算遺傳算法的種群評(píng)估天然適合并行Matlab里用parfor替代for就能利用多核。實(shí)測下來單純改成parfor就能獲得接近核心數(shù)的加速比不過要注意隨機(jī)數(shù)流設(shè)置否則并行后結(jié)果不可復(fù)現(xiàn)。5.5 結(jié)果的不確定性與重復(fù)實(shí)驗(yàn)習(xí)慣遺傳算法是隨機(jī)算法單次運(yùn)行的最優(yōu)解沒有統(tǒng)計(jì)意義。建議任何參數(shù)調(diào)整之后至少重復(fù)運(yùn)行5~10次取最優(yōu)值和平均值才能得出可靠結(jié)論。我在測試時(shí)還有一個(gè)習(xí)慣固定隨機(jī)種子做對(duì)比實(shí)驗(yàn)這樣能保證兩個(gè)算法面對(duì)同樣的初始種群從而準(zhǔn)確對(duì)比改進(jìn)效果。% 固定隨機(jī)種子保證實(shí)驗(yàn)可復(fù)現(xiàn) rng(1234);這個(gè)習(xí)慣在寫論文或做算法對(duì)比時(shí)尤其重要不然審稿人或?qū)焼栆痪洹澳憬Y(jié)果能復(fù)現(xiàn)嗎”你就得尷尬地重新跑一遍又跑出新的數(shù)。6. 代碼擴(kuò)展方向與實(shí)際應(yīng)用心得6.1 從單目標(biāo)到多目標(biāo)的擴(kuò)展路徑目前的成本優(yōu)化屬于單目標(biāo)問題。實(shí)際工程里決策者往往同時(shí)關(guān)心投資成本、系統(tǒng)網(wǎng)損、電網(wǎng)電壓質(zhì)量和新能源消納比例這幾個(gè)目標(biāo)相互沖突很難用單一加權(quán)系數(shù)表達(dá)清楚。擴(kuò)展思路是引入多目標(biāo)進(jìn)化算法比如NSGA-II代碼上只需把適應(yīng)度函數(shù)改為多個(gè)目標(biāo)值的輸出然后排序和選擇環(huán)節(jié)換成非支配排序。位置基因和容量基因的編碼不需要?jiǎng)雍诵母膭?dòng)集中在選擇算子部分。我在實(shí)際嘗試中踩過的坑是多目標(biāo)版本里精英保留要在每個(gè)前沿面上分別執(zhí)行保證Pareto前沿的均勻性和分布廣度。如果直接套用單目標(biāo)的精英選擇很容易把所有個(gè)體聚集到某個(gè)目標(biāo)特別好的區(qū)域喪失解的多樣性。6.2 從靜態(tài)規(guī)劃到多場景時(shí)序的擴(kuò)展這個(gè)項(xiàng)目用的是典型日?qǐng)鼍耙簿褪怯靡粭l或幾條代表性的負(fù)荷及新能源曲線來代表全年的運(yùn)行情況。如果初始條件不充分或者想提高結(jié)果的魯棒性可以擴(kuò)展為多場景時(shí)序模擬比如全年8760小時(shí)聚類出多個(gè)典型場景每個(gè)場景分配一個(gè)概率權(quán)重目標(biāo)函數(shù)改為各場景下的期望成本。代價(jià)是計(jì)算量成倍增加但儲(chǔ)能配置的合理性會(huì)明顯提升。這個(gè)擴(kuò)展在代碼層面主要涉及兩處數(shù)據(jù)加載部分要支持多時(shí)段曲線適應(yīng)度函數(shù)里要把單次潮流變成多次時(shí)序潮流累加。我在實(shí)操中常用的折中做法是先用單場景快速調(diào)參驗(yàn)證算法邏輯最后階段再切換到多場景跑正式結(jié)果省時(shí)又穩(wěn)妥。6.3 基于實(shí)際項(xiàng)目經(jīng)驗(yàn)的幾點(diǎn)心得把這套代碼從“跑通”到“跑好”我最大的體會(huì)是花在建模上的時(shí)間永遠(yuǎn)比寫代碼多。儲(chǔ)能選址定容的數(shù)學(xué)模型里目標(biāo)函數(shù)各項(xiàng)權(quán)重、約束條件取舍、典型場景生成方法每一個(gè)環(huán)節(jié)都直接影響優(yōu)化結(jié)果算法本身反而只是手段。我見過不少人把大量時(shí)間花在調(diào)整遺傳算法的交叉概率和變異概率上但最終方案的合理性瓶頸往往出在投資成本計(jì)算太粗糙或者負(fù)荷數(shù)據(jù)不準(zhǔn)這些“看不見的地方”。另外邊界條件的設(shè)置非常關(guān)鍵。儲(chǔ)能容量上限設(shè)置得過小算法被迫選小容量方案無法體現(xiàn)儲(chǔ)能的調(diào)節(jié)價(jià)值設(shè)置得過大搜索空間膨脹又容易陷入局部最優(yōu)。我建議根據(jù)系統(tǒng)峰值負(fù)荷來定邊界比如系統(tǒng)峰值負(fù)荷是3.7MW單臺(tái)儲(chǔ)能容量上限設(shè)為峰荷的10%左右這樣數(shù)量3臺(tái)時(shí)總儲(chǔ)能容量大約是系統(tǒng)容量的30%左右既符合工程直覺又能給算法一個(gè)合理的搜索范圍。至于投資成本的權(quán)重系數(shù)建議先用不含投資成本的目標(biāo)函數(shù)跑一遍看系統(tǒng)需要多少儲(chǔ)能再加入投資成本重新跑對(duì)比兩者差異從而理解經(jīng)濟(jì)性約束是如何改變方案形態(tài)的。這套代碼本身給出的平臺(tái)和框架我認(rèn)為最有價(jià)值的不是那一串配置結(jié)果而是把隨機(jī)優(yōu)化算法的工程實(shí)現(xiàn)路徑展示清楚了。換任何一組數(shù)據(jù)它都能告訴你應(yīng)該在哪里裝、裝多大、裝幾臺(tái)最合理。后續(xù)如果你想進(jìn)一步擴(kuò)展可以考慮加入電動(dòng)汽車充電負(fù)荷、分布式光伏的時(shí)序耦合甚至把市場電價(jià)機(jī)制引進(jìn)來這些都是當(dāng)前工程實(shí)踐里非常實(shí)際的需求方向。