当前位置: 首页 > news >正文

基于鸽群优化算法的线性规划求解matlab程序

在这里插入图片描述

1 鸽群算法

鸽群作为一种鸟群,拥有着卓越的导航能力和长距离飞行的能力,同时,鸽群内的个体还能通过彼此互相的学习、记忆来进行飞行状态的迭代更新,从而进行十分稳定的群体飞行,鸽群的这种优秀的对于环境的识别能力和导航能力成为了国内外众多学者的研究对象。上世纪初,相关学者对于旅行鸽能够准确的回到巢穴的行为展开了研究,并指出,鸽群能够借助当地的地磁与地标信息来对自身的位置进行定位与更新,从而能够辨别方向找到巢穴所在。
在这里插入图片描述

经典鸽群算法(pigeon-inspired optimization,PIO)由段海滨等人于2014年提出,该算法由地磁单元和地标单元两个导航单元构成,通过地磁单元和地标单元两个独立的阶段模拟鸽群进行速度和位置更新的导航机制,鸽群在地磁单元阶段根据当地磁场和太阳的高度来判别自身的位置,并进行速度的更新;在地标单元阶段由当地的地标信息来辨别自身的位置与速度。在这两个阶段分别用到不同的算子模型,在地磁单元阶段存在地图和指南针算子,在地标阶段存在地标算子:
(1)地磁单元阶段
在地磁单元阶段,鸽子根据对于当地磁场等物质进行判断,同时在脑海中规划出飞行路线,并能够根据当地太阳的高度来对自身的方向进行实时调整,这种对地磁信息的依赖性会随着鸽群靠近目标点而逐渐减弱。
在这里插入图片描述

(2)地标单元阶段

鸽子的记忆能力很强,能够对周围的地标信息迅速记忆,当距离目标点比较近时,鸽子会参考当地的地标在脑海中勾勒出地图并根据地标进行位置与速度的调整,直到抵达目标点。如果某只鸽子对当地的地标不熟悉,鸽子也会根据周围对地标熟悉的鸽子的飞行状态对自身飞行进行调整。在每一次迭代的过程中,会根据每只鸽子的适应度的不同进行淘汰,淘汰适应度较差的一半鸽子,计算剩余适应度较优的鸽子的中心位置𝑋𝑒𝑛𝑡𝑒𝑟,并作为种群中的参考方向。
PIO算法也是一种群体算法,对于个体进行随机初始化,空间中的每一个个体都代表着一个可行解,然后通过两个阶段的寻优搜索。在地磁单元阶段寻优的过程中间,PIO算法会对整个群体中的最优解进行保留,然后进行个体速度与位置的迭代更新,对解空间进行充分的搜索,具有快速性与随机性,使得搜索的效率较高,种群的多样性较好。在经过地磁阶段的搜索以后,进入地标单元阶段,鸽群会逐渐向一个位置较优的领导鸽进行靠近,这个阶段过程缓慢,搜索比较仔细,范围比较局部,能够较为精确的对搜索种群的最优值。
在这里插入图片描述

2 线性规划算例
2.1算例
在这里插入图片描述
2.2算例答案
在这里插入图片描述

3 鸽群算法求解结果
迭代曲线
在这里插入图片描述
4 matlab程序
1)主函数


clear 
clc 
close all
format long;
T1=200;     %Global search algebra 
T2=200;     %Local search algebra 
pigeonnum=500;    %number  
D = 30;     % dimensionality 
R=0.3;     %parameters of magnetic field  
bound=[0,15];    %hunting zone
tol = 1e-7;
f1=@fitness;
%**************initialization of the individual pigeon************ 
for i=1:pigeonnum                                                           %时间复杂度O(pigeonum*D*2)
    for j=1:D 
        x(i,j)=bound(1)+rand*(bound(2)-bound(1)); 
        v(i,j)=rand; 
    end 
end 
%**************calculate the fitness of pigeon*********** 
for i=1:pigeonnum                                                           %时间复杂度O(pigeonum*2)
    p(i)=f1(x(i,:),D); 
    p_best(i,:)=x(i,:); 
end 
%**************find the optimal pigeons******************** 
 
g_best=x(1,:); 
for i=2:pigeonnum                                                           %时间复杂度O(pigeonum-1)
    if f1(g_best,D)>f1(x(i,:),D) 
        g_best=x(i,:); 
    end 
end 
%************  magnetic compass and solar operator******************** 
for t=1:T1                                                                  %时间复杂度O(T1*(pigeonum*(2D+5))+1)
    for i=1:pigeonnum                                                       %时间复杂度O(pigeonum*(2D+5))                       
        v(i,:)=v(i,:)+rand*(p_best(i,:)-x(i,:)); 
        x(i,:)=x(i,:)*(1-exp(-R*t))+v(i,:);   %check whether beyond the searching space 
        for j=1:D                                    % magnetic field and solar operator 
            if abs(i-1)<=eps 
                if x(i,j)<bound(1)||x(i,j)>bound(2) 
                    x(i,j)=bound(1)+rand*(bound(2)-bound(1)); 
                    v(i,j)=rand; 
                end 
            else 
                if x(i,j)<bound(1)||x(i,j)>bound(2) 
                    x(i,j)=x(i-1,j);  
                    v(i,j)=v(i-1,j); 
                end     
            end 
        end 
        if f1(x(i,:),D)<p(i)                         %renewal individual fitness 
            p(i)=f1(x(i,:),D); 
            p_best(i,:)=x(i,:); 
        end 
        if p(i)<f1(g_best,D)                         %renewal global fitness 
            g_best=p_best(i,:); 
        end
    end
    result(t)=f1(g_best,D); 
