Python&Matlab实现灰狼优化算法的示例代码


Posted in Python onMarch 21, 2022

1 灰狼优化算法基本思想

灰狼优化算法是一种群智能优化算法,它的独特之处在于一小部分拥有绝对话语权的灰狼带领一群灰狼向猎物前进。在了解灰狼优化算法的特点之前,我们有必要了解灰狼群中的等级制度。

Python&Matlab实现灰狼优化算法的示例代码

灰狼群一般分为4个等级:处于第一等级的灰狼用α表示,处于第二阶级的灰狼用β表示,处于第三阶段的灰狼用δ表示,处于第四等级的灰狼用ω表示。按照上述等级的划分,灰狼α对灰狼β、δ和ω有绝对的支配权;灰狼ω对灰狼δ和ω有绝对的支配权;灰狼δ对灰狼ω有绝对的支配权。

2 灰狼捕食猎物过程

GWO 优化过程包含了灰狼的社会等级分层、跟踪、包围和攻击猎物等步骤,其步骤具体情况如下所示。

2.1 社会等级分层

当设计 GWO 时,首先需构建灰狼社会等级层次模型。计算种群每个个体的适应度,将狼群中适应度最好的三匹灰狼依次标记为α、β、δ而剩下的灰狼标记为ω 。也就是说,灰狼群体中的社会等级从高往低排列依次为α、β、δ及 ω。GWO 的优化过程主要由每代种群中的最好三个解(即 α、β、δ)来指导完成。

2.2 包围猎物

灰狼群体通过以下几个公式逐渐接近并包围猎物:

Python&Matlab实现灰狼优化算法的示例代码

式中,t是当前的迭代代数,A和C是系数向量,Xp和X分别是猎物的位置向量和灰狼的位置向量。A和C的计算公式如下:  

Python&Matlab实现灰狼优化算法的示例代码

式中,a是收敛因子,随着迭代次数从2线性减小到0,r1和r 2服从[ 0,1]之间的均匀分布。

2.3 狩猎

狼群中其他灰狼个体Xi根据α、β和百的位置Xa、XB和Xo来更新各自的位置:

Python&Matlab实现灰狼优化算法的示例代码

式中,Da,Dβ和D6分别表示a,β和5与其他个体间的距离;Xa,Xβ和X6分别代表a,β和5的当前位置;C1,C2,C3是随机向量,X是当前灰狼的位置。

灰狼个体的位置更新公式如下:

Python&Matlab实现灰狼优化算法的示例代码

2.4 攻击猎物

构建攻击猎物模型的过程中,根据2)中的公式,a值的减少会引起 A 的值也随之波动。换句话说,A 是一个在区间[-a,a](备注:原作者的第一篇论文里这里是[-2a,2a],后面论文里纠正为[-a,a])上的随机向量,其中a在迭代过程中呈线性下降。当 A 在[-1,1]区间上时,则捜索代理(Search Agent)的下一时刻位置可以在当前灰狼与猎物之间的任何位置上。

2.5 寻找猎物

灰狼主要依赖α、β、δ的信息来寻找猎物。它们开始分散地去搜索猎物位置信息,然后集中起来攻击猎物。对于分散模型的建立,通过|A|>1使其捜索代理远离猎物,这种搜索方式使 GWO 能进行全局搜索。GWO 算法中的另一个搜索系数是C。从2.2中的公式可知,C向量是在区间范围[0,2]上的随机值构成的向量,此系数为猎物提供了随机权重,以便増加(|C|>1)或减少(|C|<1)。这有助于 GWO 在优化过程中展示出随机搜索行为,以避免算法陷入局部最优。值得注意的是,C并不是线性下降的,C在迭代过程中是随机值,该系数有利于算法跳出局部,特别是算法在迭代的后期显得尤为重要。

3 实现步骤及程序框图

3.1 步骤

Step1:种群初始化:包括种群数量N,最大迭代次数Maxlter,调控参数a,A,C.

Step2:根据变量的上下界来随机初始化灰狼个体的位置X。

Step3:计算每一头狼的适应度值,并将种群中适应度值最优的狼的位置信息保存Xα,将种群中适应度值次优的狼的位置信息保存为Xβ,将种群中适应度第三优的灰狼的位置信息保存为Xγ

