【无功优化】基于教与学算法实现IEEE_33节点无功优化附matlab代码

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法       神经网络预测       雷达通信       无线传感器        电力系统

信号处理              图像处理               路径规划       元胞自动机        无人机 

⛄ 内容介绍

电力系统无功优化是保证系统安全,经济运行的有效手段,是提高电力系统电压质量的重要措施之一。无功优化的目的在于确定系统中无功设备的合理配置,以保证电网在满足一定的安全约束条件下,使系统的技术经济性能指标最好,即无功补偿设备的安装投资及电网的运行费用最小。 电力系统无功优化是一个多变量、多约束的混合非线性规划问题,其操作变量既有连续变量又有离散变量,其优化过程比较复杂。本文采用教与学优化算法求解无功优化问题,给出了运用教与学优化算法的相应求解步骡,并对部分参数的取值进行了讨论和调整。计算表明,该算法能够同时处理问题中的连续变量和离散变量,能够较好地协调全局搜索和局部搜索,并具有并行计算的特性以及较强的鲁棒性,可以取得令人满意的结果。 本文对IEEE30,IEEE57节点试验系统和石家庄高邑县电网进行了无功优化计算,取得了令人满意的结果,表明用教与学优化算法求解该问题是可行的、更有效的。

⛄ 部分代码

%% 清理内存空间

clc

clear

close all

%% 算法参数的设定

index=input('请选择测试函数:1-Sphere,2-Griewank,3-Rosenbrock,4-Ackley,5-Rastrign');

x_num=50;                                       % 班级人数

dim=2;                                          % 问题的维度/决策变量的个数

it_max=100;                                     % 最大迭代次数

[x_min,x_max,v_min,v_max]=set_pop(index,dim);   % 设置位置,速度的上下限

N_ES=3;                                         % 精英人数

%% 步骤1:班级初始化

x=x_min+rand(x_num,dim).*(x_max-x_min);         % 初始化班级

x_teacher=x(1,:);                               % 初始化老师位置

fitness=zeros(1,x_num);                         % 所有个体的适应度

fitness_new=zeros(1,x_num);                     % 更新后个体适应度

fitness_teacher=inf;                            % 初始化老师的适应度

% 初始的适应度

for k=1:x_num

    % 计算适应度值

    switch index

        case 1

            fitness(k)=Sphere(x(k,:));

        case 2

            fitness(k)=Griewank(x(k,:));

        case 3

            fitness(k)=Rosenbrock(x(k,:));

        case 4

            fitness(k)=Ackley(x(k,:));

        case 5

            fitness(k)=Rastrign(x(k,:));

        otherwise

            warning('输入有误,请重新输入')

    end

    if fitness(k)<fitness_teacher

        fitness_teacher=fitness(k);

        x_teacher=x(k,:);

    end

end

%% 迭代求最优解

