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

Hello Mat

 找回密码
 立即注册
查看: 7146|回复: 3

62-人工鱼群算法多目标优化案例分析

[复制链接]

1288

主题

1514

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22589
发表于 2018-8-12 23:05:45 | 显示全部楼层 |阅读模式
人工鱼群算法多目标优化案例分析
百度网盘链接:
视频1:https://pan.baidu.com/s/1fG7plmMccZz-LCa-98FpUw
视频2:https://pan.baidu.com/s/1Y1oTOVNr5htLn2L7PkVLQg
视频3:https://pan.baidu.com/s/1cxgKRYgiOEk3lb_pvwRqvA
具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1\
主程序如下:
  1. % 基于AFSA算法的多目标函数寻优
  2. clc,clear,close all
  3. warning off
  4. format longG
  5. % web('halcom.cn')
  6. addpath(genpath('./TestCode'))
  7. global nObj nVar
  8. % 算法参数
  9. maxiter = 50;       % 迭代次数
  10. sizepop = 100;      % 种群数量
  11. try_number = 10;    % 种群个体最优try次数
  12. visual = 1;         % 可视距离 = 感知距离
  13. delta = 0.618;      % 拥挤度因子
  14. step = 0.5;         % 步长
  15. repository = 100;    % 非支配解种群数量
  16. nGrid=12;            % 每个目标函数解集域的扩展网格大小,单周期数
  17. alpha=0.1;          % 非支配解的解集的扩展因子
  18. beta=2;             % 非支配解的选择因子
  19. %% 适应度函数
  20. % testfun = @fun_ZDT1;
  21. % maxiter = 5;       % 迭代次数
  22. % nObj = 2;    % 目标个数
  23. % nVar = 30;   % 未知量个数
  24. % popmin = zeros(1, nVar);   % 最小取值范围
  25. % popmax = ones(1, nVar);    % 最大取值范围

  26. % testfun = @fun_ZDT4;
  27. % maxiter = 50;       % 迭代次数
  28. % nObj = 2;    % 目标个数
  29. % nVar = 10;   % 未知量个数
  30. % popmin = zeros(1, nVar);   % 最小取值范围
  31. % popmax = ones(1, nVar);    % 最大取值范围

  32. % testfun = @fun_DTLZ1;
  33. % maxiter = 50;       % 迭代次数
  34. % nObj = 3;    % 目标个数
  35. % nVar = 10;   % 未知量个数
  36. % popmin = zeros(1, nVar);   % 最小取值范围
  37. % popmax = ones(1, nVar);    % 最大取值范围

  38. testfun = @fun_DTLZ2;
  39. maxiter = 50;       % 迭代次数
  40. nObj = 3;    % 目标个数
  41. nVar = 12;   % 未知量个数
  42. popmin = zeros(1, nVar);   % 最小取值范围
  43. popmax = ones(1, nVar);    % 最大取值范围

  44. % testfun = @fun_SRN;
  45. % maxiter = 50;       % 迭代次数
  46. % nObj = 2;    % 目标个数
  47. % nVar = 2;   % 未知量个数
  48. % popmin = -20*ones(1, nVar);   % 最小取值范围
  49. % popmax = 20*ones(1, nVar);    % 最大取值范围

  50. % testfun = @fun_TNK;
  51. % maxiter = 50;       % 迭代次数
  52. % nObj = 2;    % 目标个数
  53. % nVar = 2;   % 未知量个数
  54. % popmin = 0*ones(1, nVar);   % 最小取值范围
  55. % popmax = pi*ones(1, nVar);    % 最大取值范围

  56. %% 初始化种群
  57. x.Pos=[];             % 未知量的解
  58. x.fitness=[];         % 粒子适应度值
  59. x.Best.Pos=[];        % 最优解
  60. x.Best.fitness=[];    % 最优解对应的适应度值--目标函数值
  61. x.IsDominated=[];        % 是否非支配解,支配解=1, 非支配解=0
  62. x.GridIndex=[];          % 非支配解的网格化参数值-索引总循环数(并排目标函数的序列化内)
  63. x.GridSubIndex=[];       % 每一个非支配解的网格化索引值(扩展取值范围内)
  64. pop=repmat(x,sizepop,1); % 初始化的种群
  65. clear x
  66. for i=1:sizepop
  67.     for j=1:nVar
  68.         pop(i).Pos(j) = unifrnd(popmin(j),popmax(j),1);
  69.     end
  70.     % 适应度函数
  71.     pop(i).fitness = testfun(pop(i).Pos);
  72.     % 种群个体最优
  73.     pop(i).Best.Pos=pop(i).Pos;
  74.     % 种群最优适应度值
  75.     pop(i).Best.fitness=pop(i).fitness;
  76. end

  77. % 确定种群之间是否存在支配解
  78. pop=JudgePopDomination(pop);
  79. % 然后获取非支配解
  80. rep=pop(~[pop.IsDominated]);
  81. % 扩展非支配解的适应度函数取值范围
  82. Grid=CreateGrids(rep,nGrid,alpha);
  83. % 计算扩展非支配解的GridIndex
  84. for i=1:numel(rep)
  85.     rep(i)=FindGridIndex(rep(i),Grid);
  86. end

  87. %% AFSA算法的多目标函数寻优主程序
  88. for i=1:maxiter
  89.     popFSA=[];
  90.     popFSA = [pop.Pos];
  91.     popFSA = [reshape(popFSA,nVar,sizepop)]';
  92.     fitness=[];
  93.     fitness = [pop.fitness];
  94.     fitness = [reshape(fitness,nObj,sizepop)]';
  95.    
  96.     for j=1:sizepop
  97.         Xi = popFSA(j,:);   % 当前的种群
  98.         Yi = fitness(j,:);  % 当前种群对应的适应度值
  99.         % 聚群行为
  100.         [Xc,Yc] = FSA_center(testfun, Xi, Yi, popFSA,fitness, popmin, popmax, sizepop, visual, step, try_number, delta);
  101.         % 追尾行为
  102.         [Xs,Ys] = FSA_scatter(testfun, Xi,Yi, popFSA,fitness, popmin, popmax, sizepop, visual, step, try_number, delta);

  103.         % 是否受支配
  104.         if Domination2(Yc,Ys)
  105.             pop(j).Pos = Xc;
  106.             pop(j).fitness = Yc;
  107.         else
  108.             pop(j).Pos = Xs;
  109.             pop(j).fitness = Ys;
  110.         end
  111.         
  112.         % 是否受支配
  113.         if Domination(pop(j),pop(j).Best)
  114.             pop(j).Best.Pos=pop(j).Pos;
  115.             pop(j).Best.fitness=pop(j).fitness;
  116.         else
  117.             if rand<0.5
  118.                 pop(j).Best.Pos=pop(j).Pos;
  119.                 pop(j).Best.fitness=pop(j).fitness;
  120.             end
  121.         end
  122.         
  123.     end
  124.    
  125.     % 增加非支配解
  126.     rep =[rep; pop(~[pop.IsDominated])];
  127.     % 非支配解是否有支配解
  128.     rep=JudgePopDomination(rep);
  129.     % 删除支配解
  130.     rep=rep(~[rep.IsDominated]);
  131.    
  132.     % 扩展非支配解的适应度函数取值范围
  133.     Grid=CreateGrids(rep,nGrid,alpha);
  134.     for k=1:numel(rep)
  135.         rep(k)=FindGridIndex(rep(k),Grid);
  136.     end
  137.    
  138.     if nObj==2
  139.         figure(1);
  140.         Plotfitness(pop,rep);
  141.         pause(0.001);
  142.     elseif(nObj==3)
  143.         figure(1);
  144.         Plotfitness3(pop,rep);
  145.         pause(0.001);
  146.     end
  147. end
  148. % 确定种群之间是否存在支配解
  149. pop=JudgePopDomination(pop);
  150. rep = uniqueRep(rep);
  151. if nObj==2
  152.     figure(1);
  153.     Plotfitness(pop,rep);
  154. elseif( nObj==3)
  155.     figure(1);
  156.     Plotfitness3(pop,rep);
  157. end

  158. % web('halcom.cn')
  159. rmpath(genpath('./TestCode'))
