1 简介
资源优化是网络计划优化的重要组成部分,它包括资源均衡优化问题和资源有限条件下项目调度问题.由于近年来出现的智能算法不依赖于梯度信息和其它辅助知识,并适用于大规模复杂问题的求解,因此以遗传算法为代表的智能算法已成为进行资源优化的主要方法.许多学者提出了求解资源优化问题的各种遗传算法.现有的资源优化的遗传算法通常采用固定控制参数,在资源优化过程中可能陷入局部最优而且出现优化搜索效率低的问题.本文针对这些不足,将遗传算子和种群规模自适应策略有机结合,提出采用改进自适应遗传算法进行多项目资源优化,通过基于适应度基础上的个体寿命和个体年龄来调节种群规模以及遗传算子,使它们都能随着遗传算法的进程自适应变化.这样做的结果是可以提高优化效率和有效防止算法“早熟”.为了实现多个项目同时进行下的资源优化目标,本文将所有项目中的工序混合在一起进行编码,特别地针对资源有限条件下的多项目调度问题,通过引入0-1矩阵来表示多个项目各工序之间前行后继关系,避免了绘制与合并多项目网络计划图这一环节.最后通过MATLAB软件对参考文献中实例进行求解、并与其它算法优化结果进行对比,证明本算法能够取得较好的资源优化效果.
2 部分代码
function[]=main(N_gen,pcro,pmut)
clear;clc;
%遗传算法主函数
%用以实现求给定函数fun在给定区间[low,up]上的极大值
%pcro交叉概率,pmut变异概率,N_gen迭代次数
%改进地方:交叉率和变异率采用自适应,最优点采用最小值,判断是否越限改在交叉变异后,原来是在变异程序里
pcro1=0.9;
pcro2=0.6;
pmut1=0.1;
pmut2=0.05;
N_gen=150;
n=100; %种群个数
line=[1 1 2 0.0922 0.047 ;
2 2 3 0.0493 0.2511 ;
3 3 4 0.366 0.1864 ;
4 4 5 0.3811 0.1941 ;
5 5 6 0.8190 0.707 ;
6 6 7 0.1872 0.6188;
7 7 8 0.7114 0.2351 ;
8 8 9 1.03 0.74 ;
9 9 10 1.044 0.74;
10 10 11 0.1966 0.065 ;
11 11 12 0.3744 0.1238;
12 12 13 1.468 1.155 ;
13 13 14 0.5416 0.7129;
14 14 15 0.5910 0.526 ;
15 15 16 0.7463 0.5450 ;
16 16 17 1.289 1.7210 ;
17 17 18 0.7320 0.574;
18 2 19 0.164 0.1565 ;
19 19 20 1.5042 1.3554;
20 20 21 0.4095 0.4784;
21 21 22 0.7089 0.9373 ;
22 3 23 0.4512 0.3083 ;
23 23 24 0.8980 0.7091 ;
24 24 25 0.8960 0.7011 ;
25 6 26 0.2030 0.1034 ;
26 26 27 0.2842 0.1447 ;
27 27 28 1.059 0.9337;
28 28 29 0.8042 0.7006;
29 29 30 0.5075 0.2585 ;
30 30 31 0.9744 0.9630;
31 31 32 0.3105 0.3619 ;
32 32 33 0.3410 0.5362 ];
%line1为支路负荷
line1=[1 0 0;
2 100 60;
3 90 40;
4 120 80;
5 60 30;
6 60 20;
7 200 100;
8 200 100;
9 60 20;
10 60 20;
11 45 30;
12 60 35;
13 60 35;
14 120 80;
15 60 10;
16 60 20;
17 60 20;
18 90 40;
19 90 40;
20 90 40;
21 90 40;
22 90 40;
23 90 50;
24 420 200;
25 420 200;
26 60 25;
27 60 25;
28 60 20;
29 120 70;
30 200 600;
31 150 70;
32 210 100;
33 60 40];
LOAD=3715;%总有功负荷/KW
pmax=0.2*LOAD/0.9; % #功率因数0.9, 分布式电源接入总容量不超过系统总负荷20%# 825.5556KW
%%%ieee33 #功率基准值=10MVA,线电压基准值=12.66KV,总有功负荷=3715KW,总无功负荷=2300Kvar,根节点电压标幺值=1#
n_point=size(line1,1) ; %节点数
pop=encode(n_point,n,pmax); %用编码函数求得初始种群
gen=0;%代数初始化
j=1;
while(gen<=N_gen)
time(j)=j;
fval=zeros(1,n);%初始化函数值
fit=zeros(1,n);%初始化适应度
for i=1:n
fval(i)=fun(pop(i,:),line,line1,LOAD); %求个体的函数值,目标函数
end
fval_avg(time(j))=mean(fval);%记录每代个体函数值平均值
%fval=fval-min(fval);%保证适应度为正值
fsum=sum(fval);%总适应度
fit_avg=fsum/n;%计算种群适应度平均值
fit=fval/fsum;%求个体的适应度(归一化)
[fit1,index]=sort(fit); %将fit数组从小到大排序,并存在数组fit1中;同时,将对应的数组下标值存在数组index中
best=pop(index(1),:);%记录每代的最优值,保留在变量best中 #因为从小到大排列完,n=100时是最优个体#
% best_fit(1,gen+1)=fit1(index(n));
% best_fit(1,gen+1)=fval(index(1));
best_fit(1,gen+1)= fun(pop(index(1),:),line,line1,LOAD);
% avg_fit(1,gen+1)=fit_avg;
fval_best(time(j))=fun(best,line,line1,LOAD); %求出每代最优个体的函数值,保存在数组 fval_best中
q(1)=fit(1);
for i=2:n
q(i)=q(i-1)+fit(i);%累加个体适应度形成赌轮
end
pop=select(pop,q,n);%选择
pop=crossover(pop,pcro1,pcro2,n,n_point,pmax,fit1,fit_avg);%交叉
pop=mutation(pop,pmut1,pmut2,n,n_point,pmax,fit1,fit_avg);%变异
%***************添加的程序**********************
% 如果不加这段,交叉变异后有可能会越限,超过(分布式电源接入总容量不超过系统总负荷20%)
for ii=1:n
total_dg(ii)=sum(pop(ii,:));
end
for i=1:n
if total_dg(i)>(pmax/10)
pop(i,:)=floor(pop(i,:)*((pmax/10)/total_dg(i))); %化成小于1,#floor()不大于自变量的最大整数#
end
end
%****************************************************
pop(n,:)=best;%保留住每代的最优个体
gen=gen+1;%下一代
j=j+1;
end
%******************原来的程序********************
% maxf=-inf; %初始化maxf为负无穷大
% for i=1:n
% fval=fun(pop(i,:),line,line1,LOAD); %计算其函数值
% if fval>maxf %得到最终种群中的最优点及最优值
% maxf=fval;
% x0=pop(i,:);
% end
% end
% maxf,x0 %输出最大值以及此时的自变量
%***************************************************
%********************准备修改为******************
%目标函数是算成本、网络损耗等费用,所以应该求最小值
minf=inf; %初始化maxf为正无穷大
for i=1:n
fval=fun(pop(i,:),line,line1,LOAD); %计算其函数值
if fval<minf %得到最终种群中的最优点及最优值
minf=fval;
x0=pop(i,:);
end
end
%进行无功优化
[c,flmax]=C_optimization(x0,line,line1);%进行电容的优化配置
c
minf,10*x0 %输出最小值以及此时的自变量
%***************************************************
%*************添加显示图形程序****************
x1=zeros(1,33);
DS1_total=powerflow(x1,line,line1);
DS2_total=powerflow(x0,line,line1);
DS1_total
DS2_total
[U1,DS1]=xianshi(x1,line,line1);
[U2,DS2]=xianshi(x0,line,line1);
i=1:33;
figure(1);
plot(i,U1,'b:o');
hold on;
plot(i,U2,'g-*');
title('DG接入配电系统后的各节点电压的变化曲线');
xlabel('节点编号');
ylabel('节点电压');
legend('未接入DG','接入优化后的DG');
xlim([0 33]);
set(gca,'xtick',0:3:33);
j=1:32;
figure(2);
plot(j,100*DS1,'b:o');
hold on;
plot(j,100*DS2,'g-*');
title('DG接入配电系统后的各各支路损耗的变化曲线');
xlabel('各支路编号');
ylabel('各支路损耗KW');
legend('未接入DG','接入优化后的DG');
xlim([0 32]);
set(gca,'xtick',0:3:32);
figure(3)
gen=1:N_gen+1;
plot(gen,best_fit,'g-');
% hold on
% plot(gen,avg_fit,'b-o');
3 仿真结果
4 参考文献
[1]邓轶婧. 基于改进自适应遗传算法的多项目资源优化问题研究[D]. 河北工业大学, 2014.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。