欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 汽车 > 新车 > 基于粒子群算法的配电网重构

基于粒子群算法的配电网重构

2025/3/10 15:54:06 来源:https://blog.csdn.net/jacksionrfdg/article/details/146122146  浏览:    关键词:基于粒子群算法的配电网重构

一、配电网重构原理

  1. 定义
    配电网重构是指在满足运行约束的前提下,通过改变开关状态优化配电网性能,提高系统的经济效益和运行效率。

  2. 拓扑约束

    • 配电网必须保持径向拓扑,避免环网或孤岛。
    • 采用算法控制开关状态的选择,确保有效拓扑。
  3. 算法特点

    • 配电网重构是一个 0-1 规划问题,决策变量为开关的开断状态。
    • 采用二进制粒子群优化算法(BPSO),并引入 Sigmoid 函数 映射粒子位置到 {0,1} 变量,以保证有效性。
  4. 示例系统

    • 使用33节点系统进行仿真,包括13个常闭分段开关和2个常开联络开关。
    • 通过优化选择开关断开位置,提高计算效率并减少无效状态。
  5. 目标函数

    • 选择网损最小作为优化目标。

二、代码组成

程序包含 10 个 MATLAB (.m) 文件,各文件功能如下:

  1. main_2_loss.m(主函数)

    • 采用二进制粒子群算法进行配电网重构。
    • 采用 3 种不同形式 存储粒子位置:
      • pop1:37维向量,每行 0/1(1 代表支路闭合,0 代表断开)。
      • pop2:5维向量,表示断开的 5 条支路编号。
      • pop3:5维向量,表示断开的支路在五个闭合回路中的编号。
    • 在每次更新前,计算适应度函数(网损最小最优)。
    • 调用 huanlu 判断方案是否存在环路或孤岛,若违反约束则适应度赋值极大,避免不合理方案。
  2. CreatPSO_2.m(粒子初始化)

    • 生成初始粒子,在每个回路随机断开一条支路,确保合理性。
  3. change_pop.m(粒子格式转换)

    • 负责 pop1pop2pop3 三种形式的转换,提高计算效率。
  4. huan.m(存储环路信息)

    • 记录每个环路中所有支路的编号,便于环路检测。
  5. point.m(存储节点信息)

    • 记录具有 2 条以上支路连接的节点,例如 point1 代表节点 3。
  6. huanlu.m(拓扑约束检测)

    • 判断粒子是否满足拓扑约束:
      • flag1-6:环路公共支路最多只能断开 1 条。
      • flag7-14:连接 3 条支路的节点最多只能断开 2 条。
    • 若满足约束输出 1,否则输出 0
  7. IEEE33.m(系统参数)

    • 记录 IEEE 33 节点系统的参数信息。
  8. set_up_2.m(算法参数设置)

    • 设定位置/速度上下限,定义算法搜索空间。
  9. loss.m(目标函数计算)

    • 计算系统网损,作为适应度函数的评估标准。
  10. sigmoid.m(Sigmoid 函数)

  • 映射粒子位置到 {0,1} 变量,确保粒子更新合理。

三、代码运行结果

主函数示例:

