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;
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.
- 97.
- 98.
- 99.
- 100.
- 101.
- 102.
- 103.
- 104.
- 105.
- 106.
- 107.
- 108.
- 109.
- 110.
- 111.
- 112.
- 113.
- 114.
- 115.
- 116.
- 117.
- 118.
- 119.
- 120.
- 121.
- 122.
- 123.
- 124.
- 125.
- 126.
- 127.
- 128.
- 129.
- 130.
- 131.
- 132.
- 133.
- 134.
- 135.
- 136.
- 137.
- 138.
- 139.
- 140.
- 141.
- 142.
- 143.
- 144.
- 145.
- 146.
- 147.
- 148.
- 149.
- 150.
- 151.
- 152.
- 153.
- 154.
- 155.
- 156.
- 157.
- 158.
- 159.
- 160.
- 161.
- 162.
- 163.
- 164.
- 165.