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常见文件操作的函数示例代码
Nov 15 Python
Python文档生成工具pydoc使用介绍
Jun 02 Python
Python实现快速排序算法及去重的快速排序的简单示例
Jun 26 Python
PyQt5每天必学之单行文本框
Apr 19 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
python 循环数据赋值实例
Dec 02 Python
django框架单表操作之增删改实例分析
Dec 16 Python
在keras中获取某一层上的feature map实例
Jan 24 Python
Python抓新型冠状病毒肺炎疫情数据并绘制全国疫情分布的代码实例
Feb 05 Python
浅谈python处理json和redis hash的坑
Jul 16 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
使用php实现快钱支付功能(涉及到接口)
2013/07/01 PHP
thinkphp自定义权限管理之名称判断方法
2017/04/01 PHP
laravel5.4利用163邮箱发送邮件的步骤详解
2017/09/22 PHP
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
js判断登录与否并确定跳转页面的方法
2015/01/30 Javascript
jquery使用ul模拟select实现表单美化的方法
2015/08/18 Javascript
基于jQuery滑动杆实现购买日期选择效果
2015/09/15 Javascript
jQuery常见的选择器及用法介绍
2016/12/20 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
JS实现DIV高度自适应窗口示例
2017/02/16 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
2017/03/08 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
Vue 按键修饰符处理事件的方法
2018/05/04 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
详解Python3中yield生成器的用法
2015/08/20 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
利用Python循环(包括while&amp;for)各种打印九九乘法表的实例
2017/11/06 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Numpy之将矩阵拉成向量的实例
2019/11/30 Python
python烟花效果的代码实例
2020/02/25 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
python实现单机五子棋
2020/08/28 Python
Html5 video标签视频的最佳实践
2020/02/26 HTML / CSS
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
什么是.net的Remoting技术
2016/07/08 面试题
生产车间主管岗位职责
2013/12/28 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
合作协议书格式
2014/08/19 职场文书
中班下学期幼儿评语
2014/12/30 职场文书
大学宣传委员竞选稿
2015/11/19 职场文书
mysql升级到5.7时,wordpress导数据报错1067的问题
2021/05/27 MySQL
JavaScript严格模式不支持八进制的问题讲解
2021/11/07 Javascript
微信小程序调用python模型
2022/04/21 Python