%二进制粒子群算法
%% 清空环境
clc;clear;
%% 读取数据
IEEE33;
%% 设置种群参数
sizepop = 50;                   % 初始种群个数
dim = 37;                       % 空间维数
ger = 22;                      % 最大迭代次数    
[xlimit_max,xlimit_min,vlimit_max,vlimit_min] = set_up_2();
c_1 = 0.8;                       % 惯性权重
c_2 = 1.5;                     % 自我学习因子
c_3 = 1.5;                     % 群体学习因子 
%% 生成初始种群
%  首先随机生成初始种群位置
%  然后随机生成初始种群速度
%  然后初始化个体历史最佳位置,以及个体历史最佳适应度
%  然后初始化群体历史最佳位置,以及群体历史最佳适应度
%  设置禁忌对象和其对应的持续迭代次数
[pop1,pop2,pop3,pop_v] = CreatPSO_2(sizepop,vlimit_max,vlimit_min);
pop=[pop1,pop2,pop3];
gbest = pop1;                                % 每个个体的历史最佳位置
success = huanlu(pop2);
L=5;%禁忌对象对应的持续迭代次数
for j=1:sizepopif success(j)
%         [SAIFI,SAIDI,CAIDI,ASAI,Lambda_load,Gamma_load,U_load] = reliability(pop1(j,:));
%         fitness_gbest(j) = SAIDI;                      % 每个个体的历史最佳适应度[V,u,Loss] = loss(pop2(j,:));fitness_gbest(j) = Loss;elsefitness_gbest(j) = 10^10; end  
end                  
zbest = pop1(1,:);                            % 种群的历史最佳位置
forbidden=zbest;                              % 种群的禁忌对象
fitness_zbest = fitness_gbest(1);             % 种群的历史最佳适应度
for j=1:sizepopif fitness_gbest(j) < fitness_zbest       % 如果求最小值,则为<; 如果求最大值,则为>; zbest = pop1(j,:);fitness_zbest=fitness_gbest(j);end
end
%% 粒子群迭代
%    更新速度并对速度进行边界处理    
%    更新位置并对位置进行边界处理
%    进行约束条件判断并计算新种群各个个体位置的适应度
%    新适应度与个体历史最佳适应度做比较
%    个体历史最佳适应度与种群历史最佳适应度做比较
%    再次循环或结束
iter = 1;                        %迭代次数
record = zeros(ger, 1);          % 记录器
record_average=zeros(ger, 1);
%画图的一些准备
node_location=[(1:14)',2*ones(14,1);(15:18)',2.5*ones(4,1);(2:5)',ones(4,1);(3:5)',4*ones(3,1);(6:13)',3*ones(8,1)];%节点的位置
line_plot=branch(:,2:3);
figure(1)
while iter <= gerfor j=1:sizepop%    更新速度并对速度进行边界处理 pop_v(j,:)= c_1 * pop_v(j,:) + c_2*rand*(gbest(j,:)-pop1(j,:))+c_3*rand*(zbest-pop1(j,:));% 速度更新for i=1:dimif  pop_v(j,i) > vlimit_max(i)pop_v(j,i) = vlimit_max(i);endif  pop_v(j,i) < vlimit_min(i)pop_v(j,i) = vlimit_min(i);endend%    更新位置并对位置进行边界处理S=sigmoid(pop_v(j,:));huan;index=zeros(1,5);duan=zeros(1,5);[~,index(1)]=min(S(huan1));duan(1)=huan1(index(1));huan2(huan2==duan(1))=[];[~,index(2)]=min(S(huan2));duan(2)=huan2(index(2));huan3([find(huan3==duan(1)),find(huan3==duan(2))])=[];[~,index(3)]=min(S(huan3));duan(3)=huan3(index(3));huan4([find(huan4==duan(1)),find(huan4==duan(2)),find(huan4==duan(3))])=[];[~,index(4)]=min(S(huan4));duan(4)=huan4(index(4));huan5([find(huan5==duan(1)),find(huan5==duan(2)),find(huan5==duan(3)),find(huan5==duan(4))])=[];[~,index(5)]=min(S(huan5));duan(5)=huan5(index(5));pop1(j,:)=ones(1,37);pop1(j,duan)=0;pop2(j,:)=duan;if L>=0if pop1(j,:)==forbidden[pop1(j,:),pop2(j,:),~,~]= CreatPSO_2(1,vlimit_max,vlimit_min);endsuccess(j) = huanlu(pop2(j,:));%    进行约束条件判断并计算新种群各个个体位置的适应度if success(j)
%                     [SAIFI,SAIDI,CAIDI,ASAI,Lambda_load,Gamma_load,U_load] = reliability(pop1(j,:));
%                     fitness_pop(j) = SAIDI;                      % 每个个体的历史最佳适应度     [V,u,Loss] = loss(pop2(j,:));fitness_pop(j) = Loss;elsefitness_pop(j) = 10^10; end  %    新适应度与个体历史最佳适应度做比较if fitness_pop(j) < fitness_gbest(j)       % 如果求最小值,则为<; 如果求最大值,则为>; gbest(j,:) = pop1(j,:);               % 更新个体历史最佳位置            fitness_gbest(j) = fitness_pop(j);     % 更新个体历史最佳适应度end   %    个体历史最佳适应度与种群历史最佳适应度做比较if fitness_gbest(j) < fitness_zbest        % 如果求最小值,则为<; 如果求最大值,则为>; zbest = gbest(j,:);                    % 更新群体历史最佳位置  fitness_zbest=fitness_gbest(j);        % 更新群体历史最佳适应度  end    L=L-1;elsesuccess(j) = huanlu(pop2(j,:));%    进行约束条件判断并计算新种群各个个体位置的适应度if success(j)
%                 [SAIFI,SAIDI,CAIDI,ASAI,Lambda_load,Gamma_load,U_load] = reliability(pop1(j,:));
%                 fitness_pop(j) = SAIDI;                      % 每个个体的历史最佳适应度[V,u,Loss] = loss(pop2(j,:));fitness_pop(j) = Loss;elsefitness_pop(j) = 10^10; end  %    新适应度与个体历史最佳适应度做比较if fitness_pop(j) < fitness_gbest(j)       % 如果求最小值,则为<; 如果求最大值,则为>; gbest(j,:) = pop1(j,:);               % 更新个体历史最佳位置            fitness_gbest(j) = fitness_pop(j);     % 更新个体历史最佳适应度end   %    个体历史最佳适应度与种群历史最佳适应度做比较if fitness_gbest(j) < fitness_zbest        % 如果求最小值,则为<; 如果求最大值,则为>; zbest = gbest(j,:);                    % 更新群体历史最佳位置  fitness_zbest=fitness_gbest(j);        % 更新群体历史最佳适应度  end    forbidden=zbest;  L=2;end endrecord(iter) = fitness_zbest;%最小值记录record_average(iter)=mean(fitness_gbest);%% 实时更新图像[~,pop22,~] = change_pop(zbest,1);line_copy=line_plot;line_copy(pop22,:)=[];for k=1:length(line_copy)m=[node_location(line_copy(k,1),1),node_location(line_copy(k,2),1)];n=[node_location(line_copy(k,1),2),node_location(line_copy(k,2),2)];plot(m,n,'bo-')hold onendtitle(['算法进度',num2str(iter/ger*100),'%,','最优方案断开支路:',num2str(pop22),',功率损耗:',num2str(fitness_zbest),'kW']);axis offhold off;pause(0.001);iter = iter+1; 
end
% pop2
%% 输出结果
disp(['最小功率损耗:',num2str(fitness_zbest),'kW'])
[MinV1,u1,Loss1] = loss(pop22);
[MinV2,u2,Loss2] = loss(33:37);
disp(['最低电压:',num2str(MinV1*12.66),'kV'])
disp(['断开的支路:',num2str(pop22)])
figure(1)
plot(1:ger,record)
title('算法收敛情况');
xlabel('迭代次数')
ylabel('种群最优适应度')
figure(2)
plot(1:33,u1,'r-o')
title('各节点电压');
xlabel('节点')
ylabel('电压幅值/kV')
hold on
plot(1:33,u2,'b-s')
legend('重构后的系统','初始系统')

代码运行结果

四、完整代码获取链接

代码下载链接:基于粒子群算法的配电网重构​ 一、配电网重构原理定义: 配电网重构是指在满足运行约束的前提下,通过改变开关状态优化配电网性能,提高系统的经济效益和运行效率。拓扑约束:配电网必须保持径向拓扑,避免环网或孤岛。采用算法控制开关状态的选择,确保有效拓扑。算法特点:配电网重构是一个 0-1 规划问题,决https://mbd.pub/o/bread/aJWakpty

五、总结

  • 该程序利用**二进制粒子群优化算法(BPSO)**实现配电网重构,通过优化开关状态减少网损,提高系统运行效率。
  • 采用 环路检测、约束条件控制、格式转换 等方法,保证优化方案合理,避免孤岛和环网结构。
  • 代码模块化清晰,适用于 IEEE 33 节点系统 及其他配电网重构问题的研究。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词