目录
1 主要内容
目标函数
算法流程
2 部分程序
3 程序结果
4 程序链接
1 主要内容
该程序参考《自适应多目标差分进化算法在计及电压稳定性的无功优化中的应用》,以网损和电压偏差为目标,考虑DG无功出力和电容器组,建立多目标无功优化模型,并采用差分进化算法进行求解,在差分进化的寻优机制中嵌入非劣排序和拥挤距离排序以对种群实施选择操作,使算法快速收敛到 Pareto前沿的同时,保证了非劣解的均匀分布;对缩放因子和交叉概率进行自适应修正,避免对参数的反复试探 ,提高了算法的鲁棒性。并在IEEE33节点系统上进行验证。
-
目标函数
-
算法流程
2 部分程序
% ------------------------------------------------------------------------- % 基于改进多目标差分进化算法的配电网无功优化。 % 同时考虑网损和电压偏移2个目标函数。 % 控制变量包括:1.DG无功出力(节点2、13),2.并联电容器组数(节点6、31)。 % 算例为IEEE33节点系统 % ------------------------------------------------------------------------- clc clear %% ---------- 控制参数设置 ---------- % Ndg - DG个数 % Nc - 无功补偿点个数 % dim - 控制变量维数 % M - 优化目标的个数 % lower - 控制向量的下限 % upper - 控制向量的上限 % popSize - 种群大小 % F - 缩放因子 % CR - 交叉因子 % iterMax - 最大进化代数 Ndg = 2; Nc = 2; dim = Ndg + Nc; M = 2; % DG无功出力范围为-100kvar-500kvar,节点6的电容器组数为4组,节点31的电容器组数为7组 lower = [-100 -100 0 0]; upper = [500 500 4 7]; popSize = 40; iterMax = 200; % 为方便运算,将种群中个体对每个目标的适应度值和总体约束冲突值也保存在相应的个体中 pop = initialization(popSize, M, dim, Ndg, Nc, lower, upper); %% ---------------初始化控制参数矩阵--------------- F = zeros(popSize,1); CR = zeros(popSize,1); %% ---------- 开始迭代 ---------- for iter = 1 : iterMax parent = pop(:, 1 : (dim + M + 1)); for i = 1 : popSize % 随机选出4个个体,且i~=r1~=r2~=r3 while 2 > 1 r1 = floor(rand * popSize) + 1; if r1 ~= i break; end end while 2 > 1 r2 = floor(rand * popSize) + 1; if r2 ~= i & r2 ~= r1 break; end end while 2 > 1 r3 = floor(rand * popSize) + 1; if r3 ~= i & r3 ~= r1 & r3 ~= r2 break; end end % 对缩放因子和交叉概率进行自适应修正 Fk = 0.9 - 0.1*exp(iter/iterMax); CRk = 0.9 - 0.1*exp(iter/iterMax); F(i) = normrnd(Fk,0.1); CR(i) = normrnd(CRk,0.1); % 变异、交叉操作同时进行 randj = floor(rand * dim) + 1; % 连续控制变量 for j = 1 : Ndg if rand < CR(i) | j == randj candidate(i, j) = parent(r1, j) + F(i) * (parent(r2, j) - parent(r3, j)); else candidate(i,j) = parent(i, j); end % 越限处理 if candidate(i, j) < lower(1, j) candidate(i, j) = lower(1, j); end if candidate(i, j) > upper(1, j) candidate(i, j) = upper(1, j); end end % 离散控制变量 for j = Ndg + 1 : dim if rand < CR(i) | j == randj candidate(i, j) = round(parent(r1, j) + F(i) * (parent(r2, j) - parent(r3, j))); else candidate(i,j) = round(parent(i, j)); end % 越限处理 if candidate(i, j) < lower(1, j) candidate(i, j) = lower(1, j); end if candidate(i, j) > upper(1, j) candidate(i, j) = upper(1, j); end end % 评价生成的子代个体 candidate(i, (dim + 1) : (dim + M + 1)) = evaluation(candidate(i ,:), dim, Ndg, Nc); end % 选择操作,使生成的种群规模介于popSize和2*popSize之间 parent = parent(:, 1 : (dim + M + 1)); temp_pop = selection(parent, candidate, popSize, dim, M); % 对temp_pop进行快速非劣排序和拥挤距离计算 temp_pop = nondomination(temp_pop, M, dim); % 对temp_pop进行truncate,选出规模为popSize的种群 pop = truncation(temp_pop, M, dim, popSize); [m, n] = size(pop); temp_pop1 = zeros(m, n); if iter < iterMax-1 index = randperm(popSize); for i = 1 : popSize temp_pop1(i ,:) = pop(index(i) ,:); end pop = temp_pop1; end if mod(iter,10) == 0 disp ('迭代次数:') disp(iter); end end plot(pop(:,dim + 1),pop(:,dim + 2),'o'); xlabel('网损'); ylabel('电压偏差');
3 程序结果
附原文结果图
程序有详细文档和每个子函数作用文档,方便大家学习,注意:只有主函数可以运行,子函数是不能单独运行的!
4 程序链接
点击直达!