群智能算法:遗传算法, 粒子群算法, 蚁群算法的原理与实例分析

  • 1. 问题重述
    • 1.1 解决步骤
    • 1.2 问题粗析
  • 2. 遗传算法求解
    • 2.1 步骤
    • 2.2 结果
    • 2.3 结果分析
    • 2.4 遗传算法小结
  • 3. 粒子群算法求解
    • 3.1 步骤
    • 3.2 结果
    • 3.3 结果分析
    • 3.4 小结

解决函数极值问题(二元), 采用三种群智能算法实现, 并进行比较分析

1. 问题重述

求解函数: f(x,y)=6.452(x+0.125y)(cos⁡x−cos⁡(2y))20.8+(x−4.2)2+2(y−7)2+3.226yf(x, y)=\frac{6.452(x+0.125 y)(\cos x-\cos (2 y))^{2}}{\sqrt{0.8+(x-4.2)^{2}+2(y-7)^{2}}}+3.226 yf(x,y)=0.8+(x−4.2)2+2(y−7)2​6.452(x+0.125y)(cosx−cos(2y))2​+3.226y的最大值, 其中x∈[0,10),y∈[0,10)x \in[0,10), \quad y \in[0,10)x∈[0,10),y∈[0,10)

1.1 解决步骤

  • 利用现成函数绘制图形并求解出在给定区间的最大值
  • 选用群智能算法(遗传算法, 粒子群算法, 蚁群算法), 初步设定参数, 分析结果
  • 改变参数分析算法的性能
  • 总结

1.2 问题粗析

利用Matlab绘制函数图形,及使用函数计算最大值如下, 可得函数在该区间的最大值在99.99附近.

代码如下:

% 代码1 粗略绘制函数图形并求最值
clc
clear
clf
x = linspace(0,10,1000);
y = linspace(0,10,1000);
[X,Y] = meshgrid(x,y);
Z = 6.452*(X+0.125.*Y).*((cos(X)-cos(2.*Y)).^2)./sqrt(0.8+(X-4.2).^2+2.*(Y-7).^2)+3.226.*Y;
mesh(X,Y,Z)
hold on

2. 遗传算法求解

2.1 步骤

  • 实数编码
  • 群体设定
  • 适应度函数
  • 选择(复制)
  • 交叉
  • 变异

2.2 结果

利用Matlab的GA函数, 首先用默认参数进行试验, 发现易陷入局部最优解(如下图)
代码如下:

% 代码2 遗传算法
fun = @(x) 1/(6.452*(x(1)+0.125.*x(2)).*((cos(x(1))-cos(2.*x(2))).^2)./sqrt(0.8+(x(1)-4.2).^2+2.*(x(2)-7).^2)+3.226.*x(2));
nvars = 2;
A = [1, 0; 0, 1; -1, 0; 0, -1];                             % Ax不大于b
b = [10; 10; 0; 0];
lb = [];
ub = [];
nonlcon = [];
IntCon  = [];
options = optimoptions(@ga)
[x,fval,exitFlag,output,population,scores] = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon,options)

通过optimoptions函数对GA算法的options参数进行修改, 测试结果发现, 在种群规模不太小(>20), 将交配概率与变异概率分别设置为0.8和0.2, 容易找到最优解.
此时, 最优解的坐标为(6.0914, 7.7991, 99.9953).

代码如下:

fun = @(x) 1/(6.452*(x(1)+0.125.*x(2)).*((cos(x(1))-cos(2.*x(2))).^2)./sqrt(0.8+(x(1)-4.2).^2+2.*(x(2)-7).^2)+3.226.*x(2));
nvars = 2;
A = [1, 0; 0, 1; -1, 0; 0, -1];                             % Ax不大于b
b = [10; 10; 0; 0];
lb = [];
ub = [];
nonlcon = [];
IntCon  = [];options = optimoptions(@ga, ...'PopulationType', 'doubleVector',...'PopulationSize', 50,...               % 种群规模'EliteCount', 1,...                    % 最佳个体保存'CrossoverFraction', 0.8, ...          % 交配概率'MigrationDirection', 'forward',...'MigrationInterval', 20,...'MigrationFraction', 0.2,...           % 变异概率'Generations', 100,...                 % 迭代次数'TimeLimit', Inf,...'FitnessLimit', -Inf,...'StallTest', 'averageChange',...'StallTimeLimit', Inf,...'TolFun',1.0e-06,...'Tolcon',1.0e-03,...'NonlinConAlgorithm','auglag',...'InitialPenalty', 10,...'PenaltyFactor', 100,...'PlotInterval', 1,...'MutationFcn', {@mutationadaptfeasible [1] [1]},...    % 修改'CreationFcn', @gacreationlinearfeasible,...           % 修改'FitnessScalingFcn', @fitscalingrank,...'SelectionFcn', @selectionstochunif,...'CrossoverFcn', @crossoverintermediate,...             % 修改'Display', 'final',...'Vectorized', 'off')
[x,fval,exitFlag,output,population,scores] = ga(fun,nvars,A,b,[],[],lb,ub,nonlcon,IntCon,options)

