【優(yōu)化求解】基于遺傳算法實(shí)現(xiàn)電動(dòng)汽車有序充電matlab源碼
?一、遺傳算法概述
? ? ? ? 遺傳算法(Genetic Algorithm,GA)是進(jìn)化計(jì)算的一部分,是模擬達(dá)爾文的遺傳選擇和自然淘汰的生物進(jìn)化過(guò)程的計(jì)算模型,是一種通過(guò)模擬自然進(jìn)化過(guò)程搜索最優(yōu)解的方法。該算法簡(jiǎn)單、通用,魯棒性強(qiáng),適于并行處理。
二、遺傳算法的特點(diǎn)和應(yīng)用
? ?遺傳算法是一類可用于復(fù)雜系統(tǒng)優(yōu)化的具有魯棒性的搜索算法,與傳統(tǒng)的優(yōu)化算法相比,具有以下特點(diǎn):
1. 以決策變量的編碼作為運(yùn)算對(duì)象。
?? ?傳統(tǒng)的優(yōu)化算法往往直接利用決策變量的實(shí)際值本身來(lái)進(jìn)行優(yōu)化計(jì)算,但遺傳算法是使用決策變量的某種形式的編碼作為運(yùn)算對(duì)象。這種對(duì)決策變量的編碼處理方式,使得我們?cè)趦?yōu)化計(jì)算中可借鑒生物學(xué)中染色體和基因等概念,可以模仿自然界中生物的遺傳和進(jìn)化激勵(lì),也可以很方便地應(yīng)用遺傳操作算子。
2. 直接以適應(yīng)度作為搜索信息。
? ? 傳統(tǒng)的優(yōu)化算法不僅需要利用目標(biāo)函數(shù)值,而且搜索過(guò)程往往受目標(biāo)函數(shù)的連續(xù)性約束,有可能還需要滿足“目標(biāo)函數(shù)的導(dǎo)數(shù)必須存在”的要求以確定搜索方向。
? ? 遺傳算法僅使用由目標(biāo)函數(shù)值變換來(lái)的適應(yīng)度函數(shù)值就可確定進(jìn)一步的搜索范圍,無(wú)需目標(biāo)函數(shù)的導(dǎo)數(shù)值等其他輔助信息。直接利用目標(biāo)函數(shù)值或個(gè)體適應(yīng)度值也可以將搜索范圍集中到適應(yīng)度較高部分的搜索空間中,從而提高搜索效率。
3. 使用多個(gè)點(diǎn)的搜索信息,具有隱含并行性。
? ? 傳統(tǒng)的優(yōu)化算法往往是從解空間的一個(gè)初始點(diǎn)開(kāi)始最優(yōu)解的迭代搜索過(guò)程。單個(gè)點(diǎn)所提供的搜索信息不多,所以搜索效率不高,還有可能陷入局部最優(yōu)解而停滯;
? ? 遺傳算法從由很多個(gè)體組成的初始種群開(kāi)始最優(yōu)解的搜索過(guò)程,而不是從單個(gè)個(gè)體開(kāi)始搜索。對(duì)初始群體進(jìn)行的、選擇、交叉、變異等運(yùn)算,產(chǎn)生出新一代群體,其中包括了許多群體信息。這些信息可以避免搜索一些不必要的點(diǎn),從而避免陷入局部最優(yōu),逐步逼近全局最優(yōu)解。
4. 使用概率搜索而非確定性規(guī)則。
? ?傳統(tǒng)的優(yōu)化算法往往使用確定性的搜索方法,一個(gè)搜索點(diǎn)到另一個(gè)搜索點(diǎn)的轉(zhuǎn)移有確定的轉(zhuǎn)移方向和轉(zhuǎn)移關(guān)系,這種確定性可能使得搜索達(dá)不到最優(yōu)店,限制了算法的應(yīng)用范圍。
? ?遺傳算法是一種自適應(yīng)搜索技術(shù),其選擇、交叉、變異等運(yùn)算都是以一種概率方式進(jìn)行的,增加了搜索過(guò)程的靈活性,而且能以較大概率收斂于最優(yōu)解,具有較好的全局優(yōu)化求解能力。但,交叉概率、變異概率等參數(shù)也會(huì)影響算法的搜索結(jié)果和搜索效率,所以如何選擇遺傳算法的參數(shù)在其應(yīng)用中是一個(gè)比較重要的問(wèn)題。
綜上,由于遺傳算法的整體搜索策略和優(yōu)化搜索方式在計(jì)算時(shí)不依賴于梯度信息或其他輔助知識(shí),只需要求解影響搜索方向的目標(biāo)函數(shù)和相應(yīng)的適應(yīng)度函數(shù),所以遺傳算法提供了一種求解復(fù)雜系統(tǒng)問(wèn)題的通用框架。它不依賴于問(wèn)題的具體領(lǐng)域,對(duì)問(wèn)題的種類有很強(qiáng)的魯棒性,所以廣泛應(yīng)用于各種領(lǐng)域,包括:
函數(shù)優(yōu)化
組合優(yōu)化生產(chǎn)調(diào)度問(wèn)題
自動(dòng)控制
機(jī)器人學(xué)
圖像處理(圖像恢復(fù)、圖像邊緣特征提取......)
人工生命
遺傳編程
機(jī)器學(xué)習(xí)
三、遺傳算法的基本流程及實(shí)現(xiàn)技術(shù)
? ?基本遺傳算法(Simple Genetic Algorithms,SGA)只使用選擇算子、交叉算子和變異算子這三種遺傳算子,進(jìn)化過(guò)程簡(jiǎn)單,是其他遺傳算法的基礎(chǔ)。
3.1 遺傳算法的基本流程
?通過(guò)隨機(jī)方式產(chǎn)生若干由確定長(zhǎng)度(長(zhǎng)度與待求解問(wèn)題的精度有關(guān))編碼的初始群體;
通過(guò)適應(yīng)度函數(shù)對(duì)每個(gè)個(gè)體進(jìn)行評(píng)價(jià),選擇適應(yīng)度值高的個(gè)體參與遺傳操作,適應(yīng)度低的個(gè)體被淘汰;
經(jīng)遺傳操作(復(fù)制、交叉、變異)的個(gè)體集合形成新一代種群,直到滿足停止準(zhǔn)則(進(jìn)化代數(shù)GEN>=?);
將后代中變現(xiàn)最好的個(gè)體作為遺傳算法的執(zhí)行結(jié)果。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

