首先列一下参考文献:基于改进教与学算法的配电网无功优化
一、算法原理
教与学优化算法是模拟以班级为种群,通过教师的“教学”来提高班级中学员的整体水平的,通过不同学员之间“相互学习”再来提高个体成绩,从而优化种群。其中,教师和学员都相当于进化算法中的个体,每个学员所学科目数即控制变量的个数,也就是变量的维数;学员的成绩即函数适应值,教师就是适应值最好的个体。分为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.节点电压对比
这是文章的结果
这是我们做的结果:
还是有点差别的哈,原因估计也是潮流计算方法不一样。