天天看點

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

一、遺傳算法簡介

1 引言

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2 遺傳算法理論

2.1 遺傳算法的生物學基礎

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2.2 遺傳算法的理論基礎

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2.3 遺傳算法的基本概念

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2.4 标準的遺傳算法

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2.5 遺傳算法的特點

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

2.6 遺傳算法的改進方向

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

3 遺傳算法流程

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】
【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

4 關鍵參數說明

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

二、部分源代碼

clc
clear

%--------------------擷取資料-----------------------
PBase=fopen('PBase.txt');                      
Pbase(1,:)=fscanf(PBase,'%g',[1,inf]);       %Pbase    電網基礎負荷功率 96個時段
fclose(PBase);  
carnum=100;                                %carnumal 給定接入汽車數量
% carnum0=0.25*carnumal;                        %carnum0  緊急充電汽車數量
% carnum=carnumal-carnum0;                     %carnum   正常充電汽車數量
ET=36;                                       %ET       給定汽車電池容量
ptSOC0=normrnd(0.2,0.05,1,carnum);           %ptSOC0   服從正态分布的電池狀态
pch=[7,1.5];                                 %pch      恒功率充電
Pmax=2400;                                   %Pmax     給定電網允許最大功率
tin=normrnd(19,1,1,carnum);                  %tin      各電動汽車接入時間
Te=normrnd(7,0.5,1,carnum);                  %Te       使用者設定充電完成時間
timeT=zeros(1,carnum);                       %timeT    各電動汽車充電所需時間

ptSOC=ptSOC0;
for i=1:carnum
    while ptSOC(1,i)<0.9                     %充電功率 SOC<90%
      ptSOC(1,i)=ptSOC(1,i)+0.25*pch(1)/ET;
      timeT(1,i)=timeT(1,i)+0.25;
    end                                      %充電功率 SOC>=90%
    timeT(1,i)=timeT(1,i)+(1-ptSOC(1,i))*ET/pch(2);
end
%--------------------無序充電-----------------------
cartime=carT(carnum,tin,timeT);              %以汽車接入時間作為充電開始時間
a=sum(cartime,2);
Ptotal=zeros(1,96);
for i=1:96
    Ptotal(1,i)=Pbase(i)+pch(1)*a(i);
end
PTotal=fopen('d:\PTotal.txt','wt');
fprintf(PTotal,'%g \n',Ptotal);
fclose(PTotal);
%--------------------緊急充電-----------------------
% 
% tsSOC0=normrnd(0.3,0.05,1,carnum0);          %tsSOC0   服從正态分布的電池狀态
% tin0=24.*rand(1,carnum0);                    %tin0     特殊電動汽車接入時間随機分布
% tsSOCe=normrnd(0.8,0.05,1,carnum0);          %tsSOCe   使用者設定期望電池狀态
% timeT0=zeros(1,carnum0);                     %timeT0   恒功率充電時長
% for i=1:carnum0                      
%       timeT0(1,i)=ET*(tsSOCe(i)-tsSOC0(i))/pch(1);                               
% end
% cartime=carT(carnum0,tin0,timeT0);           %以汽車接入時間作為充電開始時間
% a=sum(cartime,2);
% for i=1:96
%     Pbase(i)=Pbase(i)+pch(1)*a(i);
% end

%------------------遺傳算法優化---------------------
maxgen=8000;                                 %maxgen   終止進化代數
sizepop=20;                                  %sizepop  種群規模                                             
pcross=0.8;                                  %pcross   雜交機率
pmutation=0.05;                              %pmutation變異機率
bound=[tin;Te-timeT+24];                     %bound    限制範圍
%種群初始化
ton=zeros(1,carnum);                         %ton      各電動汽車充電開始時間
carpop=struct('fitness',zeros(1,sizepop),'chrom',[]);      
for i=1:sizepop                              %carpop   初始種群随機指派
    a=rand(1,carnum);
    for j=1:carnum
        ton(1,j)=bound(1,j)+a(j)*(bound(2,j)-bound(1,j));
    end
    carpop.chrom(i,:)=ton;                   %chrom    染色體群,即ton集合
    %carpop.fitness(i)=fit1(carnum,ton,timeT,Pbase,pch);
    carpop.fitness(i)=fit2(carnum,ton,timeT,Pbase,pch);