其中,GEN是當(dāng)前代數(shù);M是種群規(guī)模,i代表種群數(shù)量。
3.2 遺傳算法的實(shí)現(xiàn)技術(shù)
基本遺傳算法(SGA)由編碼、適應(yīng)度函數(shù)、遺傳算子(選擇、交叉、變異)及運(yùn)行參數(shù)組成。
1.編碼
(1)二進(jìn)制編碼
二進(jìn)制編碼的字符串長(zhǎng)度與問(wèn)題所求解的精度有關(guān)。需要保證所求解空間內(nèi)的每一個(gè)個(gè)體都可以被編碼。
優(yōu)點(diǎn):編、解碼操作簡(jiǎn)單,遺傳、交叉便于實(shí)現(xiàn)
缺點(diǎn):長(zhǎng)度大
(2)其他編碼方法
格雷碼、浮點(diǎn)數(shù)編碼、符號(hào)編碼、多參數(shù)編碼等
2.適應(yīng)度函數(shù)
適應(yīng)度函數(shù)要有效反映每一個(gè)染色體與問(wèn)題的最優(yōu)解染色體之間的差距。
3.選擇算子
通過(guò)選擇算子模擬“優(yōu)勝劣汰”,適應(yīng)度高的個(gè)體被遺傳到下一代的概率較大,適應(yīng)度低的算子被遺傳到下一代的概率較小。
常用的選擇算法:輪盤賭選擇法,即令
表示群體的適應(yīng)度函數(shù)值的總和,
表示群體中第i個(gè)染色體的適應(yīng)度值,則它產(chǎn)生后代的能力剛好為其適應(yīng)度值所占的份額
4.交叉算子
交叉運(yùn)算是指對(duì)兩個(gè)相互配對(duì)的染色體按某種方式相互交換其部分基因,從而形成兩個(gè)新的個(gè)體;
交叉運(yùn)算是遺傳算法區(qū)別于其他進(jìn)化算法的重要特征,是產(chǎn)生新個(gè)體的主要方法。
在交叉之前需要將群體中的個(gè)體進(jìn)行配對(duì),一般采取隨機(jī)配對(duì)原則。
常用的交叉方式:
單點(diǎn)交叉
雙點(diǎn)交叉(多點(diǎn)交叉,交叉點(diǎn)數(shù)越多,個(gè)體的結(jié)構(gòu)被破壞的可能性越大,一般不采用多點(diǎn)交叉的方式)
均勻交叉
算術(shù)交叉
5.變異算子
遺傳算法中的變異運(yùn)算是指將個(gè)體染色體編碼串中的某些基因座上的基因值用該基因座的其他等位基因來(lái)替換,從而形成一個(gè)新的個(gè)體。
就遺傳算法運(yùn)算過(guò)程中產(chǎn)生新個(gè)體的能力方面來(lái)說(shuō),交叉運(yùn)算是產(chǎn)生新個(gè)體的主要方法,它決定了遺傳算法的全局搜索能力;而變異運(yùn)算只是產(chǎn)生新個(gè)體的輔助方法,但也是必不可少的一個(gè)運(yùn)算步驟,它決定了遺傳算法的局部搜索能力。交叉算子與變異算子的共同配合完成了其對(duì)搜索空間的全局搜索和局部搜索,從而使遺傳算法能以良好的搜索性能完成最優(yōu)化問(wèn)題的尋優(yōu)過(guò)程。
6.運(yùn)行參數(shù)
編碼長(zhǎng)度。編碼長(zhǎng)度取決于問(wèn)題解的精度,精度越高,編碼越長(zhǎng);
種群規(guī)模。規(guī)模小,收斂快但降低了種群的多樣性,
;
交叉概率。較大的交叉概率容易破壞種群中已形成的優(yōu)良結(jié)構(gòu),使搜索具有太大隨機(jī)性;較小的交叉概率發(fā)現(xiàn)新個(gè)體的速度太慢,一般取值為

