拓?fù)湓O(shè)計(jì)的約束差分進(jìn)化算法與Matlab實(shí)現(xiàn))
多微電網(wǎng)的拓?fù)湓O(shè)計(jì)說到底是決定微電網(wǎng)之間可交換功率的連接結(jié)構(gòu)。用約束差分進(jìn)化算法做大規(guī)模矩陣優(yōu)化是目前在Matlab里比較實(shí)用的一套拓?fù)湓O(shè)計(jì)技術(shù)路線。這篇文章把建模、編碼、約束處理和代碼實(shí)現(xiàn)完整梳理一遍也記錄一些實(shí)戰(zhàn)中才會(huì)暴露的坑。這套方案適合正在做微電網(wǎng)群規(guī)劃、園區(qū)多微電網(wǎng)互聯(lián)設(shè)計(jì)的工程師或研究生。如果你已經(jīng)跑過一些啟發(fā)式優(yōu)化算法但被高維矩陣編碼、約束不可行解、收斂振蕩這些問題卡住那這篇內(nèi)容應(yīng)該能直接派上用場(chǎng)。我會(huì)把矩陣變量怎么構(gòu)造、約束怎么處理、參數(shù)怎么調(diào)、代碼怎么組織都展開講。1. 多微電網(wǎng)拓?fù)鋬?yōu)化到底在解決什么問題1.1 從孤島微電網(wǎng)到微電網(wǎng)群拓?fù)湓O(shè)計(jì)的價(jià)值一個(gè)微電網(wǎng)自給自足不難難的是在極端天氣、機(jī)組檢修或負(fù)荷突增時(shí)仍然可靠。多個(gè)微電網(wǎng)通過聯(lián)絡(luò)線互聯(lián)之后就可以在空間上共享備用容量某個(gè)區(qū)域光伏大發(fā)、負(fù)荷偏低時(shí)可以把富余功率送到隔壁隔壁負(fù)荷高峰、本地機(jī)組不夠時(shí)又能從其他區(qū)域接收支援。這種互聯(lián)結(jié)構(gòu)就是多微電網(wǎng)的拓?fù)?。拓?fù)洳皇窃矫茉胶?。每增加一條聯(lián)絡(luò)線意味著一次投資、一份運(yùn)維成本和一部分網(wǎng)損。但線路太少又會(huì)導(dǎo)致功率互濟(jì)能力不足一個(gè)節(jié)點(diǎn)故障可能讓整片區(qū)域失去支援。所以拓?fù)湓O(shè)計(jì)本質(zhì)上是在經(jīng)濟(jì)性、可靠性和運(yùn)行靈活性之間做最優(yōu)折中。工程上這類問題經(jīng)常被簡(jiǎn)化成“手動(dòng)方案比選”靠經(jīng)驗(yàn)列幾個(gè)備選方案算潮流、算可靠性然后挑一個(gè)。當(dāng)微電網(wǎng)數(shù)量達(dá)到幾十個(gè)、候選聯(lián)絡(luò)線數(shù)量達(dá)到數(shù)百條時(shí)手算完全不現(xiàn)實(shí)。必須把拓?fù)湓O(shè)計(jì)轉(zhuǎn)成一個(gè)數(shù)學(xué)優(yōu)化問題交給算法去搜。1.2 為什么優(yōu)化問題會(huì)變成矩陣優(yōu)化假設(shè)系統(tǒng)里有N個(gè)微電網(wǎng)節(jié)點(diǎn)節(jié)點(diǎn)之間的連接關(guān)系天然可以用一個(gè)N×N的矩陣來(lái)表示。比如矩陣第i行第j列的元素x_ij代表節(jié)點(diǎn)i和節(jié)點(diǎn)j之間聯(lián)絡(luò)線的狀態(tài)或功率。對(duì)角線元素表示本地信息非對(duì)角線元素表示互聯(lián)關(guān)系。直接把拓?fù)渥鳛閮?yōu)化變量時(shí)決策矩陣就是鄰接矩陣或功率傳輸矩陣。這個(gè)矩陣一般是對(duì)稱的因?yàn)槲㈦娋W(wǎng)之間的聯(lián)絡(luò)線是無(wú)向的x_ij和x_ji描述的是同一條線路。實(shí)際操作時(shí)只需要優(yōu)化上三角部分的N(N-1)/2個(gè)元素下三角通過對(duì)稱性補(bǔ)全。這就引出了“大規(guī)模矩陣優(yōu)化”的問題。當(dāng)N20時(shí)決策維度是190維N30時(shí)維度變成435維N50時(shí)直接沖到1225維。如果再考慮多個(gè)典型運(yùn)行場(chǎng)景、多種線路容量選項(xiàng)決策變量和約束數(shù)量還會(huì)進(jìn)一步膨脹。普通的窮舉法、枚舉法到這里基本都是死路。1.3 這類問題難在什么地方第一個(gè)難點(diǎn)是非凸性。拓?fù)渥兞坷锇x散的“建/不建”決策功率分配又是連續(xù)變量二者耦合在一起。目標(biāo)函數(shù)里還有建設(shè)成本這種帶階躍性質(zhì)的項(xiàng)整個(gè)優(yōu)化曲面既不平滑也不凸。第二個(gè)難點(diǎn)是強(qiáng)約束。每個(gè)節(jié)點(diǎn)都要滿足功率平衡每條聯(lián)絡(luò)線的傳輸功率不能超過容量上限整個(gè)系統(tǒng)還要滿足一定的可靠性要求。這些約束不是軟性的違反任何一條方案在工程上就是廢的。第三個(gè)難點(diǎn)是維度高。前面算過決策變量隨節(jié)點(diǎn)數(shù)平方增長(zhǎng)。差分進(jìn)化這類群體算法在高維空間里很容易失去多樣性搜索效率斷崖式下降。如果編碼方式再不合理算法甚至?xí)ù罅繒r(shí)間在“全不可行解”的區(qū)域內(nèi)打轉(zhuǎn)。2. 約束差分進(jìn)化算法為什么選它核心機(jī)制是什么2.1 差分進(jìn)化算法的基本流程差分進(jìn)化算法Differential Evolution, DE是經(jīng)典進(jìn)化算法里比較皮實(shí)的一種。它的核心思想其實(shí)很樸素讓種群個(gè)體之間互相“借鑒”差異信息生成新個(gè)體然后跟舊個(gè)體競(jìng)爭(zhēng)上崗。標(biāo)準(zhǔn)流程分四步。第一步是初始化隨機(jī)生成NP個(gè)個(gè)體每個(gè)個(gè)體代表一個(gè)候選解。第二步是變異從種群中隨機(jī)挑三個(gè)不同個(gè)體用其中兩個(gè)的差乘以縮放因子F加到第三個(gè)個(gè)體上得到變異個(gè)體。第三步是交叉變異個(gè)體與原個(gè)體按位混合生成試驗(yàn)個(gè)體混合程度由交叉概率CR控制。第四步是選擇比較試驗(yàn)個(gè)體和原個(gè)體留下更好的一個(gè)。整個(gè)過程不需要梯度信息對(duì)目標(biāo)函數(shù)是否可導(dǎo)完全不敏感。這一特性對(duì)多微電網(wǎng)拓?fù)鋬?yōu)化這種非凸、離散連續(xù)混合的問題非常合適。只要能把方案編碼成向量DE就能搜。用生活化的方式理解每個(gè)個(gè)體就是一張“連線方案圖”。變異操作相當(dāng)于參考幾個(gè)已有方案拍腦袋組合出一個(gè)新方案交叉操作相當(dāng)于把兩個(gè)方案拼拼湊湊你取一段我取一段選擇操作就是把好方案留下壞方案淘汰。反復(fù)迭代下去種群整體越來(lái)越接近最優(yōu)連線方案。2.2 約束處理分步篩選比一票否決更靠譜多微電網(wǎng)拓?fù)鋬?yōu)化最大的敵人不是目標(biāo)函數(shù)復(fù)雜而是約束太多導(dǎo)致可行解稀少。如果約束處理方式不對(duì)算法一開始生成的大多數(shù)個(gè)體都是不可行的進(jìn)化過程很快會(huì)退化。常見的做法有三種罰函數(shù)法、可行性規(guī)則、ε約束法。罰函數(shù)法最直觀把約束違反量乘一個(gè)懲罰系數(shù)加到目標(biāo)函數(shù)上但懲罰系數(shù)非常難調(diào)。調(diào)小了不可行解輕松勝出調(diào)大了搜索又被過早牽進(jìn)可行域邊緣找不到真正好的方案??尚行砸?guī)則是更穩(wěn)妥的選擇。它按三條準(zhǔn)則比較兩個(gè)個(gè)體可行解永遠(yuǎn)優(yōu)于不可行解同為可行解目標(biāo)函數(shù)值小的勝同為不可行解約束違反總量小的勝。這套準(zhǔn)則不需要任何懲罰系數(shù)簡(jiǎn)單有效是約束差分進(jìn)化算法里最常用的處理框架。ε約束法可以看成可行性規(guī)則的升級(jí)版。它的想法是在前期允許個(gè)體有一定程度的約束違反讓種群在早期能保持足夠的探索活力而不是一上來(lái)就被嚴(yán)格約束鎖死。隨著迭代代數(shù)的增加ε值逐漸減小約束一步步收緊最后收斂到完全可行區(qū)域。2.3 面向矩陣編碼的算法調(diào)整直接把標(biāo)準(zhǔn)DE套在矩陣問題上很容易翻車。原因在于DE的變異算子是用實(shí)數(shù)向量的線性加減來(lái)生成新個(gè)體如果決策向量里混著0和1的拓?fù)錄Q策差分變異產(chǎn)生的中間值會(huì)大量落在(0,1)之間導(dǎo)致拓?fù)涮幱凇鞍脒B接不連接”的模糊狀態(tài)。一個(gè)實(shí)用的調(diào)整是決策變量先用連續(xù)值表示聯(lián)絡(luò)線的功率容量或傳輸功率水平用一個(gè)閾值τ來(lái)判斷線路是否實(shí)際建設(shè)。比如x_ij小于τ就視為不連接大于等于τ就視為連接。這樣矩陣既保留了連續(xù)變量的優(yōu)化特性又能落地成工程可用的離散拓?fù)?。另一個(gè)調(diào)整是對(duì)稱性修復(fù)。矩陣優(yōu)化中每次調(diào)用適應(yīng)度函數(shù)之前都要把決策向量還原成對(duì)稱矩陣強(qiáng)制對(duì)角線為零。不然變異和交叉會(huì)把原本對(duì)稱的矩陣破壞掉x_ij和x_ji出現(xiàn)不一致目標(biāo)函數(shù)計(jì)算直接出錯(cuò)。3. Matlab代碼實(shí)現(xiàn)從建模到收斂的完整拆解3.1 仿真場(chǎng)景與模型參數(shù)我先用一個(gè)20節(jié)點(diǎn)多微電網(wǎng)算例說明整個(gè)實(shí)現(xiàn)流程。每個(gè)節(jié)點(diǎn)內(nèi)部包含一臺(tái)燃?xì)鈾C(jī)組、一個(gè)光伏電站和一片負(fù)荷區(qū)域。節(jié)點(diǎn)之間通過候選聯(lián)絡(luò)線連接每條聯(lián)絡(luò)線有傳輸容量上限。優(yōu)化目標(biāo)是在滿足全天不同時(shí)段功率平衡的前提下最小化年綜合成本。綜合成本包括三部分聯(lián)絡(luò)線建設(shè)成本的等年值、燃?xì)鈾C(jī)組的發(fā)電成本、線路傳輸過程中的能量損耗成本。發(fā)電成本用二次函數(shù)近似網(wǎng)損成本跟傳輸功率的平方掛鉤建設(shè)成本用Sigmoid函數(shù)平滑逼近避免階躍項(xiàng)給搜索過程引入不連續(xù)點(diǎn)。參考參數(shù)設(shè)置如下表所示。參數(shù)取值說明節(jié)點(diǎn)數(shù)N20微電網(wǎng)節(jié)點(diǎn)數(shù)量單節(jié)點(diǎn)負(fù)荷峰值300~800 kW按區(qū)域差異隨機(jī)生成光伏裝機(jī)200~600 kW午后出力明顯聯(lián)絡(luò)線候選容量200~500 kW不同位置上限不同線路等年建設(shè)成本8~15 萬(wàn)元/km含折損和維護(hù)燃?xì)獍l(fā)電成本系數(shù)0.35~0.55 元/kWh二次函數(shù)線性項(xiàng)3.2 種群初始化與矩陣解碼差分進(jìn)化的種群個(gè)體在算法內(nèi)部是一維向量但工程問題是一個(gè)對(duì)稱矩陣。所以第一件事就是把向量和矩陣之間的轉(zhuǎn)換寫好。function X vec2sym(v) D length(v); n round((1 sqrt(1 8 * D)) / 2); X zeros(n, n); k 1; for i 1:n-1 for j i1:n X(i,j) v(k); X(j,i) v(k); k k 1; end end end初始化時(shí)要注意如果所有元素都在[0, P_max]之間隨機(jī)均勻分布那初始矩陣會(huì)非常稠密幾乎每個(gè)節(jié)點(diǎn)都互相“弱連接”拓?fù)浣Y(jié)構(gòu)完全沒有可區(qū)分度。我建議初始值大部分落在[0, τ]區(qū)間內(nèi)即默認(rèn)不連接只讓少部分元素進(jìn)入建設(shè)區(qū)間。function [X0] init_population(NP, D, Pmax_upper) X0 zeros(D, NP); for i 1:NP % 稀疏初始化絕大多數(shù)值在[0, 0.02*Pmax_upper] v rand(D, 1) * 0.02 * Pmax_upper; % 隨機(jī)選 2~5 個(gè)位置給出真實(shí)線路候選值 idx randperm(D, randi([2, 5])); v(idx) Pmax_upper * (0.3 0.7 * rand(length(idx), 1)); X0(:, i) v; end end這樣做的好處是初始種群里的拓?fù)浣Y(jié)構(gòu)天然稀疏不會(huì)一開始就把搜索空間浪費(fèi)在“全連接”這種工程無(wú)效方向上。3.3 目標(biāo)函數(shù)與約束計(jì)算目標(biāo)函數(shù)負(fù)責(zé)把決策向量轉(zhuǎn)化成成本數(shù)值。實(shí)現(xiàn)時(shí)先把向量恢復(fù)成矩陣再根據(jù)矩陣中非零線路計(jì)算建設(shè)成本、運(yùn)行成本和網(wǎng)損。function [cost] objective_func(v, model) X vec2sym(v); n size(X, 1); % 建設(shè)成本項(xiàng)Sigmoid平滑逼近階躍 inv_cost 0; for i 1:n-1 for j i1:n if X(i,j) model.tau inv_cost inv_cost model.inv_unit(i,j) / (1 exp(-10*(X(i,j)/model.Pmax(i,j) - 0.5))); end end end % 運(yùn)行成本項(xiàng) op_cost sum(model.alpha .* model.Pg.^2 model.beta .* model.Pg model.gamma); % 網(wǎng)損成本項(xiàng) loss_cost model.loss_coef * sum(sum(X.^2)); cost inv_cost op_cost loss_cost; end約束計(jì)算需要返回每個(gè)個(gè)體的約束違反總量。這里要特別小心每條約束不是簡(jiǎn)單判斷“是否違反”而是要量化“違反了多少”否則可行性規(guī)則沒法比較兩個(gè)不可行解的優(yōu)劣。function [viol] constraint_violation(v, model) X vec2sym(v); n size(X, 1); viol 0; % 線路容量約束 for i 1:n-1 for j i1:n if X(i,j) model.Pmax(i,j) viol viol (X(i,j) - model.Pmax(i,j)) / model.Pmax(i,j); end end end % 節(jié)點(diǎn)功率平衡約束簡(jiǎn)化版本用功率不平衡量衡量 net model.Pg model.Ppv - model.Pload; for i 1:n balance net(i); for j 1:n if i ~ j balance balance model.incidence(i,j) * X(i,j); end end if abs(balance) model.balance_tol viol viol abs(balance) / model.balance_tol; end end end每個(gè)約束的偏差量做歸一化后累加這樣不同量綱的約束才能放到同一個(gè)標(biāo)量里比較。否則線路容量的千瓦級(jí)偏差會(huì)直接把功率平衡的微小偏差淹沒。3.4 主循環(huán)與約束支配選擇主循環(huán)按“變異-交叉-選擇”的順序迭代。變異采用經(jīng)典的DE/rand/1策略交叉用二項(xiàng)式交叉。選擇階段采用可行性規(guī)則。for gen 1:MaxGen for i 1:NP % 隨機(jī)選取三個(gè)互不相同的個(gè)體 r randperm(NP, 4); r(r i) []; r1 r(1); r2 r(2); r3 r(3); % 變異 V X(:, r1) F * (X(:, r2) - X(:, r3)); % 邊界處理 V min(max(V, LB), UB); % 二項(xiàng)式交叉 jrand randi(D); U X(:, i); mask rand(D, 1) CR; mask(jrand) true; U(mask) V(mask); % 可行性規(guī)則選擇 f_new objective_func(U, model); v_new constraint_violation(U, model); f_old objective_func(X(:, i), model); v_old constraint_violation(X(:, i), model); if (v_new model.eps v_old model.eps f_new f_old) || ... (v_new model.eps v_old model.eps) || ... (v_new model.eps v_old model.eps v_new v_old) X(:, i) U; f_pop(i) f_new; v_pop(i) v_new; end end % 記錄最優(yōu)解 [best_f, best_idx] min(f_pop 1e6 * (v_pop model.eps)); best_v X(:, best_idx); curve(gen) best_f; % ε逐漸收緊 model.eps model.eps0 * (1 - gen / MaxGen) ^ 2; end選擇邏輯說明兩條都可行時(shí)取成本低的新個(gè)體可行而舊個(gè)體不可行新個(gè)體獲勝兩條都不可行時(shí)取約束違反量小的。這個(gè)邏輯正是Deb可行性規(guī)則的標(biāo)準(zhǔn)實(shí)現(xiàn)不需要任何懲罰系數(shù)。3.5 參數(shù)表與推薦取值差分進(jìn)化雖然皮實(shí)但參數(shù)設(shè)置不當(dāng)還是會(huì)出問題。下表是我在多次測(cè)試中比較穩(wěn)定的取值范圍按20~50節(jié)點(diǎn)規(guī)模調(diào)整。參數(shù)推薦范圍備注種群規(guī)模NP80~150維度高時(shí)可適當(dāng)增大縮放因子F0.4~0.7過大易振蕩過小易早熟交叉概率CR0.7~0.9影響局部探索強(qiáng)度最大迭代代數(shù)800~1500看收斂曲線趨勢(shì)拓?fù)溟撝郸?.05~0.1相對(duì)線路容量ε初始值0.1~0.3前期允許一定違反我的經(jīng)驗(yàn)是NP不要低于維度D的1/5否則種群多樣性不夠。F取0.5左右比較穩(wěn)CR取0.8能讓新個(gè)體保留更多變異信息。ε的衰減曲線用二次下降比線性下降效果更好前中期探索空間更充分。4. 典型算例結(jié)果與關(guān)鍵觀察4.1 小規(guī)模算例驗(yàn)證正確性先做5節(jié)點(diǎn)小算例這個(gè)規(guī)模下可以把所有可能的拓?fù)浣M合枚舉出來(lái)用窮舉結(jié)果校驗(yàn)差分進(jìn)化算法是否找得到最優(yōu)解。我把候選線路限制在10條以內(nèi)這樣2^101024種組合枚舉很快。對(duì)比結(jié)果顯示約束差分進(jìn)化算法在多數(shù)隨機(jī)種子下都能找到理論最優(yōu)解少數(shù)幾次會(huì)卡在次優(yōu)解。這說明算法實(shí)現(xiàn)本身的正確性沒有問題。這一步一定不要跳。直接上大算例一旦結(jié)果不合理根本說不清是模型錯(cuò)還是算法錯(cuò)。先用小規(guī)模把代碼邏輯驗(yàn)證干凈再放大節(jié)點(diǎn)規(guī)模能省去大量排查時(shí)間。4.2 大規(guī)模算例性能表現(xiàn)20節(jié)點(diǎn)算例運(yùn)行800代收斂曲線呈現(xiàn)出明顯的前期陡降、后期趨平趨勢(shì)。前200代成本下降最快400代之后基本進(jìn)入平臺(tái)期。最終優(yōu)化拓?fù)湎啾鹊热萘侩S機(jī)布線的方案綜合成本下降約15%到20%。30節(jié)點(diǎn)算例的決策維度是435維種群規(guī)模取120運(yùn)行1000代在普通配置的臺(tái)式機(jī)上耗時(shí)約40分鐘。從最終拓?fù)淇此惴▋A向于保留一組“主干聯(lián)絡(luò)線”形成兩到三個(gè)環(huán)狀支撐結(jié)構(gòu)而不是把所有節(jié)點(diǎn)全部互聯(lián)。這種結(jié)果符合工程直覺少量關(guān)鍵線路承擔(dān)主要互濟(jì)功能冗余線路的投資收益比不高。從約束滿足情況看最終解的功率平衡約束和線路容量約束全部滿足說明可行性規(guī)則配合ε衰減機(jī)制成功把種群引向可行區(qū)域。4.3 參數(shù)敏感性關(guān)鍵結(jié)論我用控制變量法重點(diǎn)測(cè)了F、CR和閾值τ三個(gè)參數(shù)??s放因子F從0.3調(diào)到0.9的過程中0.5附近收斂速度和最終精度最均衡。F0.3時(shí)早期收斂快但150代之后容易陷入局部最優(yōu)F0.8以上振蕩明顯收斂曲線經(jīng)常出現(xiàn)回跳。交叉率CR在0.8附近表現(xiàn)最好。CR太低試驗(yàn)個(gè)體跟原個(gè)體太像缺乏探索性CR太高矩陣結(jié)構(gòu)的連續(xù)性被破壞拓?fù)浣?jīng)?!爸щx破碎”。后者在矩陣編碼問題上尤其明顯。閾值τ的影響容易被低估。τ太小很多微弱的“偽連接”會(huì)被當(dāng)成有效線路最終方案拓?fù)鋸?fù)雜、建設(shè)成本虛高τ太大真實(shí)有用的線路被砍掉可靠性下降。建議τ取線路容量上限的5%左右并在優(yōu)化完成后做一次連通性校驗(yàn)。5. 實(shí)戰(zhàn)中踩過的坑與排查方法5.1 收斂曲線不下降或者振蕩劇烈這個(gè)問題的常見原因是種群中大部分個(gè)體不可行算法只能在不可行域里互相比較約束違反度。表現(xiàn)就是cost曲線長(zhǎng)時(shí)間橫盤或者上下亂跳。排查時(shí)先看每個(gè)個(gè)體進(jìn)入選擇階段前的約束違反總量分布。如果90%以上的個(gè)體viol都大于0說明約束太嚴(yán)或初始化太激進(jìn)。這時(shí)調(diào)大ε初始值或者改進(jìn)初始化策略讓初始種群里多生成一些結(jié)構(gòu)簡(jiǎn)單、容易滿足約束的方案。5.2 優(yōu)化結(jié)果矩陣幾乎全零矩陣全零意味著算法認(rèn)為“一條線路都不建最劃算”。這通常是建設(shè)成本系數(shù)設(shè)置過高或者目標(biāo)函數(shù)中缺少可靠性維度的約束。多微電網(wǎng)拓?fù)鋬?yōu)化的意義本來(lái)就建立在“必須保證一定互聯(lián)水平”的工程前提上。解決辦法有兩個(gè)方向一是給系統(tǒng)增加可靠性約束比如要求每個(gè)節(jié)點(diǎn)至少有一條外聯(lián)路徑或孤島負(fù)荷覆蓋率不低于某個(gè)閾值二是在目標(biāo)函數(shù)中加入線路數(shù)量的懲罰系數(shù)讓算法在“省投資”和“保互濟(jì)”之間自然權(quán)衡。5.3 矩陣幾乎全連接拓?fù)涫ハ∈栊赃@個(gè)坑跟5.2相反出現(xiàn)在省略建設(shè)成本或建設(shè)成本系數(shù)過低時(shí)。另一個(gè)誘因是閾值τ設(shè)得太小導(dǎo)致大量本該歸零的低功率元素被判定為有效線路。我的處理方式是在目標(biāo)函數(shù)里加一個(gè)“線路稀疏獎(jiǎng)勵(lì)項(xiàng)”即統(tǒng)計(jì)有效線路數(shù)量再乘一個(gè)較小的單位成本系數(shù)。同時(shí)在最終方案輸出前對(duì)所有線路做一次容量利用率篩選如果某條線路在多個(gè)典型場(chǎng)景下的平均傳輸功率都低于其容量的10%就把它剔除重新驗(yàn)算。5.4 運(yùn)行耗時(shí)過長(zhǎng)大規(guī)模矩陣優(yōu)化的計(jì)算量主要集中在目標(biāo)函數(shù)和約束函數(shù)上。如果每次計(jì)算都做雙層for循環(huán)掃描矩陣20節(jié)點(diǎn)可能還能忍50節(jié)點(diǎn)就非常吃力。改進(jìn)方法有三個(gè)。第一核心矩陣操作全部向量化用矩陣運(yùn)算替代逐元素for循環(huán)。第二用parfor對(duì)種群個(gè)體的適應(yīng)度進(jìn)行并行計(jì)算多核CPU直接跑滿。第三設(shè)置最大有效線路數(shù)量解碼時(shí)只統(tǒng)計(jì)前若干個(gè)最大元素其余直接視作零減少不必要的計(jì)算。5.5 結(jié)果復(fù)現(xiàn)性不好多次運(yùn)行差異大差分進(jìn)化算法本身帶有隨機(jī)性直接對(duì)比多輪結(jié)果時(shí)最優(yōu)值和目標(biāo)函數(shù)都會(huì)出現(xiàn)波動(dòng)。這屬于算法固有特性但工程上需要穩(wěn)定可復(fù)現(xiàn)的結(jié)果。建議在每次運(yùn)行前固定隨機(jī)種子并記錄隨機(jī)數(shù)生成器的狀態(tài)。正式匯報(bào)時(shí)保留三個(gè)關(guān)鍵指標(biāo)最優(yōu)解、多次運(yùn)行的中位數(shù)解、最優(yōu)解對(duì)應(yīng)的完整矩陣。同時(shí)采用“多次運(yùn)行取最優(yōu)”的策略比如連續(xù)運(yùn)行5次每次800代把最優(yōu)結(jié)果作為最終方案。我個(gè)人的體會(huì)是多微電網(wǎng)拓?fù)湓O(shè)計(jì)模型建模比算法調(diào)參重要得多。把工程需求翻譯成矩陣變量和約束條件這一步做踏實(shí)了剩下交給差分進(jìn)化算法去搜基本能在合理時(shí)間內(nèi)給出工程上可用的方案。如果你想在這套代碼上繼續(xù)擴(kuò)展可以考慮加入分布式協(xié)同進(jìn)化把大矩陣按區(qū)域拆分后并行優(yōu)化再通過邊界協(xié)調(diào)收斂到全局一致解這會(huì)進(jìn)一步提升大規(guī)模問題的求解能力。