Step4:更新灰狼个体X的位置。

step5:更新参数a,A和C。

Step6:计算每一头灰狼的适应度值,并更新三匹头狼的最优位置。

Step7:判断是否到达最大迭代次数Maxlter,若满足则算法停止并返回Xa的值作为最终得到的最优解,否则转到Step4。

3.2 程序框图

Python&Matlab实现灰狼优化算法的示例代码

4 Python代码实现

#=======导入线管库======
import random
import numpy
 
#完整代码见微信公众号:电力系统与算法之美
#输入关键字:灰狼算法
 
def GWO(objf, lb, ub, dim, SearchAgents_no, Max_iter):
 
    #===初始化 alpha, beta, and delta_pos=======
    Alpha_pos = numpy.zeros(dim)  # 位置.形成30的列表
    Alpha_score = float("inf")  # 这个是表示“正负无穷”,所有数都比 +inf 小;正无穷:float("inf"); 负无穷:float("-inf")
 
    Beta_pos = numpy.zeros(dim)
    Beta_score = float("inf")
 
    Delta_pos = numpy.zeros(dim)
    Delta_score = float("inf")  # float() 函数用于将整数和字符串转换成浮点数。
 
    #====list列表类型=============
    if not isinstance(lb, list):  # 作用:来判断一个对象是否是一个已知的类型。 其第一个参数(object)为对象,第二个参数(type)为类型名,若对象的类型与参数二的类型相同则返回True
        lb = [lb] * dim  # 生成[100,100,.....100]30个
    if not isinstance(ub, list):
        ub = [ub] * dim
 
    #========初始化所有狼的位置===================
    Positions = numpy.zeros((SearchAgents_no, dim))
    for i in range(dim):  # 形成5*30个数[-100,100)以内
        Positions[:, i] = numpy.random.uniform(0, 1, SearchAgents_no) * (ub[i] - lb[i]) + lb[
            i]  # 形成[5个0-1的数]*100-(-100)-100
    Convergence_curve = numpy.zeros(Max_iter)
 
    #========迭代寻优=====================
    for l in range(0, Max_iter):  # 迭代1000
        for i in range(0, SearchAgents_no):  # 5
            #====返回超出搜索空间边界的搜索代理====
            for j in range(dim):  # 30
                Positions[i, j] = numpy.clip(Positions[i, j], lb[j], ub[
                    j])  # clip这个函数将将数组中的元素限制在a_min(-100), a_max(100)之间,大于a_max的就使得它等于 a_max,小于a_min,的就使得它等于a_min。
 
        
 
        #===========以上的循环里,Alpha、Beta、Delta===========
        a = 2 - l * ((2) / Max_iter);  #   a从2线性减少到0
 
        for i in range(0, SearchAgents_no):
            for j in range(0, dim):
                r1 = random.random()  # r1 is a random number in [0,1]主要生成一个0-1的随机浮点数。
                r2 = random.random()  # r2 is a random number in [0,1]
 
                A1 = 2 * a * r1 - a;  # Equation (3.3)
                C1 = 2 * r2;  # Equation (3.4)
                # D_alpha表示候选狼与Alpha狼的距离
                D_alpha = abs(C1 * Alpha_pos[j] - Positions[
                    i, j]);  # abs() 函数返回数字的绝对值。Alpha_pos[j]表示Alpha位置,Positions[i,j])候选灰狼所在位置
                X1 = Alpha_pos[j] - A1 * D_alpha;  # X1表示根据alpha得出的下一代灰狼位置向量
 
                r1 = random.random()
                r2 = random.random()
 
                A2 = 2 * a * r1 - a;  #
                C2 = 2 * r2;
 
                D_beta = abs(C2 * Beta_pos[j] - Positions[i, j]);
                X2 = Beta_pos[j] - A2 * D_beta;
 
                r1 = random.random()
                r2 = random.random()
 
                A3 = 2 * a * r1 - a;
                C3 = 2 * r2;
 
                D_delta = abs(C3 * Delta_pos[j] - Positions[i, j]);
                X3 = Delta_pos[j] - A3 * D_delta;
 
                Positions[i, j] = (X1 + X2 + X3) / 3  # 候选狼的位置更新为根据Alpha、Beta、Delta得出的下一代灰狼地址。
 
        Convergence_curve[l] = Alpha_score;
 
        if (l % 1 == 0):
            print(['迭代次数为' + str(l) + ' 的迭代结果' + str(Alpha_score)]);  # 每一次的迭代结果
 