end 
%*************???????********************** 
for t=1:T2                                                                  %时间复杂度O(T2*pigeonum*pigeonum)
    for i=1:pigeonnum-1                             %sort the pigeons       
        for j=i+1:pigeonnum 
            if f1(x(i,:),D)>f1(x(j,:),D) 
                temp_pigeon=x(i,:); 
                x(i,:)=x(j,:); 
                x(j,:)=temp_pigeon; 
            end 
        end 
    end 
    pigeonnum=ceil(pigeonnum/2);               %remove half of the pigeons according to the landmark 
    addpigeonnum=0;                        
    for i=1:pigeonnum 
        addpigeonnum=addpigeonnum+x(i,:);      
        p(i)=f1(x(i,:),D);                     %calculate fitness and location of the pigeon after sorting 
        p_best(i,:)=x(i,:); 
    end 
    pigeoncenter=ceil(addpigeonnum./pigeonnum);%calculate central position 
    for i=1:pigeonnum                                %local searching        
        for j=1:D                                    %check whether beyond the searching space 
            x(i,j) = x(i,j) + rand*(pigeoncenter(j)-x(i,j));
            while x(i,j)<bound(1)||x(i,j)>bound(2)
                x(i,j) = x(i,j) + rand*(pigeoncenter(j)-x(i,j));
            end
        end 
        if f1(x(i,:),D)<p(i)                         %renewal individual fitness 
            p(i)=f1(x(i,:),D); 
            p_best(i,:)=x(i,:); 
        end 
        if p(i)<f1(g_best,D)                         %renewal global fitness 
            g_best=p_best(i,:); 
        end 
    end 
    result(t+T1)=f1(g_best,D);
end 

figure                                               %graph 
for t=1:T1+T2-1 
    plot([t,t+1],[result(t),result(t+1)]); 
    hold on; 
end
xlabel('迭代次数');
ylabel('目标函数值');
title(['最优值为 ' num2str(min(result))])

% end
。。。。。。略

5 matlab完整程序链接
https://mp.weixin.qq.com/s?__biz=Mzg4MTc1MjE2Mg==&mid=2247484529&idx=1&sn=b632690b2d389dc8bd81bbcfc4c4fe0e&chksm=cf60657cf817ec6a8575af438585d4ccca16df8178bb61b71a50bd0234fc6a9764f5a2a4fcc1&token=931500997&lang=zh_CN#rd

在这里插入图片描述

相关文章:

  • 【博客505】k8s Sig-scheduler Coscheduling调度器插件原理
  • 【Linux】I/O多路复用-SELECT/POLL/EPOLL
  • Python解释器路径寻找规则
  • [Qt桌面开发]一个Qt简单界面的开发
  • 文本的换行与包裹 之可能是全网最详细的 line-break 中文介绍
  • Matlab项目合作
  • 【Eigen】Chapter4 几何模块 Geometry
  • 【GAMES-104现代游戏引擎】4、引擎渲染基础(渲染基础数据、全局光照、PBR、阴影)
  • Linux中断概述
  • 【统计学习|书籍阅读】第一章 统计学习方法概论 p1-p24
  • 操作系统——计算机系统概述补充
  • pytorch 实现一个最简单的 GAN:用mnist数据集生成新图像
  • 七雄争霸武将技能搭配
  • 利用Python进行数据分析-Numpy入门基础知识
  • QML的Popup遇到的坑
  • 【RocksDB】TransactionDB源码分析
  • CentOS 7 防火墙操作
  • Facebook AccountKit 接入的坑点
  • Koa2 之文件上传下载
  • Laravel 实践之路: 数据库迁移与数据填充
  • python3 使用 asyncio 代替线程
  • Python打包系统简单入门
  • Vim Clutch | 面向脚踏板编程……
  • VuePress 静态网站生成
  • Vue源码解析(二)Vue的双向绑定讲解及实现
  • 创建一种深思熟虑的文化
  • 翻译--Thinking in React
  • 浮现式设计
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 使用Gradle第一次构建Java程序
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 原生 js 实现移动端 Touch 滑动反弹
  • elasticsearch-head插件安装
  • HanLP分词命名实体提取详解
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​2020 年大前端技术趋势解读
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (04)odoo视图操作
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (六)软件测试分工
  • (循环依赖问题)学习spring的第九天
  • (一)kafka实战——kafka源码编译启动
  • (转)四层和七层负载均衡的区别
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET 服务 ServiceController
  • .net 流——流的类型体系简单介绍
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET大文件上传知识整理
  • .net快速开发框架源码分享