复制代码
优化后的追尾行为函数:
  1. function [Xt,Yt] = FSA_scatter(testfun, Xi, Yi, pop, fitness, popmin,popmax, sizepop, visual, step, try_number, delta  )
  2. % 追尾行为
  3. % popmin1 = popminmax1(1);  popmax1 = popminmax1(2); % x1
  4. % popmin2 = popminmax2(1);  popmax2 = popminmax2(2); % x2

  5. % Xi = pop(j,:);    % 当前的种群
  6. % Yi = fitness(j);  % 当前种群对应的适应度值
  7. % for k=1:sizepop
  8. %     d(k) = norm( Xi-pop(k,:) ,2);
  9. % end
  10. d = zeros( sizepop,1 );
  11. for i=1:size(fitness, 2)
  12.     [va,vb] = sort(fitness(:, i));
  13.     for k=1:sizepop
  14.         if(vb(k)==sizepop)
  15.             d(k) = d(k) + abs( fitness(vb(k)-1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  16.         elseif( vb(k)==1 )
  17.             d(k) = d(k) + abs( fitness(vb(k)+1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  18.         elseif(vb(k)>1 && vb(k)<sizepop )
  19.             d(k) = d(k) + abs( fitness(vb(k)+1, i) - fitness(vb(k)-1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  20.         end
  21.     end
  22. end

  23. [a,b] = find( d>0 & d<visual );
  24. if(~isempty(b))
  25.     Xc = zeros( size(pop(1,:)) );
  26.     Ymax = 1000000*ones( size(fitness,2), 1 );
  27.     Xmax = Xc;
  28.     for k=1:length(b)
  29.         Xc = pop(a(k),:);
  30.         Yc = testfun( Xc );   % 适应度值
  31.         % 是否受支配
  32.         if Domination2(Yc,Ymax)
  33. %         if Yc>Ymax
  34.             Ymax = Yc;
  35.             Xmax = Xc;
  36.         end
  37.     end

  38. %     if Ymax/length(b) > delta*Yi
  39.     % 是否受支配
  40.     if Domination2(Ymax/length(b),delta*Yi')
  41.         Xt = Xi + ( Xmax - Xi )./(norm(Xmax-Xi,2)+eps) .* step .*rand( size( Xi ) );
  42.         Yt = testfun( Xt );   % 适应度值
  43.     else
  44.         % 觅食行为
  45.         [Xt,Yt] = FSA_find(testfun, Xi, Yi, popmin, popmax, visual, step, try_number  );
  46.     end
  47. else
  48.     % 觅食行为
  49.     [Xt,Yt] = FSA_find(testfun, Xi, Yi, popmin, popmax, visual, step, try_number  );
  50. end
复制代码
优化后的聚群行为函数如下:
  1. function [Xt,Yt] = FSA_center(testfun, Xi, Yi, pop, fitness, popmin, popmax, sizepop, visual, step, try_number, delta  )
  2. % 聚群行为
  3. % popmin1 = popminmax1(1);  popmax1 = popminmax1(2); % x1
  4. % popmin2 = popminmax2(1);  popmax2 = popminmax2(2); % x2

  5. % Xi = pop(j,:);    % 当前的种群
  6. % Yi = fitness(j);  % 当前种群对应的适应度值
  7. % for k=1:sizepop
  8. %     d(k) = norm( Xi-pop(k,:) ,2);
  9. % end
  10. d = zeros( sizepop,1 );
  11. for i=1:size(fitness, 2)
  12.     [va,vb] = sort(fitness(:, i));
  13.     for k=1:sizepop
  14.         if(vb(k)==sizepop)
  15.             d(k) = d(k) + abs( fitness(vb(k)-1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  16.         elseif( vb(k)==1 )
  17.             d(k) = d(k) + abs( fitness(vb(k)+1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  18.         elseif(vb(k)>1 && vb(k)<sizepop )
  19.             d(k) = d(k) + abs( fitness(vb(k)+1, i) - fitness(vb(k)-1, i) )./( max(fitness(:,i))-min(fitness(:,i))+eps );
  20.         end
  21.     end
  22. end

  23. [a,b] = find( d>0 & d<visual );
  24. if(~isempty(b))
  25.     Xc = zeros( size(pop(1,:)) );
  26.     for k=1:length(b)
  27.         Xc = Xc+pop(b(k),:);
  28.     end
  29.     Xc = Xc./length(b);
  30.     Yc = testfun( Xc );   % 适应度值
  31. %     if Yc/length(b) > delta*Yi
  32.     % 是否受支配
  33.     if Domination2(Yc/length(b),delta*Yi')
  34.         Xt = Xi + ( Xc - Xi )./(norm(Xc-Xi,2)+eps) .* step .*rand( size( Xi ) );
  35.         Yt = testfun( Xt );   % 适应度值
  36.     else
  37.         % 觅食行为
  38.         [Xt,Yt] = FSA_find(testfun, Xi, Yi, popmin, popmax, visual, step, try_number  );
  39.     end
  40. else
  41.     % 觅食行为
  42.     [Xt,Yt] = FSA_find(testfun, Xi, Yi, popmin, popmax, visual, step, try_number  );
  43. end
复制代码
快速排序法构造非支配集:
  1. function pop = JudgePopDomination(pop)
  2. sizepop = numel(pop);  % 种群数量
  3. for i=1:sizepop
  4.     pop(i).IsDominated=0;
  5. end

  6. for i=1:sizepop-1
  7.     for j=i+1:sizepop
  8.         b1 = Domination(pop(i),pop(j));
  9.         b2 = Domination(pop(j),pop(i));
  10.         if b1==1
  11.             pop(j).IsDominated=1;
  12.         end
  13.         if b2==1
  14.             pop(i).IsDominated=1;
  15.         end
  16.     end
  17. end
复制代码
结果如下:














本帖子中包含更多资源

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

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

使用道具 举报

0

主题

25

帖子

1

金钱

新手上路

Rank: 1

积分
26
发表于 2018-8-16 17:10:14 | 显示全部楼层
请问是一个算法视频38元吗
回复 支持 反对

使用道具 举报

1288

主题

1514

帖子

90

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22589
 楼主| 发表于 2018-8-17 19:47:11 | 显示全部楼层
小雅xmy 发表于 2018-8-16 17:10
请问是一个算法视频38元吗

是的
算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复 支持 反对

使用道具 举报

0

主题

2

帖子

1

金钱

新手上路

Rank: 1

积分
3
发表于 2020-1-30 16:05:10 | 显示全部楼层
感谢算法样例
回复 支持 反对

使用道具 举报

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

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-3-29 21:27 , Processed in 0.232893 second(s), 23 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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