天天看點

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

一、遺傳算法簡介

1 引言

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2 遺傳算法理論

2.1 遺傳算法的生物學基礎

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2.2 遺傳算法的理論基礎

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2.3 遺傳算法的基本概念

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2.4 标準的遺傳算法

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2.5 遺傳算法的特點

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

2.6 遺傳算法的改進方向

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

3 遺傳算法流程

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

4 關鍵參數說明

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

二、部分源代碼

%%------------------------------------------------------
%利用遺傳算法對電動汽車有序充電進行優化;優化目标包括充電費用最低,充電時間達到要求(電動汽車充到足夠的電)
%考慮電動汽車充電對電網負荷的影響,使負荷峰谷差最小。
%--------------------------------------------------------
clc
clear
warning off
%實時電價資料導入,資料來源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)];% 設定車輛每天17:00之後才回家充電;每天7點之後就離家不充電
Num=100;%電動車數量
PEV=4;
global PEV
% load SOC_start
SOC_start=normrnd(0.3,0.05,1,Num);
global SOC_start
SOC_end=0.90*ones(1,Num);
global SOC_end
C=35; 
global C
number=Num;%種群中個體數量
%% 遺傳算法參數設定
NP=300;% 産生初始種群的總數
NG=80 ;% 疊代的 總次數
Pc=0.8;  
Pm=0.4;% 變異率
%% 産生初始種群
for i=1:NP
    data(i).Initial=Initial(number);
    data(i).generation=data(i).Initial;
end
%% 計算初始種群适應度
for i=1:NP
    data(i).Fitness=Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C);
end
intinial_Fitness_1=max([data(:).Fitness]);
%% 進行遺傳,交叉,變異
maxium_Fitness=[];
temp_Fitness=intinial_Fitness_1;
for k=1:NG
    sum_Fitness=sum([data(1:NP).Fitness]);                %所有個體适應值之和
    Px = [data(1:NP).Fitness]/sum_Fitness;                   %所有個體适應值的平均值
    PPx = 0;
    PPx(1) = Px(1);
    for i=2:NP                        %用于輪盤賭政策的機率累加
        PPx(i) = PPx(i-1) + Px(i);
    end
    for i=1:NP
        sita = rand();
        for n=1:NP
            if sita <= PPx(n)  
                SelFather = n;           %根據輪盤賭政策确定的父親
                break;
            end 
        end
        Selmother = floor(rand()*(NP-1))+1;  %随機選擇母親
        posCut = floor(rand()*(number-2)) + 1;     %随機确定交叉點
        r1 = rand();
        %% 交叉
        if r1<=Pc     %Pc為交叉率                               
            data1(i).generation(:,1:posCut) = data(SelFather).generation(:,1:posCut);
           data1(i).generation(:,(posCut+1):number) = data(Selmother).generation(:,(posCut+1):number);
            r2 = rand();
            %% 變異
            if r2 <= Pm                               % Pm變異率
                posMut = round(rand()*(number-1) + 1);
                for j=1:size(data1,2)
                    data1(j).generation(:,posMut)=generate( data1(j).generation(:,posMut));
                end
            end
            
        else
            data1(i).generation =data(SelFather).generation(:,:);
        end
    end
    %% 選擇
    for i=1:NP
      data(i).Fitness= Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C);   %子代适應值
    end
    for i=1:NP
      data1(i).Fitness= Fitness(data1(i).generation,PEV,Price,SOC_start,SOC_end,C);   %子代适應值
    end
    [value1,index1]=sort([data(1:NP).Fitness],'descend');
    [value2,index2]=sort([data1(1:NP).Fitness],'descend');
    j=1;
    for i=index1(1:NP/2)
        temp_1(j).p=data(i).generation;
        j=j+1;
    end
    j=1;
    for i=index2(1:NP/2)
        temp_2(j).p=data1(i).generation;
        j=j+1;
    end
    for i=1:NP/2
    data(i).generation =temp_1(i).p;
    end
    for i=1:NP/2
    data(NP/2+i).generation =temp_2(i).p;
    end
    for i=1:NP
      data(i).Fitness= Fitness(data(i).generation,PEV,Price,SOC_start,SOC_end,C);   %子代适應值
    end
    temp_Fitness=max([data(1:NP).Fitness]); 
    maxium_Fitness=[maxium_Fitness;temp_Fitness];

end
Fitness_initial= -inf;
for i=1:NP
    if data(i).Fitness> Fitness_initial
           INDEX=i;                                %取個體中的最好值作為最終結果
           Fitness_initial=data(i).Fitness;
    end
end
%% 遺傳算法結果可視化
figure(1)                                                                         
plot(-maxium_Fitness)% 畫出每一代最優個體的适應度
xlabel('遺傳代數')
ylabel('組合目标函數值')
title('進化過程')
FITNESS_NORMAL=-maxium_Fitness;
save FITNESS_NORMAL
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軸的資料顯示範圍
set(gca, 'XTick',[8,16,24,32,40,48] ); % X軸的記号點
set(gca, 'XTicklabel',{'4','8','12','16','20','24'}); % X軸的記号
xlabel('時間/h')
ylabel('負荷功率/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% 當地負荷曲線
plot(EV+Residential_load,'k-')% 疊加電動汽車後的當地負荷曲線
EV_BY=EV;
function Fitness_result=Fitness(X,PEV,Price,SOC_start,SOC_end,C)
%x矩陣是48*N  SOC_start是一個服從正态分布的1*N  SOC_start是一個的1*N的1矩陣
L=[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;
F1=sum(PEV.*Price*X)./1000;
EV_load=sum(X');
x=[EV_load(15:end),zeros(1,20),EV_load(1:14)];
F2=(max(L+x.*PEV)-min(L+x.*PEV))/100;
if sum(find((((SOC_end-SOC_start).*C)/(0.5*PEV)-sum(X))>0))+sum(find(((1.1-SOC_start).*C)/(0.5*PEV)-sum(X)<0))
    K1=1000000;
else
    K1=0;
end
Fitness_result=-(0.6*F1+0.4*F2+K1);
end

           

三、運作結果

【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】
【優化充電】遺傳算法求解電動汽車有序充電優化問題【Matlab 792期】

四、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

《智能優化算法及其MATLAB執行個體(第2版)》包子陽 餘繼周 楊杉著 電子工業出版社

繼續閱讀