一、遺傳算法簡介
1 引言
2 遺傳算法理論
2.1 遺傳算法的生物學基礎
2.2 遺傳算法的理論基礎
2.3 遺傳算法的基本概念
2.4 标準的遺傳算法
2.5 遺傳算法的特點
2.6 遺傳算法的改進方向
3 遺傳算法流程
4 關鍵參數說明
二、部分源代碼
%%------------------------------------------------------
%利用遺傳算法對電動汽車有序充電進行優化;優化目标包括充電費用最低,充電時間達到要求(電動汽車充到足夠的電)
%考慮電動汽車充電對電網負荷的影響,使負荷峰谷差最小。
%--------------------------------------------------------
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版本及參考文獻
1 matlab版本
2014a
2 參考文獻
《智能優化算法及其MATLAB執行個體(第2版)》包子陽 餘繼周 楊杉著 電子工業出版社