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

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题

  • 前言
  • 正文
  • 函数实现
  • 可视化处理
    • 可视化结果

前言

一维线性函数,也称为一次函数,是指只有一个自变量xxx的函数,且函数表达式可以写成y=ax+by=ax+by=ax+b的形式,其中aaabbb是常数。具体来说,aaa称为斜率,决定了函数图像的倾斜程度;bbb称为截距,决定了函数图像与yyy轴的交点位置。
优化一维线性函数的目标是找到一个使得函数值最小或最大的xxx值。

粒子群算法(Particle Swarm Optimization,PSO) 是一种启发式优化算法,它源于对鸟群捕食行为的研究。在粒子群算法中,被优化的问题被视为一个多维空间中的目标函数,算法通过模拟群体中每个粒子在空间中的搜索行为来寻找目标函数的全局最优解。

每个粒子在搜索空间中的位置表示一个潜在解,其速度表示了搜索方向和步长。每个粒子具有一个适应度值,该适应度值根据目标函数的表现来计算。粒子群算法通过协同粒子的行为来优化目标函数。粒子的速度和位置在每个迭代中被更新,使其朝着群体中的最佳位置和全局最佳位置移动。

粒子群算法的运行过程如下:

  1. 初始化粒子群,包括每个粒子的初始位置和速度,并设置全局最佳位置和全局最佳适应度值为初始值。
  2. 计算每个粒子的适应度值,更新全局最佳位置和全局最佳适应度值。
  3. 更新每个粒子的速度和位置,根据每个粒子当前位置与全局最佳位置之间的差异来调整速度和位置。
  4. 重复步骤23,直到达到指定的停止准则,如达到最大迭代次数或满足收敛要求。

在实践中,粒子群算法经常与其他优化算法结合使用,例如遗传算法、模拟退火等。这些算法的组合可以提高搜索效率和准确性,从而提高优化问题的解决效率。

正文

粒子群算法可以用来优化一维线性函数。具体地,我们可以将一维线性函数f(x)f(x)f(x)转化为目标函数y(x)y(x)y(x),使得y(x)y(x)y(x)的取值范围为[0, 1],且函数值越小表示越优,函数值越大表示越差。具体转化方式如下:

y(x)=f(x)−min⁡f(x)max⁡f(x)−min⁡f(x)y(x) = \frac{f(x) - \min f(x)}{\max f(x) - \min f(x)}y(x)=maxf(x)minf(x)f(x)minf(x)

其中max⁡f(x)\max f(x)maxf(x)min⁡f(x)\min f(x)minf(x)分别是函数f(x)f(x)f(x)在一定区间内的最大值和最小值。这样,优化f(x)f(x)f(x)就可以转化为优化y(x)y(x)y(x),即找到使得y(x)y(x)y(x)最小的xxx值。

在粒子群算法中,我们可以初始化一些粒子,并在每一次迭代中更新粒子的速度和位置,直到达到一定的停止条件。在更新速度和位置时,我们需要使用上文提到的公式,同时需要指定一些超参数,例如学习因子、惯性权重、加速度权重等。具体可以参考之前的回答。

在优化一维线性函数时,粒子群算法可以在一定的迭代次数内找到一个相对较优的解。但是需要注意,对于线性函数,我们也可以通过解析求导的方式直接求得最优解,因此粒子群算法在实际中并不常用于优化线性函数。

函数实现

%%
clear
close all
warning off
clc
%%
% 调用粒子群算法求解
x_min = -10;
x_max = 10;
n_pop = 50;
n_iter = 100;
w = 0.8;
c1 = 1.5;
c2 = 1.5;
[gbest, gbest_val] = pso(@objfun, x_min, x_max, n_pop, n_iter, w, c1, c2);% 输出结果
fprintf('最优解:x = %f,最优值:%f\n', gbest, gbest_val);% 目标函数
function y = objfun(x)y = 2*(x-3).^2 + 10;
end% 粒子群算法
function [gbest, gbest_val] = pso(objfun, x_min, x_max, n_pop, n_iter, w, c1, c2)% 参数设置x_range = x_max - x_min;v_min = -x_range;v_max = x_range;% 初始化粒子pop = x_min + rand(n_pop, 1) * x_range;v = v_min + rand(n_pop, 1) * (v_max - v_min);pbest = pop;pbest_val = objfun(pop);[gbest_val, gbest_idx] = min(pbest_val);gbest = pbest(gbest_idx);% 迭代for i = 1:n_iter% 更新速度和位置r1 = rand(n_pop, 1);r2 = rand(n_pop, 1);v = w*v + c1*r1.*(pbest-pop) + c2*r2.*(gbest-pop);pop = pop + v;% 边界处理pop(pop < x_min) = x_min;pop(pop > x_max) = x_max;% 更新个体历史最优和全局历史最优pbest_val_new = objfun(pop);pbest_update_idx = pbest_val_new < pbest_val;pbest(pbest_update_idx) = pop(pbest_update_idx);pbest_val(pbest_update_idx) = pbest_val_new(pbest_update_idx);[gbest_val_new, gbest_idx_new] = min(pbest_val);if gbest_val_new < gbest_valgbest = pbest(gbest_idx_new);gbest_val = gbest_val_new;endend
end

