(文章复现)《基于改进教与学算法的配电网无功优化》(含matlab代码)

首先列一下参考文献:基于改进教与学算法的配电网无功优化

一、算法原理

        教与学优化算法是模拟以班级为种群,通过教师的“教学 来提高班级中学员的整体水平的,通过不同学员之间“ 相互学习 再来提高个体成绩,从而优化种群 其中,教师和学员都相当于进化算法中的个体,每个学员所学科目数即控制变量的个数,也就是变量的维数;学员的成绩即函数适应值,教师就是适应值最好的个体。 分为 3 个步骤,具体如下

(1)初始化班级

(2)学生向教师学习

(3)学生之间互相学习

二、测试函数

 1.Sphere函数

 其中x的取值范围为[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Sphere(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2);
end

 2.Griewank函数

 其中,x的取值范围在[-600,600],最优解在[0 0...0]处取得,最优值为0。

function fitness=Griewank(pop)
    %取值范围[-600,600],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2)/4000-prod(cos(pop)./sqrt(1:length(pop)))+1;
end

3.Rosenbrock函数

其中x的取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0。

function fitness=Rosenbrock(pop)
    %取值范围[-5,10],最优解在[1 1...1]处取得,最优值为0
    fitness=sum((pop(1:end-1).^2-pop(2:end)).^2+(pop(1:end-1)-1).^2);
end

 4.Ackley函数

 其中x的取值范围在[-15,30],最优解在[0 0...0]处取得,最优值为0。原文中有个笔误,没有列出c的取值,c=20。

function fitness=Ackley(pop)
    %取值范围[-15,30],最优解在[0 0...0]处取得,最优值为0
    a=-0.2*sqrt(mean(pop.^2));
    b=mean(cos(20*pop));
    fitness=20+exp(1)-20*exp(a)-exp(b);
end

5.Rastrign函数

 其中x的取值范围在[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0。

function fitness=Rastrign(pop)
    %取值范围[-5.12,5.12],最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2-10*cos(2*pi*pop)+10);
end

三、matlab部分代码

        这部分展示一下基本TLBO算法的matlab程序,目标函数以Sphere函数为例。

1.算法参数设定

%% 算法参数的设定
x_num=50;                                       % 班级人数
dim=5;                                          % 问题的维度/决策变量的个数
it_max=100;                                     % 最大迭代次数
x_min=-10*ones(1,dim);                          % 粒子位置的下限值
x_max=10*ones(1,dim);                           % 粒子位置的上限值

2.初始化班级

%% 步骤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
    % 计算适应度值
    fitness(k)=Sphere(x(k,:));
    if fitness(k)<fitness_teacher
        fitness_teacher=fitness(k);
        x_teacher=x(k,:);
    end
end

3.迭代求最优解

%% 迭代求最优解
for it=1:it_max
    %% 步骤2:老师的教学
    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
        % 计算适应度值
        fitness(k)=Sphere(x(k,:));
        fitness_new(k)=Sphere(x_new(k,:));
        if fitness(k)>fitness_new(k)
            x(k,:)=x_new(k,:);
        end
    end
    %% 步骤3:学生之间互相学习
    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
        % 计算适应度值
        fitness(k)=Sphere(x(k,:));
        fitness_new(k)=Sphere(x_new(k,:));
        if fitness(k)>fitness_new(k)
            x(k,:)=x_new(k,:);
        end
    end
    for k=1:x_num
        % 更新适应度值
        fitness(k)=Sphere(x(k,:));
        if fitness(k)<fitness_teacher
            fitness_teacher=fitness(k);
            x_teacher=x(k,:);
        end
    end
    figure(1)
    scatter(x(:,1),x(:,2),100)
    axis([x_min(1) x_max(1) x_min(2) x_max(2)])
    pause(0.01)
end

4.Sphere函数

function fitness=Sphere(pop)
    %最优解在[0 0...0]处取得,最优值为0
    fitness=sum(pop.^2);
end

四、算法测试结果

        测试了一下五个基本的单目标优化函数,改进的TLBO算法都能快速求出最优解。

 1.Sphere函数

 2.Griewank函数

3.Rosenbrock函数

4.Ackley函数

5.Rastrign函数

        这个迭代结果有点意思,可以看出来在最优解附近存在许多次优解,所以才有粒子在那些位置停留。

五、文献复现结果

1.优化方案对比

        文章的结果是这样的

         自己写的代码跑出来是这样:

         最优解还是有点区别的哈,我们手动编程得到的结果还要更好些,我用的是matpower直接计算的潮流,文章是用的回路分析法,差别估计就在这。

2.节点电压对比

        这是文章的结果

        这是我们做的结果:

         还是有点差别的哈,原因估计也是潮流计算方法不一样。

 完整代码获取:

《基于改进教与学算法的配电网无功优化》matlab代码复现

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

配电网和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值