Matlab智能优化算法学习笔记(一)——粒子群算法、模拟退火算法、遗传算法、蚁群算法

news2024/11/18 16:32:50

文章目录

  • 粒子群算法
    • △ matlab工具箱粒子群函数
      • ○ 代码
      • ○ 手搓代码实现粒子群优化 2个变量(xy)的粒子群优化尝试
        • · 定义函数
        • · 绘制网格图(用来可视化过程)
        • · 参数初始化,绘制粒子初始位置
        • · 开始迭代过程并绘图
        • · 获取结果并绘图
        • · 运行结果
  • 遗传算法
    • △ 遗传算法概念


最近在做一些机器人位姿优化方面的东西,学习了一下关于智能优化算法方面的内容,于是在这里整理一下。
最近时间比较紧张,就不写太详细了

❤ 2023.12.12 ❤

粒子群算法

参考资料

B站的一个视频,比较简单给了代码
→→→【Matlab 粒子群算法PSO实例学习(有代码和详细注释)】

这个也是B站视频,里面是一个关于matlab优化算法的13讲课程中的一部分,完整版的课程和资料还是很好找的,但是这个课程有点旧,当然里面的算法就更旧了。。。
→→→【我居然只花4个小时就学懂了【优化算法】,遗传算法、蚁群算法、模拟退火算法、粒子群优化算法】

关于粒子群算法参数的调整与改进
→→→【Matlab粒子群算法(PSO)优化程序——调整权重、改进学习因子】

matlab自带的智能算法工具箱的简单介绍
→→→【3-7matlab自带的粒子群工具箱的讲解和演示视频课程】

→→→【】


△ matlab工具箱粒子群函数

○ 代码

使用matlab工具箱实现粒子群还是很简单的,但是可以调节的参数有限,不过胜在简单

%% 配置参数
options = optimoptions('particleswarm');
options.SwarmSize = 50;  % 粒子数量
options.MaxIterations = 50;  % 最大迭代次数
options.Display = 'iter';  % 显示每次迭代的信息
% options.UseParallel = true; % 开启并行计算
options.PlotFcn = 'pswplotbestf';

nvars = 6;  % 变量的数量
% 变量范围
% x[0.5, 3]
% y[-1.5, 2]
% z[1, 3]?
% A[-180, 180]
% B[-90, 90]
% C[-90, 90]
lb = [0.5,  -2,     1,  -180,   -90,    -90];
ub = [3,     1.5,   3,   180,    90,     90];

% 开始计时
tic;

[x, fval] = particleswarm( @(x) -1 * objectiveFunction(x), nvars, lb, ub, options);

% 结束计时
SolvingTime = toc;

fprintf('程序运行时间:%.2f 秒。\n', SolvingTime);

disp("最优解: " + mat2str(x));
disp("目标函数值: " + num2str(-fval));

%% 
function y = objectiveFunction(x)

    Pose_workpiece = [x(1) x(2) x(3) x(4) x(5) x(6)];
    y = Get_Comprehensive_Stability_Coefficient_PSO(Pose_workpiece);
end

需要注意的是函数默认寻找的是最小值,如果想找的是最大值需要手动加个负号

另外据chatgpt说也可以实时监测求解过程的情况,但是他给的代码一直报错我就放弃了。。。


○ 手搓代码实现粒子群优化 2个变量(xy)的粒子群优化尝试

我的代码基于

→→→【Matlab 粒子群算法PSO实例学习(有代码和详细注释)】

感谢up~

· 定义函数

Pose_workpiece = [x(1) x(2) 1.3 0 -45 0];

因为更改了原点位置,所以曲面图有变化

surf:
在这里插入图片描述

mesh:
在这里插入图片描述

% xy优化
function y = objectiveFunction(x)

%     Pose_workpiece = [x(1) x(2) x(3) x(4) x(5) x(6)];
    Pose_workpiece = [x(1) x(2) 1.3 0 -45 0];
    y = Get_Comprehensive_Stability_Coefficient_PSO(Pose_workpiece);
end

· 绘制网格图(用来可视化过程)

%% 调用函数绘制网格
f = @(x) objectiveFunction(x);
figure(1);
[X, Y] = meshgrid(1:0.1:3, -2:0.1:2);  % 生成网格数据
x = [X(:), Y(:)];

% 对 x 中的每一行应用函数 f
% y0 = arrayfun(@(i) f(x(i, :)), 1:size(x, 1));
y0 = load('y0_for_test_mesh_data.mat'); % 将计算好的网格数据读入
y0 = y0.y0;

% 重塑 y0 以匹配 X 和 Y 的尺寸
y0_matrix = reshape(y0, size(X));

% 计算梯度
[Cx, Cy] = gradient(y0_matrix, 0.1, 0.1);