for it=1:it_max

    %% 步骤2:选取并保留精英解

    [~,fitness_rank]=sort(fitness);

    ES_index=fitness_rank(1:N_ES);

    %% 步骤3:老师的教学

    x_mean=mean(x);

    TF=randi([1,2]);

    x_differance=rand*(x_teacher-x_mean);

    x_new=x+x_differance;

    for k=1:x_num

        % 计算适应度值

        switch index

            case 1

                fitness(k)=Sphere(x(k,:));

                fitness_new(k)=Sphere(x_new(k,:));

            case 2

                fitness(k)=Griewank(x(k,:));

                fitness_new(k)=Griewank(x_new(k,:));

            case 3

                fitness(k)=Rosenbrock(x(k,:));

                fitness_new(k)=Rosenbrock(x_new(k,:));

            case 4

                fitness(k)=Ackley(x(k,:));

                fitness_new(k)=Ackley(x_new(k,:));

            case 5

                fitness(k)=Rastrign(x(k,:));

                fitness_new(k)=Rastrign(x_new(k,:));

            otherwise

                warning('输入有误,请重新输入')

        end

        if fitness(k)>fitness_new(k)

            x(k,:)=x_new(k,:);

        end

    end

    %% 步骤4:学生之间互相学习

    for k=1:x_num

        studied_set=setdiff(1:x_num,k);

        studied_object=studied_set(randi([1,x_num-1]));

        if fitness(studied_object)<fitness(k)

            x_new(k,:)=x(k,:)+rand*(x(studied_object,:)-x(k,:));

        else

            x_new(k,:)=x(k,:)-rand*(x(studied_object,:)-x(k,:));

        end

        % 计算适应度值

        switch index

            case 1

                fitness(k)=Sphere(x(k,:));

                fitness_new(k)=Sphere(x_new(k,:));

            case 2

                fitness(k)=Griewank(x(k,:));

                fitness_new(k)=Griewank(x_new(k,:));

            case 3

                fitness(k)=Rosenbrock(x(k,:));

                fitness_new(k)=Rosenbrock(x_new(k,:));

            case 4

                fitness(k)=Ackley(x(k,:));

                fitness_new(k)=Ackley(x_new(k,:));

            case 5

                fitness(k)=Rastrign(x(k,:));

                fitness_new(k)=Rastrign(x_new(k,:));

            otherwise

                warning('输入有误,请重新输入')

        end

        if fitness(k)>fitness_new(k)

            x(k,:)=x_new(k,:);

        end

    end

    %% 步骤5:精英解替换最差学员。

    [~,fitness_rank]=sort(-fitness);

    worst_index=fitness_rank(1:N_ES);

    x(worst_index,:)=x(ES_index,:);

    %% 步骤6:重复个体裁剪

    [x_unique,ia,ic]=unique(x,'stable','rows');

    for kk=setdiff(1:x_num,ia)

        kkk=randi([1,dim]);

        x(kk,kkk)=x_min(kkk)+rand*(x_max(kkk)-x_min(kkk));

    end

    %% 更新越限的粒子

    for k=1:dim

        x(x(:,k)>x_max(k),k)=x_max(k);

        x(x(:,k)<x_min(k),k)=x_min(k);

    end

    %% 更新适应度值

    for k=1:x_num

        switch index

            case 1

                fitness(k)=Sphere(x(k,:));

            case 2

                fitness(k)=Griewank(x(k,:));

            case 3

                fitness(k)=Rosenbrock(x(k,:));

            case 4

                fitness(k)=Ackley(x(k,:));

            case 5

                fitness(k)=Rastrign(x(k,:));

            otherwise

                warning('输入有误,请重新输入')

        end

        if fitness(k)<fitness_teacher

            fitness_teacher=fitness(k);

            x_teacher=x(k,:);

        end

    end

    figure(1)

    scatter(x(:,1),x(:,2),100)

    title(['第',num2str(it),'次迭代粒子分布情况'])

%     axis([x_min(1) x_max(1) x_min(2) x_max(2)])

%     drawnow

%     F=getframe(gcf);

%     I=frame2im(F);

%     [I,map]=rgb2ind(I,256);

%     if it == 1

%         imwrite(I,map,'fun5.gif','gif', 'Loopcount',inf,'DelayTime',0.2);

%     else

%         imwrite(I,map,'fun5.gif','gif','WriteMode','append','DelayTime',0.2);

%     end

%     hold off

    pause(0.01)

end

⛄ 运行结果

⛄ 参考文献

[1] 武鲁晓.改进粒子群算法在电力系统无功优化中的应用[D].山东大学[2023-06-07].

[2] 佟金锴.含分布式电源的配电网无功优化算法研究[J].辽宁师专学报:自然科学版, 2018, 20(3):5.DOI:CNKI:SUN:LAON.0.2018-03-002.

[3] 李红伟,蒋嘉焱,刘青卓,等.基于改进教与学算法的配网多目标无功优化[J].控制工程, 2020, 27(5):6.DOI:CNKI:SUN:JZDF.0.2020-05-018.

[4] 刘小华.基于电网分区的配电网无功优化[D].西南交通大学,2015.

⛳️ 代码获取关注我

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值