购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.2 MATLAB实现

本节主要介绍哈里斯鹰优化算法的MATLAB代码具体实现,主要包括种群初始化;适应度函数;边界检查和约束函数;Levy飞行函数;哈里斯鹰优化算法代码几个部分。

2.2.1 种群初始化

1.MATLAB随机数生成函数

随机数的生成采用MATLAB自带的随机数生成函数rand(),rand()生成[0,1]之间的随机数。

>> rand()

运行结果如下:

ans =

    0.5540

如果要一次性生成多个随机数,可以使用rand(row, col),其中row,col分别代表行和列,如rand(3,4)表示生成3行4列的范围在[0,1]之间的随机数。

>> rand(3,4)

运行结果如下:

如果要生成指定范围内的随机数,其表达式如下:

r = lb +( ub - lb )×rand()

式中, ub 代表范围的上边界, lb 代表范围的下边界。如在[0,3]范围内生成5个随机数:

ub = 3; %上边界
lb = 0; %下边界
r = (ub - lb).*rand(1,5) + lb

运行结果如下:

2.哈里斯鹰优化算法种群初始化函数编写

将哈里斯鹰优化算法种群初始化函数单独定义为一个函数,命名为initialization。利用随机数生成方式生成初始种群。

例如,设定种群数量为5,每个个体维度为3,每个维度的边界为[-3,3],利用初始化函数初始种群。

pop = 5; %种群数量
dim = 3; %每个个体维度
ub = [3,3,3]; %上边界
lb = [-3,-3,-3]; %下边界
position = initialization(pop,ub,lb,dim)

运行结果如下:

从运行结果可以看出,通过初始化函数得到的种群均在设定的上下边界范围内。

为了更加直观地表现随机初始化函数的效果,设定种群数量为20,个体维度为2,维度边界分别设置为[0,1]、[-2,-1]、[2,3],绘制3种范围的随机数生成结果,如图2.7所示。

pop = 20; %种群数量
dim = 2; %每个个体维度
ub = [1,1]; %上边界
lb = [0,0]; %下边界
position0 = initialization(pop, ub, lb, dim);
ub = [-1,-1]; %上边界
lb = [-2,-2]; %下边界
position1 = initialization(pop, ub, lb, dim);
ub = [3,3]; %上边界
lb = [2,2]; %下边界
position2 = initialization(pop, ub, lb, dim);
figure
plot(position0(:,1),position0(:,2),'bo');
hold on
plot(position1(:,1),position1(:,2),'b.');
plot(position2(:,1),position2(:,2),'bo');
grid on
title('不同随机数范围生成结果')
xlabel('X')
ylabel('Y')
legend('[0,1]','[-2,-1]','[2,3]')

图2.7 程序运行结果

从图2.7可以看出,生成的种群均在相应的边界范围内产生。

2.2.2 适应度函数

在学术研究与工程实践中优化问题是多种多样的,需要根据问题优化目标的不同设计相应的适应度函数(也称目标函数)。为了便于后续优化算法调用适应度函数,通常将适应度函数单独写成一个函数,命名为fun()。如定义一个适应度函数fun(),并存放在fun.m中,适应度函数fun()定义如下:

%% 适应度函数
function fitness = fun(x)
%x为输入一个个体,维度为dim
%fitness为输出的适应度
    fitness =sum(x.^2);
end

可以看出,适应函数fun()是 x 所有维度的平方和,如 x = [2,3],那么经过适应度函数计算后得到的值为13。

x=[2,3];
fitness = fun(x)

运行结果如下:

fitness =

    13

2.2.3 边界检查和约束函数

边界检查的目的是防止变量超过预先指定的范围,具体逻辑是当变量大于上边界( ub )时,将变量设为上边界;当变量小于下边界( lb )时,将变量设为下边界;当变量小于等于上边界( ub ),且大于等于下边界( lb )时,变量保持不变。形式化描述如下:

定义边界检查函数为BoundaryCheck。

如x = [0.5,2,-2,1],定义的上边界为[1,1,1,1],下边界为[-1,-1,-1,-1],经过边界检查和约束后,x应该为[0.5,1,-1,1]。

x = [0.5,1,-1,1];
ub = [1,1,1,1];
lb = [-1,-1,-1,-1];
x = BoundaryCheck(x)

运行结果如下:

2.2.4 Levy飞行函数

在2.1.3节中的渐进式快速俯冲的软包围和渐进式快速俯冲的硬包围策略中,已使用Levy飞行函数,其表达式如下:

式中, 是一个默认变量,通常情况下 取1.5, u v 是一个[0,1]范围内的随机变量。

为了方便调用将Levy飞行函数单独写成一个函数,命名为Levy。

用Levy飞行函数生成20组二维数据,观察其变化,二维Levy飞行函数变化图如图2.8所示。

图2.8 程序运行结果

%Levy飞行函数示意图
X=Levy(20);%20组数据的横坐标
Y=Levy(20);%20组数据的纵坐标
figure
plot(X,Y,'.-','LineWidth',1.5);
xlabel('X轴');
ylabel('Y轴');
grid on
title('二维Levy飞行函数示意图')

从图2.8可以看出,Levy飞行函数的轨迹随机性较强,有利于帮助哈里斯鹰的探索。

2.2.5 算法代码

由2.1节哈里斯鹰优化算法的基本原理编写哈里斯鹰优化算法的基本代码,定义哈里斯鹰优化算法的函数名称为HHO。

综上,哈里斯鹰优化算法的基本代码编写完成,可以通过函数HHO进行调用。下面将讲解如何使用上述哈里斯鹰优化算法解决优化问题。 p3YpR9e1sp2tEAK7HfPnpUP/38fhqXB2Cp+tnrZoGALpdNBF+0d6VrHeHHj8Z+32

点击中间区域
呼出菜单
上一章
目录
下一章
×