当前位置: 首页 > article >正文

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

一、配电网重构原理

  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:sizepop
    if 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;
    else
        fitness_gbest(j) = 10^10; 
    end  
end                  
zbest = pop1(1,:);                            % 种群的历史最佳位置
forbidden=zbest;                              % 种群的禁忌对象
fitness_zbest = fitness_gbest(1);             % 种群的历史最佳适应度
for j=1:sizepop
    if 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 <= ger
    for 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:dim
            if  pop_v(j,i) > vlimit_max(i)
                pop_v(j,i) = vlimit_max(i);
            end
            if  pop_v(j,i) < vlimit_min(i)
                pop_v(j,i) = vlimit_min(i);
            end
        end
        
        %    更新位置并对位置进行边界处理
        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>=0
            if pop1(j,:)==forbidden
                [pop1(j,:),pop2(j,:),~,~]= CreatPSO_2(1,vlimit_max,vlimit_min);
            end
            success(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;
            else
                fitness_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;
        else
            success(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;
            else
                fitness_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 
    end
    record(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 on
    end
    title(['算法进度',num2str(iter/ger*100),'%,','最优方案断开支路:',num2str(pop22),',功率损耗:',num2str(fitness_zbest),'kW']);
    axis off
    hold 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 节点系统 及其他配电网重构问题的研究。

http://www.kler.cn/a/576783.html

相关文章:

  • 中性点不接地系统单相接地故障Matlab仿真
  • python 使用flask+sqlalchemy 实现简单数据查询接口
  • 【江协科技STM32】ADC数模转换器-学习笔记
  • MWC2025|5G与AI的深度融合势不可挡,赛思高精度时钟同步为其筑基!
  • 如何在Ubuntu上直接编译Apache Doris
  • 小方摄像头接入本地服务器的方法
  • 深入剖析MyBatis缓存机制:原理、源码与实战指南
  • 深度评测阿里云操作系统控制台:功能全面,体验卓越!
  • Debian系统grub新增启动项
  • 使用OpenCV来获取视频的帧率
  • element-plus表格操作列点击事件会触发行点击事件
  • Array and string offset access syntax with curly braces is deprecated
  • HTML-网页介绍
  • 解决电脑问题(1)——硬件问题
  • 【Redis事务】redis中事务的使用
  • 机试准备第12天
  • QTreeWidget指定子节点弹出菜单
  • [数据抓取] Python 网络爬虫 - 学习手册
  • 无人机热点共享无线连接技术概述
  • docker和kubectl客户端安装Linux