请选择 进入手机版 | 继续访问电脑版

Hello Mat

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1039|回复: 3

63-鸽群算法PIO算法

[复制链接]

754

主题

893

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29862
发表于 2019-2-23 21:53:54 | 显示全部楼层 |阅读模式
鸽群算法PIO算法:Pigeon-inspired  optimization algorithm


百度网盘链接:
链接:https://pan.baidu.com/s/1Immoe1w6OblYVbGtB16XGw

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

程序如下:
  1. clc,clear,close all
  2. warning off
  3. format longG
  4. T1=90;           % Global search algebra,迭代次数
  5. T2=15;           % Local search algebra,迭代次数
  6. pigeonnum=30;    % 种群数量
  7. nvar = 1;             % 未知量个数
  8. R = 0.3;           % 地磁场参数parameters of magnetic field
  9. bound=[-1,1];    % 搜索范围
  10. %% 初始化种群
  11. for i=1:pigeonnum
  12.     pop(i,1) = bound(1) + (bound(2)-bound(1))*rand;
  13.     fitness(i) = fun( pop(i,1)  );   % 适应度函数
  14.     v(i,1) = rand;                   % 飞行速度
  15. end
  16. % 记录一组最优值
  17. [bestfitness,bestindex]=min(fitness);
  18. zbest=pop(bestindex,:);   %全局最佳
  19. gbest = pop;                % 个体最佳
  20. fitnessgbest=fitness;     %个体最佳适应度值
  21. fitnesszbest=bestfitness; %全局最佳适应度值
  22. %% 地图和指南针算子 magnetic compass and solar operator
  23. for t=1:T1  % 迭代次数
  24.     for i=1:pigeonnum
  25.         v(i,:)=v(i,:)*(1-exp(-R*t))+rand*(gbest(i,:)-pop(i,:));
  26.         pop(i,:)=pop(i,:)+v(i,:);   %check whether beyond the searching space
  27.         for j=1:nvar
  28.             if abs(i-1)<=eps
  29.                 if pop(i,j)<bound(1)||pop(i,j)>bound(2)
  30.                     pop(i,j)=bound(1)+rand*(bound(2)-bound(1));
  31.                     pop(i,j)=rand;
  32.                 end
  33.             else
  34.                 if pop(i,j)<bound(1)||pop(i,j)>bound(2)
  35.                     pop(i,j)=pop(i-1,j);
  36.                     v(i,j)=v(i-1,j);
  37.                 end   
  38.             end
  39.         end
  40.         fitness(i) = fun( pop(i,:)  );   % 适应度函数
  41.         % 比较  个体间比较
  42.         if fitness(i)<fitnessgbest(i)
  43.             fitnessgbest(i) = fitness(i);
  44.             gbest(i,:) = pop(i,:);
  45.         end
  46.         if fitness(i)<bestfitness
  47.             bestfitness = fitness(i);
  48.             zbest =  pop(i,:);
  49.         end
  50.     end
  51.     fitness_iter(t) = bestfitness;
  52. end
  53. %% 地标算子 landmark operator
  54. pop = gbest;                % 个体最佳
  55. fitness = fitnessgbest;     %个体最佳适应度值
  56. for t=1:T2
  57.     % sort the pigeons
  58.     [a0,b0] = sort( fitness, 'ascend' );
  59.     pop = pop(b0, :);
  60.     fitness = a0;
  61.     % 取前一半的最优解进行分析
  62.     pigeonnum1=ceil(pigeonnum/2);               % remove half of the pigeons according to the landmark
  63.     % 鸽子的中心值
  64.     addpigeonnum = sum( pop(1:pigeonnum1, :) )  ;                    
  65.     pigeoncenter=ceil(addpigeonnum./pigeonnum); % calculate central position
  66.     for i=1:pigeonnum
  67.         v(i,:)=v(i,:)*(1-exp(-R*t))+rand*(gbest(i,:)-pop(i,:));
  68.         pop(i,:)=pop(i,:)+v(i,:);   %check whether beyond the searching space
  69.         for j=1:nvar
  70.             if abs(i-1)<=eps
  71.                 if pop(i,j)<bound(1)||pop(i,j)>bound(2)
  72.                     pop(i,j)=bound(1)+rand*(bound(2)-bound(1));
  73.                     pop(i,j)=rand;
  74.                 end
  75.             else
  76.                 if pop(i,j)<bound(1)||pop(i,j)>bound(2)
  77.                     pop(i,j)=pop(i-1,j);
  78.                     v(i,j)=v(i-1,j);
  79.                 end   
  80.             end
  81.         end
  82.         fitness(i) = fun( pop(i,:)  );   % 适应度函数
  83.         % 比较  个体间比较
  84.         if fitness(i)<fitnessgbest(i)
  85.             fitnessgbest(i) = fitness(i);
  86.             gbest(i,:) = pop(i,:);
  87.         end
  88.         if fitness(i)<bestfitness
  89.             bestfitness = fitness(i);
  90.             zbest =  pop(i,:);
  91.         end
  92.     end
  93.     fitness_iter(T1+t) = bestfitness;
  94. end
  95. disp('最优解')
  96. disp(zbest)
  97. fprintf('\n')

  98. figure('color',[1,1,1])
  99. plot(fitness_iter,'ro-','linewidth',2)

  100. figure('color',[1,1,1])
  101. loglog(fitness_iter,'ro-','linewidth',2)
复制代码


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

0

主题

4

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2019-3-19 09:19:00 | 显示全部楼层
博主,程序中的fun函数定义呢?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

16

积分

新手上路

Rank: 1

积分
16
发表于 2019-7-5 11:13:21 | 显示全部楼层
这个代码里nvar是未知量个数,没有设置D维度吗
回复 支持 反对

使用道具 举报

754

主题

893

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
29862
 楼主| 发表于 2019-7-6 10:58:01 | 显示全部楼层
wjy@qq.com 发表于 2019-7-5 11:13
这个代码里nvar是未知量个数,没有设置D维度吗

就是那个D吧,表达式一个意思,nvar个未知量,和你常见的D维度应该是一个意思。
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


Python|Opencv|MATLAB|Halcom.cn  

GMT+8, 2019-10-17 13:40 , Processed in 0.115901 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表