#========函数==========
def F1(x):
    s=numpy.sum(x**2);
    return s
 
#===========主程序================
func_details = ['F1', -100, 100, 30]
function_name = func_details[0]
Max_iter = 1000#迭代次数
lb = -100#下界
ub = 100#上届
dim = 30#狼的寻值范围
SearchAgents_no = 5#寻值的狼的数量
x = GWO(F1, lb, ub, dim, SearchAgents_no, Max_iter)

Python&Matlab实现灰狼优化算法的示例代码

5 Matlab实现

% 主程序 GWO
clear
close all
clc
 
%%完整代码见微信公众号:电力系统与算法之美
 
%输入关键字:灰狼算法
 
SearchAgents_no = 30 ; % 种群规模
dim = 10 ; % 粒子维度
Max_iter = 1000 ; % 迭代次数
ub = 5 ;
lb = -5 ;
 
%% 初始化三匹头狼的位置
Alpha_pos=zeros(1,dim);
Alpha_score=inf; 
 
Beta_pos=zeros(1,dim);
Beta_score=inf; 
 
Delta_pos=zeros(1,dim);
Delta_score=inf; 
 
 
 
Convergence_curve = zeros(Max_iter,1);
 
%% 开始循环
for l=1:Max_iter
    for i=1:size(Positions,1)  
        
       %% 返回超出搜索空间边界的搜索代理
        Flag4ub=Positions(i,:)>ub;
        Flag4lb=Positions(i,:)<lb;
        Positions(i,:)=(Positions(i,:).*(~(Flag4ub+Flag4lb)))+ub.*Flag4ub+lb.*Flag4lb;               
        
        %% 计算每个搜索代理的目标函数
        fitness=sum(Positions(i,:).^2);
        
        %% 更新 Alpha, Beta, and Delta
        if fitness<Alpha_score 
            Alpha_score=fitness; % Update alpha
            Alpha_pos=Positions(i,:);
        end
        
        if fitness>Alpha_score && fitness<Beta_score 
            Beta_score=fitness; % Update beta
            Beta_pos=Positions(i,:);
        end
        
        if fitness>Alpha_score && fitness>Beta_score && fitness<Delta_score 
            Delta_score=fitness; % Update delta
            Delta_pos=Positions(i,:);
        end
    end
    
    
    a=2-l*((2)/Max_iter); % a decreases linearly fron 2 to 0
    
    %% 更新搜索代理的位置,包括omegas
    for i=1:size(Positions,1)
        for j=1:size(Positions,2)     
                       
            r1=rand(); % r1 is a random number in [0,1]
            r2=rand(); % r2 is a random number in [0,1]
            
            A1=2*a*r1-a; % Equation (3.3)
            C1=2*r2; % Equation (3.4)
            
            D_alpha=abs(C1*Alpha_pos(j)-Positions(i,j)); % Equation (3.5)-part 1
            X1=Alpha_pos(j)-A1*D_alpha; % Equation (3.6)-part 1
                       
            r1=rand();
            r2=rand();
            
            A2=2*a*r1-a; % Equation (3.3)
            C2=2*r2; % Equation (3.4)
            
            D_beta=abs(C2*Beta_pos(j)-Positions(i,j)); % Equation (3.5)-part 2
            X2=Beta_pos(j)-A2*D_beta; % Equation (3.6)-part 2       
            
            r1=rand();
            r2=rand(); 
            
            A3=2*a*r1-a; % Equation (3.3)
            C3=2*r2; % Equation (3.4)
            
            D_delta=abs(C3*Delta_pos(j)-Positions(i,j)); % Equation (3.5)-part 3
            X3=Delta_pos(j)-A3*D_delta; % Equation (3.5)-part 3             
            
            Positions(i,j)=(X1+X2+X3)/3;% Equation (3.7)
            
        end
    end
  
    Convergence_curve(l)=Alpha_score;
    disp(['Iteration = ' num2str(l)  ', Evaluations = ' num2str(Alpha_score)]);
 