通过改变xxx的范围xmin=−10;xmax=10;x_min = -10;x_max = 10;xmin=10;xmax=10;来得到一维线性函数的最优值

可视化处理

%%
clear
close all
warning off
clc
%%
% 调用粒子群算法求解
x_min = -10;
x_max = 10;
n_pop = 50;
n_iter = 100;
w = 0.8;
c1 = 1.5;
c2 = 1.5;
[gbest, gbest_val] = pso(@objfun, x_min, x_max, n_pop, n_iter, w, c1, c2);% 输出结果
fprintf('最优解:x = %f,最优值:%f\n', gbest, gbest_val);% 可视化处理
x = linspace(x_min, x_max, 1000);
y = objfun(x);
figure();
plot(x, y, 'linewidth', 2);
hold on;
scatter(gbest, gbest_val, 100, 'r', 'filled');
xlabel('x');
ylabel('y');
title('PSO for 1D Nonlinear Function');
legend('Objective Function', 'Optimum');
grid on;% 目标函数
function y = objfun(x)y = 2*(x-3).^2 + 10;
end% 粒子群算法
function [gbest, gbest_val] = pso(objfun, x_min, x_max, n_pop, n_iter, w, c1, c2)% 参数设置x_range = x_max - x_min;v_min = -x_range;v_max = x_range;% 初始化粒子pop = x_min + rand(n_pop, 1) * x_range;v = v_min + rand(n_pop, 1) * (v_max - v_min);pbest = pop;pbest_val = objfun(pop);[gbest_val, gbest_idx] = min(pbest_val);gbest = pbest(gbest_idx);% 迭代for i = 1:n_iter% 更新速度和位置r1 = rand(n_pop, 1);r2 = rand(n_pop, 1);v = w*v + c1*r1.*(pbest-pop) + c2*r2.*(gbest-pop);pop = pop + v;% 边界处理pop(pop < x_min) = x_min;pop(pop > x_max) = x_max;% 更新个体历史最优和全局历史最优pbest_val_new = objfun(pop);pbest_update_idx = pbest_val_new < pbest_val;pbest(pbest_update_idx) = pop(pbest_update_idx);pbest_val(pbest_update_idx) = pbest_val_new(pbest_update_idx);[gbest_val_new, gbest_idx_new] = min(pbest_val);if gbest_val_new < gbest_valgbest = pbest(gbest_idx_new);gbest_val = gbest_val_new;endend
end

可视化结果

函数y = 2*(x-3).^2 + 10

相关文章:

【Matlab算法】粒子群算法求解一维线性函数问题(附MATLAB代码)

MATLAB求解一维线性函数问题前言正文函数实现可视化处理可视化结果前言 一维线性函数&#xff0c;也称为一次函数&#xff0c;是指只有一个自变量xxx的函数&#xff0c;且函数表达式可以写成yaxbyaxbyaxb的形式&#xff0c;其中aaa和bbb是常数。具体来说&#xff0c;aaa称为斜…...

【JavaEE】Thread 类及常用方法

一、Thread 类Thread 类我们可以理解为是 java 用于管理线程的一个类&#xff0c;里面封装了操作系统提供的线程管理这一方面的 API &#xff08;Thread 是优化后的结果&#xff09;, Java 代码创建的每一个线程&#xff0c;可以理解为为 Thread 实例化的对象&#xff0c;Threa…...

C语言数据结构初阶(7)----队列

CSDN的uu们&#xff0c;大家好。这里是C语言数据结构的第七讲。 目标&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a;姬如祎队列的基础知识队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除…...

代码随想录二刷 day01 | 704. 二分查找 27. 移除元素 977. 有序数组的平方

代码随想录二刷day01704. 二分查找27. 移除元素977. 有序数组的平方704. 二分查找 题目链接 做这种题最好现在纸上写一写&#xff0c;如果在大脑中想&#xff0c;可能一会就晕了。 二刷的时候发现了一个新的知识点 即&#xff1a; >>的作用 二分法第二种写法&#xff1a…...

Linux 终端、进程组、会话、守护进程