% 绘制网格图
mesh(X, Y, y0_matrix);

                                    %  colorbar;%可以看到色板,也可以给指定区域指定颜色
                                    %set(h,'EdgeColor','b','FaceColor','w','MarkerEdgecolor','r','MarkerFacecolor','y')
xlabel('第一维度x的取值范围');
ylabel('第二维度y的取值范围');
zlabel('函数值');
hold on;

就是上面那个效果


· 参数初始化,绘制粒子初始位置
%% 开始种群等基本定义
N = 50;                           % 初始种群个数
d = 2;                             % 空间维数(参看上述的函数表达式)
ger = 50;                         % 最大迭代次数     
plimit = [1,3;-2,2];              % 设置位置参数限制(矩阵的形式可以多维),现在2X2矩阵
vlimit = [-0.5, 0.5;-0.5, 0.5];    % 设置速度限制【?】
w = 0.8;                           % 惯性权重,个体历史成绩对现在的影响0.5~1之间【?】
%还有自适应调整权重、随机权重等等
%(不同的权重设置很影响性能,按需要选取)

c1 = 0.5;                          % 自我学习因子【?】
c2 = 0.5;                          % 群体学习因子 【?】

tic;                              %计时开始

 for i = 1:d
    x(:,i) = plimit(i, 1) + (plimit(i, 2) - plimit(i, 1)) * rand(N, 1);%初始种群的位置
 end                              %rand(N,1)产生N行一列范围在1之内的随机数
                                  %第一列,第二列:x=0+(20-0)*(1之内的随机数)                                    
 
v = rand(N, d);                   % 初始种群的速度,500行2列分别在两个维度上
xm = x;                           % 每个个体的历史最佳位置
ym = zeros(1, d);                 % 种群的历史最佳位置,两个维度,设置为0
fxm = zeros(N, 1);                % 每个个体的历史最佳适应度,设置为0
fym = -inf;                       % 种群历史最佳适应度,求最大值先设置成负无穷

n = size(x, 1);
fx_plot = zeros(n, 1);  % 初始化结果数组
parfor i = 1:n
    fx_plot(i) = f(x(i, :));
end

plot3(xm(:,1),xm(:,2),fx_plot, 'mo');   %r红,g绿,b蓝,c蓝绿,m紫红,y黄,k黑,w白
title('种群初始分布状态图');        %plot3在三维区域画出空间上的点,把格式设置成‘o’用来画每个位置的散点图
hold on;  

%figure(2);
%mesh(x0_1, x0_2, y0);
%hold on;
%plot3(xm(:,1),xm(:,2),f(xm(:,1),xm(:,2)), 'ro');
%hold on;

iter=1;                             %初始的迭代次数因为用while设置为一

times = 1; 
record = zeros(ger, 1);             %记录器

在这里插入图片描述

还挺好看。。。


· 开始迭代过程并绘图
%% 迭代更新开始
while iter <= ger
%      fx = f(x(:,1),x(:,2));         % 代入x中的二维数据,算出个体当前适应度,为500行1列的数据   
    
    n = size(x, 1);
    fx = zeros(n, 1);  % 初始化结果数组
    parfor i = 1:n
        fx(i) = f(x(i, :));
    end

    for i = 1:N                    %对每一个个体做判断
        if fxm(i) < fx(i)           %如果每个个体的历史最佳适应度小于个体当前适应度
            fxm(i) = fx(i);         % 更新个体历史最佳适应度,第一轮就是把小于零的清除
            xm(i,:) = x(i,:);       % 更新个体历史最佳位置
        end 
    end
     
    if fym < max(fxm)                  %种群历史最佳适应度小于个体里面最佳适应度的最大值
            [fym, nmax] = max(fxm);    % 更新群体历史最佳适应度,取出最大适应度的值和所在行数即位置
            ym = xm(nmax, :);          % 更新群体历史最佳位置
    end

    % 速度更新
    v = v * w + c1 * rand *(xm - x) + c2 * rand *(repmat(ym, N, 1) - x); % 速度更新公式,repmat函数把ym矩阵扩充成N行1列

    % 边界速度处理
    for i=1:d 
        for j=1:N
            if  v(j,i)>vlimit(i,2)      %如果速度大于边界速度,则把速度拉回边界
                v(j,i)=vlimit(i,2);
            end
            if  v(j,i) < vlimit(i,1)     %如果速度小于边界速度,则把速度拉回边界
                v(j,i)=vlimit(i,1);
            end
        end
    end      
   
    % 位置更新
    x = x + v; % 位置更新
  
    for i=1:d 
        for j=1:N
            if  x(j,i)>plimit(i,2)
                x(j,i)=plimit(i,2);
            end
            if  x(j,i) < plimit(i,1)
                x(j,i)=plimit(i,1);
            end
        end
    end
  
    record(iter) = fym;            %记录最大值
  
    if times >= 2
        cla;                    %清除轴线图形
        mesh(X, Y, y0_matrix);

        % 并行计算优化
        n = size(x, 1);
        fx_plot = zeros(n, 1);  % 初始化结果数组
        parfor i = 1:n
            fx_plot(i) = f(x(i, :));
        end

        plot3(x(:,1),x(:,2),fx_plot, 'ro');title('状态位置变化');
        pause(0.5);
        times=0;
    end
    iter = iter+1;
    times=times+1;