end
%========可视化==============
figure('unit','normalize','Position',[0.3,0.35,0.4,0.35],'color',[1 1 1],'toolbar','none')
%% 目标空间
subplot(1,2,1);
x = -5:0.1:5;y=x;
L=length(x);
f=zeros(L,L);
for i=1:L
    for j=1:L
       f(i,j) = x(i)^2+y(j)^2;
    end
end
surfc(x,y,f,'LineStyle','none');
xlabel('x_1');
ylabel('x_2');
zlabel('F')
title('Objective space')
%% 狼群算法 
subplot(1,2,2);
semilogy(Convergence_curve,'Color','r','linewidth',1.5)
title('Convergence_curve')
xlabel('Iteration');
ylabel('Best score obtained so far');
 
axis tight
grid on
box on
legend('GWO')
display(['The best solution obtained by GWO is : ', num2str(Alpha_pos)]);
display(['The best optimal value of the objective funciton found by GWO is : ', num2str(Alpha_score)]);

Python&Matlab实现灰狼优化算法的示例代码

Python&Matlab实现灰狼优化算法的示例代码

以上就是Python&Matlab实现灰狼优化算法的示例代码的详细内容,更多关于Python Matlab灰狼优化算法的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python  __getattr__与__setattr__使用方法
Sep 06 Python
python 获取本机ip地址的两个方法
Feb 25 Python
web.py中调用文件夹内模板的方法
Aug 26 Python
python3读取MySQL-Front的MYSQL密码
May 03 Python
python实现电子书翻页小程序
Jul 23 Python
wxPython实现绘图小例子
Nov 19 Python
Python能做什么
Jun 02 Python
python 引用传递和值传递详解(实参,形参)
Jun 05 Python
python邮件中附加文字、html、图片、附件实现方法
Jan 04 Python
利用Opencv实现图片的油画特效实例
Feb 28 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
Python实现仓库管理系统
May 30 Python
Python学习之时间包使用教程详解
Mar 21 #Python
Python数据结构之队列详解
Python学习之os包使用教程详解
分享几种python 变量合并方法
Mar 20 #Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 #Python
python中的sys模块和os模块
Mar 20 #Python
python_tkinter事件类型详情
Mar 20 #Python
You might like
重置版游戏视频
2020/04/09 魔兽争霸
php 字符串压缩方法比较示例
2014/01/23 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
2016/09/19 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
用js实现计算代码行数的简单方法附代码
2007/08/13 Javascript
通过复制Table生成word和excel的javascript代码
2014/01/20 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
js 定位到某个锚点的方法
2016/11/19 Javascript
jQuery轻松实现无缝轮播效果
2017/03/22 jQuery
Angularjs Ng_repeat中实现复选框选中并显示不同的样式方法
2018/09/12 Javascript
微信小程序自定义toast弹窗效果的实现代码
2018/11/15 Javascript
手把手带你封装一个vue component第三方库
2019/02/14 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
[02:05]DOTA2完美大师赛趣味视频之看我表演
2017/11/18 DOTA
python基础教程之python消息摘要算法使用示例
2014/02/10 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Django自定义分页与bootstrap分页结合
2021/02/22 Python
Python列表生成式与生成器操作示例
2018/08/01 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python做接口测试的必要性
2019/11/20 Python
使用python实现多维数据降维操作
2020/02/24 Python
详解基于 Canvas 手撸一个六边形能力图
2019/09/02 HTML / CSS
大学生的应聘自我评价
2013/12/13 职场文书
高中生期末评语大全
2014/01/28 职场文书
校长寄语大全
2014/04/09 职场文书
2014年会策划方案
2014/05/11 职场文书
我的梦想演讲稿500字
2014/08/21 职场文书
不服从上级领导安排的检讨书
2014/09/14 职场文书
公务员学习中国梦心得体会
2016/01/05 职场文书
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python
Python数据可视化之基于pyecharts实现的地理图表的绘制
2021/06/10 Python
JS中如何优雅的使用async await详解
2021/10/05 Javascript