【Matlab算法】粒子群算法求解二维非线性优化问题(附MATLAB代码)

粒子群算法求解二维非线性优化问题

  • 前言
  • 正文
  • 步骤分解
  • 代码可视化
  • 完整代码实现

前言

二维非线性优化问题是指在二维空间中寻找一个点,使得目标函数在该点取得最小(或最大) 值,而这个目标函数是一个非线性函数。数学上,这类问题可以用以下的数学模型来描述:

假设有一个目标函数 f ( x , y ) f(x, y) f(x,y) ,其中 x x x y y y 是优化变量,表示二维空间中的坐标。我们的目标是找到一个点 ( x ∗ , y ∗ ) \left(x^*, y^*\right) (x,y) ,使得 f ( x ∗ , y ∗ ) f\left(x^*, y^*\right) f(x,y) 达到最小值或最大值。

数学模型可以表示为:
Minimize (或 Maximize)  f ( x , y ) \text { Minimize (或 Maximize) } f(x, y)  Minimize ( Maximize) f(x,y)

其中 f ( x , y ) f(x, y) f(x,y) 是目标函数。此外,通常会有一些约束条件,例如:
g 1 ( x , y ) ≤ 0 g 2 ( x , y ) = 0 h 1 ( x , y ) ≤ 0 \begin{aligned} & g_1(x, y) \leq 0 \\ & g_2(x, y)=0 \\ & h_1(x, y) \leq 0 \end{aligned} g1(x,y)0g2(x,y)=0h1(x,y)0

其中 g 1 ( x , y ) 、 g 2 ( x , y ) g_1(x, y) 、 g_2(x, y) g1(x,y)g2(x,y) h 1 ( x , y ) h_1(x, y) h1(x,y) 是分别表示不等式约束和等式约束的函数。这些约束条件描述了优化问题的可行域,即满足这些条件的点构成了可行解的焦合。

综合起来,二维非线性优化问题可以形式化地表示为:
Minimize (或 Maximize)  f ( x , y ) subject to  g 1 ( x , y ) ≤ 0 g 2 ( x , y ) = 0 h 1 ( x , y ) ≤ 0 \begin{aligned} \text { Minimize (或 Maximize) } & f(x, y) \\ \text { subject to } & g_1(x, y) \leq 0 \\ & g_2(x, y)=0 \\ & h_1(x, y) \leq 0 \end{aligned}  Minimize ( Maximize)  subject to f(x,y)g1(x,y)0g2(x,y)=0h1(x,y)0

求解这类问题的方法通常涉及使用数学优化算法,例如梯度下降法、牛顿法、拟牛顿法等。这些方法通过迭代逐步调整优化变量,使得目标函数逐渐趋于最小值或最大值,并在满足约束条件的情况下找到最优解。

粒子群优化(PSO)算法是一种基于群体智能的优化算法,它可以用于优化二维线性问题。以下是使用PSO算法解决二维线性优化问题的基本步骤:

  1. 定义适应度函数:将目标函数定义为适应度函数,即 f ( x 1 , x 2 ) = c 1 x 1 + c 2 x 2 f(x_1,x_2) = c_1x_1+c_2x_2 f(x1,x2)=c1x1+c2x2
  2. 初始化种群:设置粒子数量、位置范围、速度范围等参数,随机生成粒子的位置和速度。
  3. 计算适应度:根据粒子的位置计算适应度值。
  4. 更新全局最优解和局部最优解:根据适应度值更新全局最优解和局部最优解。
  5. 更新粒子速度和位置:根据当前位置和速度、全局最优解和局部最优解更新粒子的速度和位置。
  6. 检查终止条件:检查粒子的位置是否达到预设的最大迭代次数或适应度值是否达到预设的最小值,若满足则停止迭代,输出最优解。

在优化过程中,我们可以使用Matlab进行可视化操作,将优化过程和最终结果以图形化的方式展示出来,更直观地观察算法的运行情况和优化效果。

正文

下面我们使用粒子群优化算法求解下列二维非线性函数的优化问题:

f ( x , y ) = x 2 + y 2 − 2 x y + sin ⁡ ( x ) + cos ⁡ ( y ) f(x, y) = x^2 + y^2 - 2xy + \sin(x) + \cos(y) f(x,y)=x2+y22xy+sin(x)+cos(y)

步骤分解

  1. 定义目标函数。目标函数是用来评估模型的性能的指标。对于该问题,目标函数是函数 f(x,y) 的最大值。