文章目录一、终端概念终端概念控制终端二、进程组概念进程组概述进程组相关 API会话会话概念会话相关 API创建会话注意事项守护进程守护进程介绍守护进程模型守护进程参考代码守护进程相关 API参考文章一、终端概念 终端概念 1、终端&#xff08;Terminal&#xff09; 终端是…...

你是否有潜质成为谷歌开发者专家?加入 GDE 成长计划,释放潜力!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…...

安全防御之防火墙篇(二)

目录 1.防火墙如何处理双通道协议&#xff1f; 2.防火墙如何处理NAT&#xff1f; 3.防火墙支持哪些NAT技术&#xff0c;主要应用的场景是什么&#xff1f; 4.当内网PC通过公网域名解析访问内网服务器的时候&#xff0c;会存在什么问题&#xff0c;如何解决&#xff1f;请详细…...

设计必备,5个png免抠素材网站,建议收藏

做设计、PPT都需要用到大量的免抠素材&#xff0c;职场中熟练使用Photoshop的人毕竟是少数&#xff0c;也很少有人愿意花费时间去精细抠图。那这5个免抠素材网站一定要收藏好&#xff0c;可以有效帮你节省时间&#xff0c;提高工作效率。 1、菜鸟图库 https://www.sucai999.co…...

shell 脚本expect

expect 是什么 expect - programmed dialogue with interactive programs&#xff08;与互动程序进行程序对话&#xff09; 定义脚本执行的 shell #!/usr/bin/expect -f 定义的是执行 expect 可执行文件的链接路径&#xff08;或真实路径&#xff09;&#xff0c;功能类似于bas…...

第十九天 Maven总结

目录 Maven 1. 前言 2. 概述 2.1 介绍 2.2 安装 3. IDEA集成Maven 3.1 集成Maven环境 3.2 创建Maven项目 3.3 Maven坐标详解 3.4 导入maven项目 4. 依赖管理 4.1 依赖配置 4.2 依赖传递 4.3 依赖范围 4.4 生命周期 4.5 插件 Maven 1. 前言 1). 什么是Maven? …...

ESP8266-NodeMCU开发板-------开发板介绍(1)

目录 认识ESP8266-NodeMCU开发板​编辑 GPIO编号与NodeMCU开发板引脚名的区别&#xff1a; ESP8266 GPIO编号与NodeMCU开发板引脚名的对应关系 可用引脚 电压电流限制 特殊引脚情况说明 上拉电阻/下拉电阻 模拟输入 通讯 认识ESP8266-NodeMCU开发板 初识NodeMCU开发板 (第1章-第…...

【测试开发篇3】软件测试的常用概念

目录 一、软件测试的生命周期(5个步骤) ①需求分析(两个角度) 用户角度&#xff1a; 开发人员的角度&#xff1a; ②测试计划 ③测试设计、测试开发 ④执行测试 ⑤测试评估 二、软件测试贯穿项目的整个生命周期的体现 需求分析阶段 计划阶段 设计阶段 编码阶段 …...

javaEE初阶 — JavaScript WebAPI

文章目录什么是 DOMDOM 树获取元素1. querySelector2. querySelectorAll事件1. 事件三要素2. 代码案例获取 / 修改元素内容1. innerHTML获取 / 修改元素属性获取 / 修改表单元素属性获取 / 修改样式属性1. 修改内联样式&#xff08;修改 style 属性的值&#xff09;2. 修改元素…...

UE实现地面动态交互效果

文章目录 1.实现目标2.实现过程2.1 SphereMask2.2 材质实现2.3 位置更新3.参考资料1.实现目标 基于SphereMask材质节点实现人物在地面一定范围内的颜色高亮效果。 2.实现过程 实现原理是首先通过,SphereMask材质节点更具计算输出Mask值,其中在球体半径内的输入1,在外部的则…...

如何用自己的数据训练YOLOv5

如何训练YOLOv5 1. Clone the YOLOv5 repository and install dependencies: git clone https://github.com/ultralytics/yolov5.git cd yolov5 pip install -r requirements.txt2. 整理数据&#xff0c;使其适配YOLO训练 Step1&#xff1a;Organize your dataset in the fo…...

【基础算法】数组相关题目

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招算法的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于代码随想录进行的&#xff0c;每个算法代码参考leetcode高赞回答和…...

MatBox—基于PyQt快速入门matplotlib的教程库

MatBox—基于PyQt快速入门matplotlib的教程库 __ __ _ _ _ _ _ _ _______ _ _ _ | \/ | | | | | | | | |(_)| | |__ __| | | (_) | || \ / | __ _ |…...

go channel使用