變異概率。變異概率太小,則變異操作產(chǎn)生新個(gè)體的能力和抑制早熟現(xiàn)象的能力會(huì)較差;變異概率過(guò)高隨機(jī)性過(guò)大,一般建議取值范圍為0.005~0.01
終止進(jìn)化代數(shù)。算法運(yùn)行結(jié)束的條件之一,一般取100~1000
四、源代碼
%%------------------------------------------------------
%利用遺傳算法對(duì)電動(dòng)汽車有序充電進(jìn)行優(yōu)化;優(yōu)化目標(biāo)包括充電費(fèi)用最低,充電時(shí)間達(dá)到要求(電動(dòng)汽車充到足夠的電)
%考慮電動(dòng)汽車充電對(duì)電網(wǎng)負(fù)荷的影響,使負(fù)荷峰谷差最小。
%--------------------------------------------------------
clc
clear
warning off
%實(shí)時(shí)電價(jià)數(shù)據(jù)導(dǎo)入,數(shù)據(jù)來(lái)源PJM
RP=[3.10000000000000,3.05000000000000,3,2.80000000000000,2.60000000000000,2.55000000000000,2.50000000000000,2.60000000000000,2.70000000000000,2.80000000000000,2.90000000000000,3.20000000000000,3.50000000000000,3.60000000000000,3.70000000000000,3.67500000000000,3.65000000000000,3.70000000000000,3.75000000000000,3.82500000000000,3.90000000000000,3.92500000000000,3.95000000000000,4.02500000000000,4.10000000000000,4.15000000000000,4.20000000000000,4.20500000000000,4.21000000000000,4.28000000000000,4.35000000000000,4.42500000000000,4.50000000000000,4.60000000000000,4.70000000000000,4.62000000000000,4.54000000000000,4.39500000000000,4.25000000000000,4.22500000000000,4.20000000000000,4.05000000000000,3.90000000000000,3.60000000000000,3.30000000000000,3.20000000000000,3.10000000000000,3.10000000000000];
Price=[RP(35:48),RP(1:14)];% 設(shè)定車輛每天17:00之后才回家充電;每天7點(diǎn)之后就離家不充電
Num=100;%電動(dòng)車數(shù)量
PEV=4;
global PEV
% load SOC_start
SOC_start=normrnd(0.3,0.05,1,Num);
global SOC_start
SOC_end=0.95*ones(1,Num);
global SOC_end
C=35;
global C
number=Num;%種群中個(gè)體數(shù)量
%% 遺傳算法參數(shù)設(shè)定
NP=300;% 產(chǎn)生初始種群的總數(shù)
NG=80 ;% 迭代的 總次數(shù)
Pc=0.8; ?
Pm=0.4;% 變異率
COUNTER=10;
%% 產(chǎn)生初始種群
for i=1:NP
? ?data(i).Initial=Initial(number);
? ?data(i).generation=data(i).Initial;
end
%% 計(jì)算初始種群適應(yīng)度
end
Fitness_initial= -inf;
for i=1:NP
? ?if data(i).Fitness> Fitness_initial
? ? ? ? ? INDEX=i; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?%取個(gè)體中的最好值作為最終結(jié)果
? ? ? ? ? Fitness_initial=data(i).Fitness;
? ?end
end
%% 遺傳算法結(jié)果可視化
figure(1) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
plot(-maxium_Fitness)% 畫出每一代最優(yōu)個(gè)體的適應(yīng)度
xlabel('遺傳代數(shù)')
ylabel('組合目標(biāo)函數(shù)值')
title('進(jìn)化過(guò)程')
FITNESS_JY=-maxium_Fitness;
save FITNESS_JY
figure(2)
EV_load=sum(data(INDEX).generation');
EV=[EV_load(15:end),zeros(1,20),EV_load(1:14)];
plot(EV*PEV)
set(gca, 'XLim',[1 48]); % X軸的數(shù)據(jù)顯示范圍
set(gca, 'XTick',[8,16,24,32,40,48] ); % X軸的記號(hào)點(diǎn)
set(gca, 'XTicklabel',{'4','8','12','16','20','24'}); % X軸的記號(hào)
xlabel('時(shí)間/h')
ylabel('負(fù)荷功率/kW')
figure(3)
Residential_load=[1962.55433333333,1617.09200000000,1397.80300000000,1240.56566666667,1139.44666666667,1087.19533333333,1047.75966666667,1039.21600000000,1025.50600000000,1055.46700000000,1082.60533333333,1130.10900000000,1361.02566666667,1719.95200000000,2047.19933333333,2384.35633333333,2527.08400000000,2849.10700000000,3038.91600000000,3026.13366666667,2888.03833333333,2787.28300000000,2730.16333333333,2762.67133333333,2965.20133333333,3403.65066666667,3292.44533333333,3011.74400000000,2804.51133333333,2717.41300000000,2834.95466666667,3040.08966666667,3160.87966666667,3381.25666666667,3864.43433333333,4218.04066666667,4372.06066666667,4467.65866666667,4694.08000000000,4610.18166666667,4374.74966666667,4266.39233333333,4200.47800000000,4027.01666666667,3845.33500000000,3510.83266666667,3183.25400000000,2515.23000000000]*0.1;
plot(Residential_load,'r-');hold on% 當(dāng)?shù)刎?fù)荷曲線
plot(EV+Residential_load,'k-')% 疊加電動(dòng)汽車后的當(dāng)?shù)刎?fù)荷曲線
EV_JY=EV;
save EV_JY
set(gca, 'YLim',[100 600]); % X軸的數(shù)據(jù)顯示范圍
set(gca, 'XLim',[1 48]); % X軸的數(shù)據(jù)顯示范圍
set(gca, 'XTick',[8,16,24,32,40,48] ); % X軸的記號(hào)點(diǎn)
set(gca, 'XTicklabel',{'4','8','12','16','20','24'}); % X軸的記號(hào)
xlabel('時(shí)間/h')
ylabel('負(fù)荷功率/kW')
legend('區(qū)域負(fù)荷功率曲線(不含電動(dòng)汽車)','location','northwest','區(qū)域負(fù)荷功率曲線(包含電動(dòng)汽車)','location','northwest') ? ?
五、運(yùn)行結(jié)果