2.3 结果分析

结果收敛较好, 种群中绝大多数个体较为集中.
代码如下:

clc
clf
figure(2)
plot(population(:,1),population(:,2),'*r')
xlim([6.05 6.10])
ylim([7.79 7.81])

2.4 遗传算法小结

  1. 在代码调试的过程中, 先是用默认参数进行试验, 发现如不设置参数, 能得出正确结果, 但是在使用optimoptions函数获取options参数后, 再赋值成一模一样的参数, 则得不到理想结果, 容易陷入局部最优解.
    问题解决: 通过手动赋值所有参数, 采取控制变量法,每次修改其中一个参数, 最终对′MutationFcn′,′CreationFcn′,′CrossoverFcn′'MutationFcn', 'CreationFcn', 'CrossoverFcn'′MutationFcn′,′CreationFcn′,′CrossoverFcn′三个参数进行默认值的修改(依据警告以及documentationdocumentationdocumentation), 最终确定当
    ′MutationFcn′=@mutationadaptfeasible[1][1]'MutationFcn'={@mutationadaptfeasible [1] [1]}′MutationFcn′=@mutationadaptfeasible[1][1],
    ′CreationFcn′=@gacreationlinearfeasible'CreationFcn'=@gacreationlinearfeasible′CreationFcn′=@gacreationlinearfeasible,
    ′CrossoverFcn′=@crossoverintermediate'CrossoverFcn'=@crossoverintermediate′CrossoverFcn′=@crossoverintermediate
    时, 算法得到正确结果.
  2. 解决问题1后, 对种群规模, 交配概率, 变异概率等参数进行修改, 结果显示, 在在种群规模不太小(>20), 将交配概率与变异概率分别设置为0.8和0.2, 容易找到最优解.
  3. 在使用遗传算法对二元函数进行最值求解时, 没有选用根据步骤逐行书写代码, 而是使用Matlab自带的GA函数, 通过optimoptions对参数进行准确配置, 进而得到结果.
  4. 逐行书写代码有利于加深算法的数学理解, 原理的实现. 但在工程性方面, 自行书写代码性能不如算法工程师所写的GA函数, 因此, 在充分理解原理的基础上, 直接调用函数(或使用APP), 不仅有利于之后的再次使用, 而且对于各种参数的配置有了一定经验, 对于使用遗传算法解决其他类型问题有一定帮助.

3. 粒子群算法求解

3.1 步骤

  • 下载工具箱, 并在Matlab中设置工具箱的路径;
  • 定义待优化函数testfunctest_functestf​unc;
  • 调用PSO算法的核心函数:pso_Trelea_vectorized()pso\_Trelea\_vectorized()pso_Trelea_vectorized().

3.2 结果

通过下载安装PSOtPSOtPSOt工具箱, 对test_func.mtest\_func.mtest_func.m与test_main.mtest\_main.mtest_main.m文件进行编写, 设置初始参数后, 结果如下图所示.

由图可知, 在迭代了大约700次后, PSO算法得出最大值点坐标(6.0914, 7.7991, 99.9953), 与遗传算法获得结果一致.
代码如下:

% test_func函数
function z=test_func(in)
nn=size(in);
x=in(:,1);
y=in(:,2);
nx=nn(1);for i=1:nxtemp = 1/(6.452*(x(i)+0.125.*y(i)).*((cos(x(i))-cos(2.*y(i))).^2)./sqrt(0.8+(x(i)-4.2).^2+2.*(y(i)-7).^2)+3.226.*y(i));z(i,:) = temp;end
% test_main.m文件
clear
clc
x_range=[0,10];     %参数x变化范围
y_range=[0,10];     %参数y变化范围
range = [x_range;y_range];     %参数变化范围(组成矩阵)
Max_V = 0.2*(range(:,2)-range(:,1));  %最大速度取变化范围的10%~20%
n=2;                     %待优化函数的维数,此例子中仅x、y两个自变量,故为2
pso_Trelea_vectorized('test_func',n,Max_V,range)  %调用PSO核心模块

3.3 结果分析

PSO算法中, 调用pso_Trelea_vectorized()pso\_Trelea\_vectorized()pso_Trelea_vectorized()函数的PSOparamsPSOparamsPSOparams参数含义如下表所示(自己查资料总结):

参数 含义
P(1) 命令窗显示的间隔数, 默认为100, 0则不显示中间过程
P(2) 最大迭代次数, 如算法不收敛, 自动停止, 默认为2000
P(3) 初始粒子数, 越多则越有可能收敛到全局最优值, 默认为24
P(4) 加速度参数, 影响局部最优值, 默认为2
P(5) 加速度参数, 影响全局最优值, 默认为2
P(6) 初始时刻加权值, 默认0.9
P(7) 收敛时刻加权值, 默认0.4
P(8) 当迭代次数超过此值时, 加权取其最小, 默认为1500
P(9) 终止算法的阈值, 连续两次迭代中对于的种群最优值小于此阈值时,算法停止, 默认为1e-25
P(10) 终止算法的阈值, 连续n次迭代函数的梯度没有变化,则算法停止
P(11) 说明优化的情况, NaN表示非约束下的优化问题
P(12) 0则表示通常的PSO算法
P(13) 0表示随机产生种子, 1表示用户自行产生种子

3.4 小结

  1. 在调用pso_Trelea_vectorized()pso\_Trelea\_vectorized()pso_Trelea_vectorized()函数过程中, 出现forcerowforcerowforcerow函数无法识别的问题, 通过查看PSOt文件夹, 发现在子文件夹路径下存在forcerow.mforcerow.mforcerow.m文件, 将PSOt及其子文件夹全部添加到搜索路径后, 问题解决.
  2. 在使用粒子群算法对二元函数进行最值求解时, 通过网络下载PSOt工具箱, 编写test_func.m函数test\_func.m函数test_func.m函数,设置参数x,yx,yx,y的变化范围,最大速度的取值,待优化函数的维数等参数, 进行调用, 得到结果.逐行书写代码有利于加深算法的数学理解, 原理的实现. 但在工程性方面, 自行书写代码性能不如算法工程师所写的Pso_Prelea_vectorizedPso\_Prelea\_vectorizedPso_Prelea_vectorized函数, 因此, 在充分理解原理的基础上, 直接调用函数(或使用APP), 不仅有利于之后的再次使用, 而且对于各种参数的配置有了一定经验, 对于使用粒子群算法解决其他类型问题有一定帮助.
  3. 粒子群算法适合解决二元函数最优值问题, 仅需要调整少数几个参数即可实现函数的优化.

