一、遺傳算法簡介
1 引言

2 遺傳算法理論
2.1 遺傳算法的生物學基礎
2.2 遺傳算法的理論基礎
2.3 遺傳算法的基本概念
2.4 标準的遺傳算法
2.5 遺傳算法的特點
2.6 遺傳算法的改進方向
3 遺傳算法流程
4 關鍵參數說明
二、部分源代碼
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版本及參考文獻
1 matlab版本
2014a
2 參考文獻
《智能優化算法及其MATLAB執行個體(第2版)》包子陽 餘繼周 楊杉著 電子工業出版社