end

· 获取结果并绘图
%% 作图
figure(3);
plot(record);                %画出最大值的变化过程
title('收敛过程');


figure(4);
mesh(X, Y, y0_matrix);
hold on;

% 并行计算优化
n = size(x, 1);
fx_plot = zeros(n, 1);  % 初始化结果数组
parfor i = 1:n
    fx_plot(i) = f(x(i, :));
end

plot3(x(:,1),x(:,2),fx_plot, 'ro');title('最终状态图');

disp(['最大值为:',num2str(fym)]);
disp(['最大值点位置:',num2str(ym)]);
toc;    %计时结束

· 运行结果

设置种群数量10,迭代次数10,验证程序流程

在这里插入图片描述

符合预期


遗传算法

△ 遗传算法概念

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1322585.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机毕业设计—基于Koa+vue的高校宿舍管理系统宿舍可视化系统

项目介绍 项目背景 随着科技的发展&#xff0c;智能化管理越来越重要。大学生在宿舍的时间超过了1/3&#xff0c;因此良好的宿舍管理对学生的生活和学习极为关键。学生宿舍管理系统能够合理安排新生分配宿舍&#xff0c;不浪费公共资源&#xff0c;减轻学校管理压力&#xff…

[C++] 多态(下) -- 多态原理 -- 动静态绑定

文章目录 1、多态原理2、动态绑定和静态绑定3、单继承和多继承关系的虚函数表3.1 单继承中的虚函数表5.2 多继承中的虚函数表 上一篇文章我们了解了虚函数表&#xff0c;虚函数表指针&#xff0c;本篇文章我们来了解多态的底层原理&#xff0c;更好的理解多态的机制。 [C] 多态…

JavaSE学习笔记 Day20

JavaSE学习笔记 Day20 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 上一篇 文章目录 JavaSE学习笔记 Day20十七、数据结构与算法17.1算法17.1.1冒泡排序17.1.2选择排序17.1.3插入排序17.1.4三个排序的区别 17.2顺序表17.2.1顺序表代码实现17.2.2顺…

Python+pip下载与安装

Hi, I’m Shendi Pythonpip下载与安装 最近有识别图片中物体的需求&#xff0c;于是选用了TensorFlow&#xff0c;在一番考虑下&#xff0c;还是选择直接使用Python。 Python下载安装 直接在搜索引擎搜索Python或通过 https://www.python.org 进入官网 在 Downloads 处点击 Al…

腾讯云debian服务器的连接与初始化

目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后&#xff0c;只需要在防火墙里面添加一个白名单&#xff08;ip 或者域名&#xff09;就能访问了。 防火墙添加本机WLAN的IPv4白名单&#xff0c;本地用一个远程工具连接&#xff…

JAVA:深入探讨Java 8 Stream的强大功能与用法

1、简述 Java 8引入了Stream API&#xff0c;为处理集合数据提供了一种更为强大和灵活的方式。Stream是一种抽象的数据结构&#xff0c;它允许你以一种声明性的方式处理数据集合。与传统的集合操作不同&#xff0c;Stream并不是一个存储数据的数据结构&#xff0c;而是在源数据…

到底该如何优化代码?怎样会使得代码更加糟糕?

文章目录 前言开始语法规范有函数式方法的尽量用判断字符串为空不要自己写equals判定,常量写前面少用魔法值,定义常量无状态方法,可选择定义为类静态 逻辑简化明确主体逻辑语法简化:三元运算符语法简化:Optional方法独立存在的必要性讨论 继续拓展:定义枚举值枚举构建关系枚举构…

【 AI 两步实现文本 转 语音】

基于hugging face 中 XTTS-v2 模型做文本转语音&#xff0c;此模型支持17种语言 1.登录hugging face 官网 https://huggingface.curated.co/ 或者 https://hf-mirror.com/models 找到models处下载XTTS-V2 如果你全程可以联网&#xff08;/huggingface.co&#xff09;直接步骤…

福德植保无人机:让植保工作更轻松

亲爱的读者们&#xff0c;欢迎来到我们的公众号&#xff01;今天&#xff0c;我想和大家分享一个我们生活中不可或缺的东西——福德植保无人机。它不仅改变了我们的植保工作&#xff0c;更提升了工作效率&#xff0c;减少了人工负担。福德植保无人机&#xff0c;一家在植保无人…