群智能算法(遗传算法, 粒子群算法, 蚁群算法原理与实例分析)相关推荐

  1. 群智能算法 第4关:蚁群算法 - 商队旅行最短路径计算

    任务描述 本关任务:使用 python 实现蚁群算法,并寻找商队旅行最短路径. 相关知识 为了完成本关任务,你需要掌握:1.蚁群算法原理,2.蚁群算法流程,3.使用蚁群算法解决商队旅行问题. 蚁群算法 ...

  2. 蚁群算法画图java_[转载]简单蚁群算法 + JAVA实现蚁群算法

    一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...

  3. 蚁群算法java实现_简单蚁群算法 + JAVA实现蚁群算法

    一 引言 蚁群算法(ant colony optimization,ACO),又称蚂蚁算法,是一种用来在图中寻找优化路径的机率型技术.它由Marco Dorigo于1992年在他的博士论文中引入,其灵 ...

  4. 现代优化算法(五): 蚁群算法

    组合优化算法系列: 现代优化算法 (一):模拟退火算法 及应用举例 现代优化算法 (二): 遗传算法 及应用举例 现代优化算法(三):禁忌搜索算法 现代优化算法(四):改进的遗传算法 现代优化算法(五 ...

  5. 链路状态算法实现Java,JAVA基于蚁群算法路由选择可视化动态模拟(开题报告+任务书+毕业论文+外文翻译+源代码+可执行程序+答辩P...

    JAVA基于蚁群算法路由选择可视化动态模拟(开题报告+任务书+毕业论文+外文翻译+源代码+可执行程序+答辩PPT) 摘 要 路由选择是一种基于网络层的协议,而所有流行的网络层路由选择协议都是基于以下两 ...

  6. 蚁群算法解决tsp问题python_蚁群算法在解决TSP问题中的应用

    陈灵佳 文章首先对蚁群算法与TSP问题进行简要介绍,在此基础上对蚁群算法在解决TSP问题中的应用进行论述.期望通过本文的研究能够对TSP问题的解决有所帮助. [关键词]蚁群算法 TSP问题 最优解 1 ...

  7. 多目标优化蚁群算法的matlab_混合参数蚁群算法的改进优化

    蚁群算法是一个功能强大的优化算法,常用来求解旅行商 (TSP) 问题.本文分享一个我自己写的蚁群算法 Matlab 程序代码,详细交代其中的优化点.主要特色是对蚁群的 启发参数采用 混合参数,即每只蚂 ...

  8. 计算机视觉与深度学习 | 粒子群算法与遗传算法(GA)及与蚁群算法(ACO)比较

    ================================================ 博主github:https://github.com/MichaelBeechan 博主CSDN:h ...

  9. 【蚁群路径规划】基于MATLAB的蚁群算法的二维路径规划

    %% 清空环境 clc;clear%% 障碍物数据 position = load('barrier.txt'); plot([0,200],[0,200],'.'); hold on B = loa ...

  10. 蚂蚁算法求解tsp问题matlab,蚁群算法解决TSP问题的MATLAB程序

    蚁群算法TSP(旅行商问题)通用matlab程序 function [R_best,L_best,L_ave,Shortest_Route,Shortest_Length]=ACATSP(C,NC_m ...

最新文章

  1. 【Oracle】Oracle常用EVENT之三
  2. 【2019浙江省赛 - A】Vertices in the Pocket(权值线段树下二分,图,思维)
  3. Game Center Achievements and Leaderboards part 1 转
  4. c语言中用指针倒序输出,菜鸟求助-如何用指针法将一串字符按单词的倒序输出?如:i love yo...
  5. 好男人是这样爱老婆的
  6. au计算机内录音乐,电脑中如何使用 Audition 内录声音
  7. 标准模型与随机预言模型的比较
  8. r语言算巢式设计方差分析_R语言学习笔记(七):方差分析
  9. netty报错 io.netty.util.IllegalReferenceCountException: refCnt: 0, decrement: 1
  10. Liferay Portal 7.4 GA3 and Liferay Commerce 4.0 GA3 Release
  11. 字段是否包含中文、英文、数字
  12. 给图像增加一种噪声,构造并利用至少两种低通或高通滤波器实现频率域的滤波,并且显示滤波后的图像
  13. HEU 3014 Piggy-Bank
  14. Vscode国内直接下载地址!!!,看过来
  15. 备考蓝桥杯(26)漏掉的账单明细,(遍历所有情况)(java实现)(exforward)
  16. (十 七)张量函数的微分与导数
  17. java web搜索引擎优化_搜索引擎优化(SEO)与网站开发优化
  18. amd显卡没有屏幕旋转快捷键,自己写一个
  19. 泛式算法,仿函数和迭代器失效问题
  20. MyBatis-Plus 快速入门案例

热门文章

  1. [转]国内外sns源码搜集
  2. 兼容各个浏览器的H.264播放: H.264+HTML5+FLOWPLAYER+WOWZA+RMTP
  3. react代码编辑器 react-ace
  4. 系统集成项目管理工程师考试大纲和复习知识点
  5. ASIO Link Pro 声卡跳线(搭配福克斯特solo声卡)
  6. ElasticJob3.0整合SpringBoot,ElasticJob-Lite【ElasticJob入门篇】
  7. 韦根协议及IO模拟韦根34接口
  8. Delphi POS打印的处理
  9. android9 三星 港版,三星S10+官方港版安卓9完整固件升级更新包:TGY-G9750ZHU1ASF1
  10. win10安装steam有损计算机,Win10专业版修复Steam磁盘写入错误的方法