end

%找出目前最優解(适應度最小的染色體)                                                          
[bestfit,bestindex]=min(carpop.fitness);    
bestton=carpop.chrom(bestindex,:);           %bestton  最優充電開始時間   
avgfit=sum(carpop.fitness)/sizepop;          %avgfit   适應度平均值

%進化開始
for i=1:maxgen                              
    carpopC=struct('fitness',[],'chrom',[]);
    carpopC.chrom=Cross(pcross,carnum,carpop.chrom,sizepop,bound);
   
    carpopM.chrom=Mutation(pmutation,carnum,carpop.chrom,sizepop,[i,maxgen],bound);
    for j=1:sizepop
        ton=carpopC.chrom(j,:);
        %carpopC.fitness(1,j)=fit1(carnum,ton,timeT,Pbase,pch);
        carpopC.fitness(1,j)=fit2(carnum,ton,timeT,Pbase,pch);
    end
    for j=1:sizepop
        ton=carpopM.chrom(j,:);
        %carpopM.fitness(1,j)=fit1(carnum,ton,timeT,Pbase,pch);
        carpopM.fitness(1,j)=fit2(carnum,ton,timeT,Pbase,pch);
    end
    carpop=Select0(carpop,carpopC,carpopM,sizepop);
    [newbestfit,newbestindex]=min(carpop.fitness);
    if  bestfit>newbestfit
        bestfit=newbestfit;
      
    end
    avgfit=sum(carpop.fitness)/sizepop;
end

% bestfit=Pmax;
% maxgen=5000;
% for i=1:maxgen                              
%     carpopC=struct('fitness',[],'chrom',[]);
%     carpopC.chrom=Cross(pcross,carnum,carpop.chrom,sizepop,bound);
%     carpopM=struct('fitness',[],'chrom',[]);
%     carpopM.chrom=Mutation(pmutation,carnum,carpop.chrom,sizepop,[i,maxgen],bound);
%     for j=1:sizepop
%         ton=carpopC.chrom(j,:);
%         carpopC.fitness(1,j)=fit1(carnum,ton,timeT,Pbase,pch);
%         %carpopC.fitness(1,j)=fit2(carnum,ton,timeT,Pbase,pch);
%     end
%     for j=1:sizepop
%         ton=carpopM.chrom(j,:);
%         carpopM.fitness(1,j)=fit1(carnum,ton,timeT,Pbase,pch);
%         %carpopM.fitness(1,j)=fit2(carnum,ton,timeT,Pbase,pch);
%     end
%     carpop=Select0(carpop,carpopC,carpopM,sizepop);
%     [newbestfit,newbestindex]=min(carpop.fitness);
%     if  bestfit>newbestfit
%         bestfit=newbestfit;
%         bestton=carpop.chrom(newbestindex,:);
%     end
%     avgfit=sum(carpop.fitness)/sizepop;
% end
function ret=Cross(pcross,carnum,chrom,sizepop,bound)  %交叉後代
for i=1:sizepop                       
    pick=rand(1,2);                    %随機選擇兩個染色體作為交叉父代
    while prod(pick)==0
         pick=rand(1,2);
    end
    index=ceil(pick.*sizepop);         
    pick=rand;                         %随機數與交叉機率比較 決定是否交叉
    while pick==0
        pick=rand;
    end
    if pick>pcross
        continue;
    end
    flag=0;
    while flag==0                      %随機選擇交叉位置
        pick=rand;
        while pick==0
            pick=rand;
        end
        pos=ceil(pick*carnum);
       
        pick=rand;                     %開始交叉
        x1=chrom(index(1),pos);
        x2=chrom(index(2),pos);
        x1=pick*x2+(1-pick)*x1;
        x2=pick*x1+(1-pick)*x2;
        flag1=test(x1,bound(:,pos));          %檢查可行性
        flag2=test(x2,bound(:,pos));
        if flag1*flag2==0
             flag=0;
        else flag=1; 
             chrom(index(1),pos)=x1;
             chrom(index(2),pos)=x2;
        end 
    end
end
ret=chrom;
        
        
           

三、運作結果

【優化充電】遺傳算法求解電動汽車充電管理優化問題【Matlab 1178期】

四、matlab版本及參考文獻

1 matlab版本

2014a

2 參考文獻

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

繼續閱讀