MS5602数模转换器可Pin to Pin兼容TLC5602

MS5602是低功率、超高速视频数模转换器。可Pin to Pin兼容TLC5602。MS5602以从DC至20MHz的采样速率将数字信号转换成模拟信号。由于高速工作&#xff0c;MS5602适合于数字电视、电脑视频处理及雷达信号处理等数字视频应用。 MS5602 工作于-40℃至 85℃。 主要特点 8 位分辨率…

面试算法56:二叉搜索树中两个节点的值之和

题目 给定一棵二叉搜索树和一个值k&#xff0c;请判断该二叉搜索树中是否存在值之和等于k的两个节点。假设二叉搜索树中节点的值均唯一。例如&#xff0c;在如图8.12所示的二叉搜索树中&#xff0c;存在值之和等于12的两个节点&#xff08;节点5和节点7&#xff09;&#xff0…

输出26个英文字母 C语言xdoj97

描述&#xff1a; 编写一个程序&#xff0c;分别按正向和逆向输出小写字母。 输入说明&#xff1a; 无。 输出说明&#xff1a; 字母间以空格分隔&#xff0c;正向输出完换行&#xff0c;再逆向输出。 输入样例 无。 输出样例 无。 #include <stdio.h>//输出26个英文字…

【迁移学习论文四】Multi-Adversarial Domain Adaptation论文原理及复现工作

Multi-Adversarial Domain Adaptation 多对抗域适应 前言 好久没有更新了&#xff0c;所以这周开始记录下来&#xff0c;也好督促自己。记录本人预备研究生阶段相关迁移学习论文的原理阐述以及复现工作。 问题 跨域混淆或错误对齐 文章介绍 这篇文章于2018年发表在AAAI&…

评价机器学习模型的指标

为了衡量一个机器学习模型的好坏&#xff0c;需要给定一个测试集&#xff0c;用模型对测试集中的每一个样本进行预测&#xff0c;并根据预测结果计算评价分数。 对于分类问题&#xff0c;常见的评价标准有准确率、精确率、召回率和F值等。给定测试集 &#x1d4af; {(&#x1…

系统设计——系统安全

HTTPS 是如何工作的&#xff1f; 安全超文本传输​​协议&#xff08;HTTPS&#xff09;是超文本传输​​协议&#xff08;HTTP&#xff09;的扩展。HTTPS 使用传输层安全性&#xff08;TLS&#xff09;传输加密数据。如果数据在网上被劫持&#xff0c;劫持者得到的只是二进制…

selenium-wire简介

一.简介 以下来自chatGPT回答&#xff1a; selenium-wire是一个基于selenium的Python库&#xff0c;它扩展了selenium的功能&#xff0c;使得我们可以在自动化测试中直接访问和修改浏览器的网络请求和响应。selenium-wire可以拦截和修改HTTP请求和响应&#xff0c;从而可以在…

【一周安全资讯1216】欧盟就AI监管《人工智能法案》达成历史性协议;赛迪发布《中国网络安全测评服务市场研究报告 (2023)》

要闻速览 1、欧盟就全球首个AI监管《人工智能法案》达成历史性协议 2、我国牵头提出的国际标准《信息技术 网络安全 第7部分&#xff1a;网络虚拟化安全指南》正式发布 3、《粤港澳大湾区&#xff08;内地、香港&#xff09;个人信息跨境流动标准合同实施指引》发布 4、赛迪顾…

三相异步电机动态数学模型推导及矢量控制仿真

文章目录 **原文链接&#xff0c;点击跳转**三相异步电机动态数学模型及矢量控制仿真1、异步电机三相方程2、坐标变换3、磁链3/2变换推导4、两相静止坐标系下的方程5、两相旋转坐标系下的方程6、以 ω-is-Ψr 为状态变量的状态方程7、矢量控制及 matlab 仿真 原文链接&#xff…

【C语言】数据结构——链式二叉树实例探究

&#x1f497;个人主页&#x1f497; ⭐个人专栏——数据结构学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 导读&#xff1a; 我们在前面学习了单链表&#xff0c;顺序表&#xff0c;栈和队列&#xff0c;小堆。 今天我们来学习链式二叉…

WPF仿网易云搭建笔记(7):HandyControl重构

文章目录 专栏和Gitee仓库前言相关文章 新建项目项目环境项目结构 代码结果结尾 专栏和Gitee仓库 WPF仿网易云 Gitee仓库 WPF仿网易云 CSDN博客专栏 前言 最近我发现Material Design UI的功能比较简单&#xff0c;想实现一些比较简单的功能&#xff0c;比如消息提示&#xff0…