function y = myTargetFunction(x)y = x(1)^2 + x(2)^2 - 2*x(1)*x(2) + sin(x(1)) + cos(x(2));
end
  1. 定义粒子群的参数。粒子群算法有许多参数,包括粒子数量、惯性权重、学习因子、迭代次数等。
% 主函数
dim = 2; % 粒子维度
swarmSize = 100; % 粒子群大小
maxIterations = 50; % 最大迭代次数
lb = [-5, -5]; % 搜索空间下界
ub = [ 5,  5]; % 搜索空间上界
  1. 初始化粒子。粒子是粒子群算法中的基本单位,它包含位置和速度两个属性。
        r1 = rand(swarmSize, dim);r2 = rand(swarmSize, dim);
  1. 开始迭代。在每个迭代中,我们需要进行以下步骤:
    4.1. 计算每个粒子的适应度值。适应度值是用来衡量每个粒子的好坏的指标。对于该问题,适应度值是函数 f(x,y) 的值。
    4.2 更新每个粒子的速度。速度更新公式如下:
    v n e w = w ∗ v + c 1 ∗ r 1 ∗ ( p b e s t − x ) + c 2 ∗ r 2 ∗ ( g b e s t − x ) v_{new}= w * v + c1 * r1 * (pbest - x) + c2 * r2 * (gbest - x) vnew=wv+c1r1(pbestx)+c2r2(gbestx)
    其中, w w w 是惯性权重, c 1 c1 c1 c 2 c2 c2 是学习因子, r 1 r1 r1 r 2 r2 r2 是随机数。
    更新每个粒子的位置。位置更新公式如下:
    x n e w = x + v n e w x_{new} = x + v_{new} xnew=x+vnew

  2. 迭代直到达到最大迭代次数或找到最优解。

代码可视化

通过以下代码将结果可视化:

% 定义二维函数
[X, Y] = meshgrid(linspace(-5, 5, 100), linspace(-5, 5, 100));
Z = X.^2 + Y.^2 - 2*X.*Y + sin(X) + cos(Y);% 绘制等高线图
contour(X, Y, Z, 50);
hold on;% 标记最优解的位置
plot(bestPosition(1), bestPosition(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');% 添加标签和标题
xlabel('x');
ylabel('y');
title('Objective Function Contour Plot with Optimal Solution');% 显示图例
legend('Objective Function', 'Optimal Solution');% 显示图形
hold off;

完整代码实现

% 主函数
dim = 2; % 粒子维度
swarmSize = 100; % 粒子群大小
maxIterations = 50; % 最大迭代次数
lb = [-5, -5]; % 搜索空间下界
ub = [ 5,  5]; % 搜索空间上界% 调用PSO算法
[bestPosition, bestValue] = myPSO(@myTargetFunction, dim, swarmSize, maxIterations, lb, ub);% 显示结果
disp('最优解:');
disp(bestPosition);
disp('最优值:');
disp(bestValue);% 定义二维函数
[X, Y] = meshgrid(linspace(-5, 5, 100), linspace(-5, 5, 100));
Z = X.^2 + Y.^2 - 2*X.*Y + sin(X) + cos(Y);% 绘制等高线图
contour(X, Y, Z, 50);
hold on;% 标记最优解的位置
plot(bestPosition(1), bestPosition(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');% 添加标签和标题
xlabel('x');
ylabel('y');
title('Objective Function Contour Plot with Optimal Solution');% 显示图例
legend('Objective Function', 'Optimal Solution');% 显示图形
hold off;% 定义目标函数
function y = myTargetFunction(x)y = x(1)^2 + x(2)^2 - 2*x(1)*x(2) + sin(x(1)) + cos(x(2));
endfunction [bestPosition, bestValue] = myPSO(targetFunction, dim, swarmSize, maxIterations, lb, ub)% 初始化粒子群swarm = rand(swarmSize, dim) .* (ub - lb) + lb;velocity = zeros(swarmSize, dim);personalBest = swarm;personalBestValue = zeros(swarmSize, 1);for i = 1:swarmSizepersonalBestValue(i) = feval(targetFunction, swarm(i,:));end% 寻找全局最优[globalBestValue, globalBestIndex] = min(personalBestValue);globalBest = personalBest(globalBestIndex, :);% 迭代更新粒子位置和速度for iter = 1:maxIterations% 更新粒子位置和速度inertiaWeight = 0.5;cognitiveCoefficient = 1.5;socialCoefficient = 2.0;r1 = rand(swarmSize, dim);r2 = rand(swarmSize, dim);velocity = inertiaWeight * velocity + ...cognitiveCoefficient * r1 .* (personalBest - swarm) + ...socialCoefficient * r2 .* (globalBest - swarm);swarm = swarm + velocity;% 边界处理swarm = max(swarm, lb);swarm = min(swarm, ub);% 更新个体最优for i = 1:swarmSizecurrentValue = feval(targetFunction, swarm(i,:));if currentValue < personalBestValue(i)personalBest(i, :) = swarm(i, :);personalBestValue(i) = currentValue;endend% 更新全局最优[minValue, minIndex] = min(personalBestValue);if minValue < globalBestValueglobalBestValue = minValue;globalBest = personalBest(minIndex, :);endend% 返回最优解和最优值bestPosition = globalBest;bestValue = globalBestValue;
end

执行上述代码后,会输出最优解和目标函数值。

最优解:-2.2075   -2.5048最优值:-1.5197

从图中可以看出,函数 f ( x , y ) f(x,y) f(x,y) 具有两个局部极值点,最优解是 (-2.2075, -2.5048),最优值是 -1.5197。
在这里插入图片描述

以下是粒子群算法在迭代过程中包含目标函数等高线图的图形,并且最优解的位置会被标记为红色圆点。这样就可以直观地看到最优解在二维函数图像中的位置了。从图中可以看出,粒子群算法在界限范围内的全局最优解。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Vue.js设计与实现》—Vue3响应系统的原理

一、响应式数据与副作用函数 1. 副作用函数 1-1 指令材料 在JavaScript中&#xff0c;副作用函数是指在执行过程中对外部环境产生可观察的变化或影响的函数。这种函数通常会修改全局变量、修改传入的参数、执行I/O操作&#xff08;如读写文件或发送网络请求&#xff09;、修…

计算目标检测和语义分割的PR

需求描述 实际工作中&#xff0c;相比于mAP项目更加关心的是特定阈值下的precision和recall结果&#xff1b;由于本次的GT中除了目标框之外还存在多边形标注&#xff0c;为此&#xff0c;计算IoU的方式从框与框之间变成了mask之间&#xff1b; 本文的代码适用于MMDetection下的…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

C语言-每日刷题练习

[蓝桥杯 2013 省 B] 翻硬币 题目背景 小明正在玩一个“翻硬币”的游戏。 题目描述 桌上放着排成一排的若干硬币。我们用 * 表示正面&#xff0c;用 o 表示反面&#xff08;是小写字母&#xff0c;不是零&#xff09;&#xff0c;比如可能情形是 **oo***oooo&#xff0c;如果…

【从零开始学习JVM | 第三篇】类的生命周期(高频面试)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。 在本文中&#xff0c;我们将深入探讨类的生命周期&#xff0c;从类加载到…

Docker Container(容器)——6

目录&#xff1a; 什么是容器&#xff1f;容器生活案例&#xff1f;为什么需要容器&#xff1f;容器的生命周期 容器 OOM容器异常退出容器暂停容器命令清单容器命令详解 docker createdocker rundocker psdocker logsdocker attachdocker execdocker startdocker stopdocker r…

用Sketch for Mac轻松创作无限可能的矢量绘图

在如今的数码时代&#xff0c;矢量绘图软件成为了许多设计师和创意爱好者的必备工具。而在众多的矢量绘图软件中&#xff0c;Sketch for Mac无疑是最受欢迎的一款。它以其简洁易用的界面和强大的功能&#xff0c;让用户能够轻松创作出无限可能的矢量图形。 首先&#xff0c;Sk…

Jmeter入门

一、下载jmeter 官网下载 下载之后解压&#xff0c;在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图&#xff0c;选择语言为中文&#xff0c;可以修改测试计划的名称。如下右图&#xff0c;添加线程组 添加线程组 添加http请求 路径传参方式 …

vue3-自定义组件的使用及传值!!!

1.在vue项目中创建一个自定义组件&#xff08;大多数页面中相同的样式&#xff0c;将其封装到组件中&#xff0c;可重复使用&#xff09; 2.将公共组件引入到你想使用的页面中 结果显示如下&#xff1a; 3.为公共组件传值 4.公共组件接收值&#xff0c;显示在组件上 注意事项&a…

wappalyzer基于插件的网站开发技术解析工具

一、wappalyzer 解释&#xff1a;这是一款强大的工具&#xff0c;其主要能提供一种快速、可靠地检测网站所使用技术栈的方法&#xff0c;也就说说&#xff0c;服务器发来的信息都会被它剖析&#xff0c;然后分析出前端的技术栈&#xff0c;有时后端所使用的技术栈如果网页特征…

串口通信(1)-硬件知识

本文讲解串口通信的硬件知识。让读者快速了解硬件知识&#xff0c;为下一步编写代码做基础。 目录 一、概述 二、串口通信分类 2.1信息的传送方向进行分类 2.2同步通信和异步通信 三、串口协议 3.1 RS232 3.1.1 电气特性 3.1.2 连接器的机械特性 3.1.3 连接类型 3.1…

2023全国职业院校技能大赛信息安全管理与评估正式赛(模块三CTF)

全国职业院校技能大赛高等职业教育组信息安全管理与评估 \任务书\ 模块三 网络安全渗透、理论技能与职业素养 极安云科专注技能竞赛&#xff0c;包含网络建设与运维和信息安全管理与评估两大赛项&#xff0c;及各大CTF&#xff0c;基于两大赛项提供全面的系统性培训&#xf…

Pipenv环境配置+Pytest运行

环境配置 使用Pipenv进行虚拟环境管理&#xff0c;Pipfile为依赖模块管理文件。 安装pipenv&#xff1a;brew install pipenv根项目根目录下执行命令创建虚拟环境&#xff1a; pipenv install在Pycharm中指定项目运行的虚拟环境 &#xff1a;File->Settings->Project:-…

有趣的数学 数学建模入门三 数学建模入门示例两例 利用微积分求解

一、入门示例1 1、问题描述 某宾馆有150间客房&#xff0c;经过一段时间的经营&#xff0c;该宾馆经理得到一些数据&#xff1a;如果每间客房定价为200元&#xff0c;入住率为55&#xff05;&#xff1b;定价为180元&#xff0c;入住率为65&#xff05;&#xff1b;定价为160元…

第 5 部分 — LLM中红队的深入分析:数学和实证方法

一、说明 大型语言模型 (LLM) 领域正在迅速发展&#xff0c;需要强大的红队策略来确保其安全性和可靠性。 红队是一种模拟对抗性攻击来识别漏洞的方法&#xff0c;需要对理论基础和实际应用有深入的了解。在这个分析中&#xff0c;我深入研究了复杂的数学模型&#xff0c;并提供…

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么&#xff1f;Owner References又是什么&#xff1f;强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时&#xff0c;一直处于Terminating状态。 这是为什么呢&#xff1f; 本文将…

自下而上-存储全栈(TiDB/RockDB/SPDK/fuse/ceph/NVMe/ext4)存储技术专家成长路线

数字化时代的到来带来了大规模数据的产生&#xff0c;各行各业都面临着数据爆炸的挑战。 随着云计算、物联网、人工智能等新兴技术的发展&#xff0c;对存储技术的需求也越来越多样化。不同应用场景对存储的容量、性能、可靠性和成本等方面都有不同的要求。具备存储技术知识和技…

关系型数据库-SQLite介绍

优点&#xff1a; 1>sqlite占用的内存和cpu资源较少 2>源代码开源&#xff0c;完全免费 3>检索速度上十几兆、几十兆的数据库sqlite很快&#xff0c;但是上G的时候最慢 4>管理简单&#xff0c;几乎无需管理。灵巧、快速和可靠性高 5>功能简…

JVM 性能调优

概述篇 面试题 讲讲你理解的性能评价及测试指标&#xff1f;&#xff08;瓜子&#xff09; 生产环境中的问题 生产环境发生了内存溢出该如何处理&#xff1f;生产环境应该给服务器分配多少内存合适&#xff1f;如何对垃圾回收器的性能进行调优&#xff1f;生产环境CPU负载飙高…

为什么近期白酒市场股票暴跌?2024年中高端酒企发展如何撬动市场?

为什么近期白酒市场股票暴跌&#xff1f;2024年中高端酒企发展如何撬动市场&#xff1f; 近期白酒市场股票暴跌的原因主要有两个方面&#xff1a;一是宏观经济环境的不景气&#xff0c;导致投资者对白酒行业的未来发展持谨慎态度&#xff1b;二是白酒市场竞争激烈&#xff0c;龙…