go语言中有一句名言&#xff1a; 不要通过共享内存来通信&#xff0c;而应该通过通信来共享内存。 channel实现了协程间的互相通信。 目录 一、channel声明 二、向channel发送数据 三、从channel读取数据 1. i, ok : <-c 2. for i : range c&#xff08;常用&#xff09…...

5. QtDesignStudio中的3D场景

1. 说明&#xff1a; 三维渲染开发是Design Studio的重要功能&#xff0c;且操作方便&#xff0c;设计效率非常高&#xff0c;主要用到的控件是 View3D ,可以在3D窗口中用鼠标对模型直接进行旋转/移动/缩放等操作&#xff0c;也可以为模型设置各种动画&#xff0c;执行一系列的…...

人工智能的几个研究方向

人工智能主要研究内容是&#xff1a;分布式人工智能与多智能主体系统、人工思维模型、知识系统、知识发现与数据挖掘、遗传与演化计算、人工生命、人工智能应用等等。 其中热门研究有以下几种。 一、计算机视觉 就包括图像识别&#xff0c;视频识别&#xff0c;具体应用有人…...

软件测试 - 常见的开发模型和测试模型

1.瀑布模型优点强调开发的阶段性, 强调早期计划及需求调查, 强调产品测试;缺点1. 由于瀑布模型是一种线型结构的模型, 也就意味着前一个阶段结束, 后一个阶段才能开始, 这就导致了风险往往会迟至后期的测试阶段才显露, 因而失去了及早纠正的机会.2. 瀑布模型中测试被后置, 导致…...

从零开始的机械臂yolov5抓取gazebo仿真(四)

Moveit与Gazebo联合仿真 上一篇博客已经将moveit!配置完毕&#xff0c;然而想要让moveit!控制gazebo中的机械臂&#xff0c;还需要进行一些接口的配置。现在我们有的功能包为sunday_description、sunday_moveit_config这两个功能包。且已经配置好xacro文件&#xff0c;本篇内容…...

C++修炼之筑基期第一层——认识类与对象

文章目录&#x1f337;专栏导读&#x1f337;什么是面向对象&#xff1f;&#x1f337;类的引入&#x1f337;什么是类&#x1f337;类的定义方式&#x1f337;类的访问限定符与封装&#x1f33a;访问限定符&#x1f33a;封装&#x1f337;类的作用域&#x1f337;类的实例化&a…...

IT 运营监控工具

在技术复杂性日益增加、业务竞争激烈的挑战以及消费者对服务中断接受度降低的世界中&#xff0c;IT 运营效率已成为增长、利润和成功的关键。IT 宕机的影响在几十年前威胁较小&#xff0c;现在意味着价值数百万美元的损失&#xff0c;有时甚至会损失各种规模的组织的业务和声誉…...

java线程之Thread类的基本用法

Thread类的基本用法1. Thread类的构造方法2. Thread的几个常见属性常见属性线程中断等待一个线程小鱼在上一篇博客详细的讲解了如何创建线程,java使用Thread类来创建多线程,但是对于好多没有相关经验的人来说,比较不容易理解的地方在于操作系统调度的执行过程. 我们通过下面代码…...

【js】多分支语句练习(2)

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;python学不会123 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习…...

Redis与MySQL的双写一致性问题

Redis与MySQL的双写一致性问题更新缓存&#xff1f; 删除缓存&#xff1f;先更新缓存再更新数据库先更新数据库&#xff0c;再更新缓存先删除缓存再更新数据库先更新数据库&#xff0c;再删除缓存解决方案1. 重试2. 异步重试2.1 使用消息队列实现重试2.2 Binlog实现异步重试删除…...

Java基础:笔试题

文章目录Java 基础题目1. 如下代码输出什么&#xff1f;2. 当输入为2的时候返回值是多少?3. 如下代码输出值为多少?4. 给出一个排序好的数组&#xff1a;{1,2,2,3,4,5,6,7,8,9} 和一个数&#xff0c;求数组中连续元素的和等于所给数的子数组解析第一题第二题第三题第四题方案…...

spring三级缓存以及@Async产生循环引用

spring三级缓存以及Async产生循环引用spring三级缓存介绍三级缓存解除循环引用原理源码对应1、获取A&#xff0c;从三级缓存中获取&#xff0c;没有获取到2、构造A&#xff0c;将A置入三级缓存构造A(创建A实例)置入缓存3、注入属性&#xff0c;构造B扫描缓存实例的相关信息注入…...

【洛谷刷题】蓝桥杯专题突破-深度优先搜索-dfs(5)

目录 写在前面&#xff1a; 题目&#xff1a;P2036 [COCI2008-2009#2] PERKET - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码…...