通信系统仿真

崔春雷

目录

  • 1 第一单元: MATLAB基础
    • 1.1 课程说明与资料
      • 1.1.1 作业参考答案
      • 1.1.2 移动22级作业答案
    • 1.2 MATLAB安装与运行环境
      • 1.2.1 MATLAB介绍
    • 1.3 基本数据类型:数值类型
    • 1.4 基本数据类型:字符类型
    • 1.5 数据类型转换与输出
    • 1.6 数组与矩阵基础
      • 1.6.1 矩阵运算进阶
    • 1.7 数组与矩阵常用函数
    • 1.8 matlab中的逻辑运算
    • 1.9 实验: MATLAB常用数学函数
      • 1.9.1 实验 作业答案
    • 1.10 元胞数组
    • 1.11 结构体数组
      • 1.11.1 结构体进阶
      • 1.11.2 元胞数组与结构体数组对比
      • 1.11.3 map 容器
    • 1.12 附录:MATLAB常用基础命令
    • 1.13 拓展内容:实时脚本
      • 1.13.1 实时脚本示例
    • 1.14 课程作业与答案
      • 1.14.1 《通信系统仿真》期末考试
  • 2 第二单元:Matlab 程序设计
    • 2.1 顺序结构程序
    • 2.2 分支结构—— if语句
    • 2.3 分支结构—— switch语句
    • 2.4 循环结构—— while语句
    • 2.5 循环结构—— for语句
    • 2.6 图像处理基础
    • 2.7 Matlab的函数
      • 2.7.1 函数内容的课外扩展
    • 2.8 本章实验:for循环的应用
      • 2.8.1 素数问题
        • 2.8.1.1 素数的螺旋线排列
      • 2.8.2 3X+1猜想
      • 2.8.3 7 行代码计算 π
    • 2.9 排序算法
      • 2.9.1 冒泡排序
      • 2.9.2 选择排序
      • 2.9.3 插入排序
      • 2.9.4 快速排序
      • 2.9.5 基数排序
      • 2.9.6 计数排序
      • 2.9.7 堆排序
    • 2.10 动态规划算法
      • 2.10.1 动态规划编程实例
      • 2.10.2 动态规划:01背包问题
      • 2.10.3 动态规划常见题目分析
      • 2.10.4 动态规划题目分析2
    • 2.11 常用算法简介
      • 2.11.1 剪枝算法
      • 2.11.2 二分查找
      • 2.11.3 递归算法
      • 2.11.4 回溯算法
        • 2.11.4.1 Leetcode回溯题目合集
        • 2.11.4.2 回溯算法总结
        • 2.11.4.3 回溯法解数独问题
        • 2.11.4.4 DFS与BFS
          • 2.11.4.4.1 DFS/BFS原理
          • 2.11.4.4.2 BFS的应用:Dijkstra算法
      • 2.11.5 n 皇后问题专题
      • 2.11.6 双指针算法
      • 2.11.7 数组模拟链表(约瑟夫环)
      • 2.11.8 Hash(哈希表)
      • 2.11.9 图论与路径规划
        • 2.11.9.1 迪杰斯特拉算法
        • 2.11.9.2 A*算法
          • 2.11.9.2.1 A*算法的MATLAB实现
        • 2.11.9.3 RRT路径规划算法
          • 2.11.9.3.1 RRT算法 MATLAB代码
          • 2.11.9.3.2 参考资料
      • 2.11.10 数据结构
        • 2.11.10.1 数据结构例题
      • 2.11.11 前缀和 差分 双指针
      • 2.11.12 位运算
      • 2.11.13 常用算法代码模板
    • 2.12 练习题库
    • 2.13 code
      • 2.13.1 简易计算器gui代码
      • 2.13.2 五子棋
      • 2.13.3 连连看小游戏
      • 2.13.4 递归算法与汉诺塔
      • 2.13.5 有理数的小数循环节
    • 2.14 MATLAB编程风格
      • 2.14.1 向量化编程专题
  • 3 第三单元:Matlab 图形图像处理
    • 3.1 二维图形绘图基础
    • 3.2 二维图形绘图进阶
    • 3.3 三维图形绘图
      • 3.3.1 MATLAB绘图小结
        • 3.3.1.1 用matlab绘制好看图像
    • 3.4 MATLAB高级绘图
    • 3.5 文件操作
    • 3.6 Matlab图像处理进阶
      • 3.6.1 补充:Matlab图像处理常用函数
      • 3.6.2 RGB/HSV/HSI颜色模型
      • 3.6.3 图片切换动画效果
      • 3.6.4 图像连通域标记
      • 3.6.5 图像旋转与插值
      • 3.6.6 图像的形态学
      • 3.6.7 空间滤波
        • 3.6.7.1 图像中常见的噪声类型与滤波方法
        • 3.6.7.2 matlab中的滤波函数
        • 3.6.7.3 BM3D 去噪算法
        • 3.6.7.4 双边滤波
      • 3.6.8 图像的频域处理
    • 3.7 本章总结
    • 3.8 实验 : matlab 绘图练习1
    • 3.9 实验: matlab 绘图练习2
    • 3.10 实验 :数学函数图像绘制
    • 3.11 实验:绘图综合练习
    • 3.12 实验:曲线拟合
    • 3.13 实验:牛顿法求解方程的根
    • 3.14 实验:信号的傅里叶变换
      • 3.14.1 傅里叶变换、小波变换、希尔伯特变换
      • 3.14.2 新建目录
    • 3.15 课外补充:图像处理基础1
    • 3.16 课外补充:图像处理基础2
    • 3.17 课外补充:图像处理基础3
    • 3.18 课外补充:PYTHON基础
  • 4 第五单元:MATLAB通信仿真
    • 4.1 现代通信系统的介绍
    • 4.2 模拟通信系统的仿真原理
    • 4.3 HDB3编解码的仿真实现
    • 4.4 SIMULINK和其模块简介
    • 4.5 数字通信系统的仿真原理
    • 4.6 模拟通信系统Simulink仿真
    • 4.7 数字通信系统Simulink仿真
    • 4.8 音频信号测处理与仿真
    • 4.9 图像数字水印技术
      • 4.9.1 三角函数到傅里叶变换再到语音识别与数字水印
    • 4.10 信息系统与算法
      • 4.10.1 递归算法
        • 4.10.1.1 递归与堆栈的关系
      • 4.10.2 哈希表
      • 4.10.3 双指针算法
        • 4.10.3.1 双指针算法实战
        • 4.10.3.2 双指针进阶:滑动窗口算法
      • 4.10.4 字符串匹配 KMP算法
        • 4.10.4.1 字符串匹配B-M算法
      • 4.10.5 快速傅里叶变换
      • 4.10.6 回溯算法
      • 4.10.7 动态规划
      • 4.10.8 分治算法
      • 4.10.9 Dijkstra算法
  • 5 第六单元: systemview通信仿真
    • 5.1 SystemView概述
    • 5.2 模拟通信系统 数字系统的仿真分析
    • 5.3 SystemView通信系统仿真进阶
    • 5.4 新建课程目录
  • 6 第四单元:MATLAB高级应用
    • 6.1 符号运算基础
      • 6.1.1 利用Matlab自动推导公式
    • 6.2 Matlab中的数值计算
      • 6.2.1 积分的计算
      • 6.2.2 龙格库塔:常微分方程的数值解法
      • 6.2.3 fmincon函数与非线性方程最小值
    • 6.3 统计、拟合、插值
      • 6.3.1 协方差与相关系数
    • 6.4 GUI设计初步
    • 6.5 matlab GUI界面编程
      • 6.5.1 gui实例
      • 6.5.2 gui编程中常用函数
      • 6.5.3 App Designer入门
    • 6.6 实验:GUI设计图像空间变换系统
    • 6.7 作业:利用GUI设计 计算器、信号发生器等
    • 6.8 MTALB数据导入方法
    • 6.9 课外补充:MATLAB的App会取代GUI吗?
    • 6.10 模拟退火算法matlab实现
    • 6.11 遗传算法的Matlab实现
      • 6.11.1 进化算法(Evolutionary Algorithm)及相关函数介绍
    • 6.12 粒子群算法 matlab实现
      • 6.12.1 粒子群算法及MATLAB实例仿真
    • 6.13 BP网络的应用
    • 6.14 matlab 结构体
    • 6.15 群智能算法合集
  • 7 拓展知识
    • 7.1 什么是算法的时间复杂度?
    • 7.2 Notepad++使用教程
    • 7.3 MATLAB常用函数总结
    • 7.4 MATLAB常用知识点总结
    • 7.5 MATLAB命令大全
    • 7.6 视频:MATLAB官方基础教程
    • 7.7 经典书籍:Matlab2012经典超强教程
    • 7.8 经典书籍:MATLAB揭秘(自学宝典)
    • 7.9 经典资料:MATLAB N个实用技巧
    • 7.10 Matlab编程小技巧
    • 7.11 寻优算法
      • 7.11.1 Dijkstra算法python实现
    • 7.12 PYTHON基础教程
      • 7.12.1 Python进阶
      • 7.12.2 Python小技巧
      • 7.12.3 Python总结
        • 7.12.3.1 Python循环语句总结
        • 7.12.3.2 24个顶级Python库
        • 7.12.3.3 魔法函数
      • 7.12.4 廖雪峰python
      • 7.12.5 正则表达式基础
      • 7.12.6 numpy
        • 7.12.6.1 101道Numpy习题
        • 7.12.6.2 Numpy简要语法教程
        • 7.12.6.3 Numpy实现全连接神经网络 (手写数字识别)
        • 7.12.6.4 图解NumPy
      • 7.12.7 matplotlib
        • 7.12.7.1 matplotlib练习50题
        • 7.12.7.2 Matplotlib速查表
        • 7.12.7.3 Matplotlib 实操指南
      • 7.12.8 Python3 模块 import
      • 7.12.9 Python 小项目
    • 7.13 参考资源:数据结构与算法
      • 7.13.1 十大经典排序算法总结
    • 7.14 机器学习概述
      • 7.14.1 反向传播算法
        • 7.14.1.1 反向传播的数学原理
      • 7.14.2 极大似然估计
        • 7.14.2.1 极大似然估计与最小二乘法
      • 7.14.3 Batch Normalization
        • 7.14.3.1 Batch Normalization&Dropout浅析
        • 7.14.3.2 ​BN层的梯度反向传播计算
        • 7.14.3.3 Batch Size的大小与神经网络的性能
        • 7.14.3.4 标准化和归一化
      • 7.14.4 主成分分析PCA与SVD奇异值分解
        • 7.14.4.1 岭回归 与 PCA
        • 7.14.4.2 PCA原理推导
        • 7.14.4.3 PCA原理新解
        • 7.14.4.4 svd
        • 7.14.4.5 PCA数学原理
      • 7.14.5 正则化
        • 7.14.5.1 L1、L2正则化和过拟合 总结
        • 7.14.5.2 L1 和 L2 正则化的直观解释
      • 7.14.6 SVM
        • 7.14.6.1 从零推导支持向量机(SVM)
        • 7.14.6.2 支持向量机(SVM)介绍
        • 7.14.6.3 SVM推导与实战
        • 7.14.6.4 支持向量机的直观理解
        • 7.14.6.5 浅显易懂的支持向量机SVM
      • 7.14.7 线性回归
      • 7.14.8 逻辑回归
      • 7.14.9 BP算法
        • 7.14.9.1 万能逼近——神经网络拟合任意函数原理
      • 7.14.10 激活与池化
        • 7.14.10.1 激活函数与损失函数 小结
      • 7.14.11 深度学习简述
        • 7.14.11.1 MATLAB2020深度学习实例
      • 7.14.12 损失函数与误差反向传播
        • 7.14.12.1 梯度下降与损失函数
      • 7.14.13 深度学习优化问题
      • 7.14.14 梯度下降法
        • 7.14.14.1 各类梯度下降算法的Python实现
        • 7.14.14.2 梯度下降的直观理解
        • 7.14.14.3 动量、RMSProp、Adam
      • 7.14.15 卷积的概念
        • 7.14.15.1 卷积的矩阵化算法
      • 7.14.16 局部连接
      • 7.14.17 RNN
      • 7.14.18 LSTM
      • 7.14.19 CNN-四大经典CNN技术浅析
      • 7.14.20 熵(Entropy)与交叉熵
      • 7.14.21 softmax函数详解
      • 7.14.22 自编码算法详细理解与代码实现
      • 7.14.23 pytorch
        • 7.14.23.1 ​PyTorch简介
          • 7.14.23.1.1 Pytorch快速入门资料
        • 7.14.23.2 CNN的PyTorch实现
        • 7.14.23.3 pytorch总结
        • 7.14.23.4 PyTorch trick 集锦
        • 7.14.23.5 在PyTorch上加载自定义数据集
        • 7.14.23.6 实战:Pytorch识别验证码
        • 7.14.23.7 实战:Transformer的最简洁pytorch实现
        • 7.14.23.8 使用PyTorch实现神经网络分类
      • 7.14.24 卷积神经网络CNN概述
        • 7.14.24.1 CNN 简易原理
        • 7.14.24.2 卷积神经网络CNN原理详解
        • 7.14.24.3 自己手写一个卷积神经网络
        • 7.14.24.4 CNN反向传播算法
        • 7.14.24.5 卷积计算、作用与思想
        • 7.14.24.6 用卷积神经网络CNN识别手写数字集
        • 7.14.24.7 卷积 池化 参数的计算
        • 7.14.24.8 im2col方法实现卷积算法
        • 7.14.24.9 卷积核的梯度计算
        • 7.14.24.10 卷积层反向传播推导及实现
        • 7.14.24.11 反向传输算法
          • 7.14.24.11.1 resnet残差网络
        • 7.14.24.12 CNN反向传播的MATLAB实现
      • 7.14.25 神经网络的调参技巧
      • 7.14.26 BP神经网络
        • 7.14.26.1 零开始搭建bp神经网络
        • 7.14.26.2 MATLAB自带的bp工具箱
        • 7.14.26.3 神经网络中偏置(bias)的作用
      • 7.14.27 聚类分析 k-means
        • 7.14.27.1 matlab做聚类分析(k-means)
        • 7.14.27.2 聚类模型探讨综述
        • 7.14.27.3 5种经典聚类算法
      • 7.14.28 深度学习的一些概念
      • 7.14.29 人工智能简述:AI的过去和现在
      • 7.14.30 k-NN(k近邻算法)
      • 7.14.31 神经网络中的优化器:BGD、SGD、MBGD、Momentum
      • 7.14.32 卷积神经网络的经典网络总结
        • 7.14.32.1 卷积神经网络中十大拍案叫绝的操作
      • 7.14.33 GAN 对抗样本攻击
      • 7.14.34 蒙特卡洛模拟
      • 7.14.35 dropout与随机部分连接
      • 7.14.36 Jupyter 等 IDE概览
      • 7.14.37 分类算法常用评价指标
      • 7.14.38 Inception 网络与不变性
      • 7.14.39 卷积神经网络的可视化
      • 7.14.40 隐马尔可夫模型HMM
        • 7.14.40.1 马尔科夫链
    • 7.15 MATLAB音频处理
      • 7.15.1 python处理音频信号
    • 7.16 图像处理
      • 7.16.1 图像处理中的指标
    • 7.17 代码集
    • 7.18 论文写作与阅读方法
      • 7.18.1 期刊投稿攻略
      • 7.18.2 论文排版教程
      • 7.18.3 SCI-HUB论文下载技巧
      • 7.18.4 几种论文写作神器,提高写作效率
      • 7.18.5 latex入门
      • 7.18.6 LaTeX教程
    • 7.19 机器学习常用的网站以及资源
      • 7.19.1 很详细的ML&DL学习博客
    • 7.20 SymPy 符号计算基本教程
  • 8 程序设计数学基础
    • 8.1 编程数学基础
      • 8.1.1 概率的历史
      • 8.1.2 概率
        • 8.1.2.1 常见概率分布
          • 8.1.2.1.1 二维正态分布
        • 8.1.2.2 蒙特卡罗方法
        • 8.1.2.3 置信区间
        • 8.1.2.4 协方差与相关系数
      • 8.1.3 矩阵 向量求导法则
      • 8.1.4 雅可比矩阵 海森矩阵
      • 8.1.5 矩阵的几种分解方式
      • 8.1.6 行列式和代数余子式
      • 8.1.7 向量
      • 8.1.8 矩阵的基本运算
      • 8.1.9 矩阵分析
      • 8.1.10 矩阵的LU分解
      • 8.1.11 矩阵奇异值分解(SVD)
        • 8.1.11.1 SVD分解2
        • 8.1.11.2 SVD分解逐步推导
        • 8.1.11.3 奇异值与特征值的意义
      • 8.1.12 随机向量
        • 8.1.12.1 随机过程简述
      • 8.1.13 投影矩阵和最小二乘
      • 8.1.14 知乎数学精选集
        • 8.1.14.1 高数问题集
      • 8.1.15 小波变换
      • 8.1.16 程序设计数学基础1:高等数学
      • 8.1.17 程序设计数学基础2:线性代数
      • 8.1.18 程序设计数学基础3:概率论和数理统计
      • 8.1.19 向量的距离与相似度计算
      • 8.1.20 复数
      • 8.1.21 高等数学——幂级数
      • 8.1.22 无穷小的本质
      • 8.1.23 数列极限和收敛性
      • 8.1.24 不定积分技巧总结
    • 8.2 有趣的数学题目
    • 8.3 高等数学
      • 8.3.1 泰勒级数
  • 9 路径规划与智能算法
    • 9.1 常见路径规划算法简介
    • 9.2 Dijkstra算法详细
  • 10 教学文档
    • 10.1 授课计划
    • 10.2 课程标准
粒子群算法 matlab实现


粒子群优化算法——基本粒子群算法


粒子群优化算法(PSO)

粒子群优化算法是一种进化计算技术,由Eberhart博士和Kennedy博士发明,源于对鸟群捕食的行为研究。PSO算法同遗传算法类似,是一种基于迭代的优化工具。系统初始化为一组随机解,通过迭代搜寻最优值。但是并没有遗传算法用的交叉以及变异,而是粒子在解空间追随最优的粒子进行搜索。

在PSO算法中,每个优化问题的解都是搜索空间中的一只鸟,被抽象为没有质量和体积的微粒,并将其延伸到N维空间。粒子 [公式] 在 [公式] 维空间里的位置表示为一个矢量,每个粒子的飞行速度也表示为一个矢量。

所有的粒子都有一个由被优化的函数决定的【适应值】(fittness),每个粒子还有一个速度,决定它们飞翔的力向和距离。粒子们知道【自己到目前为止发现的最好位置】(pbest)和现在的位置,这个可以看做是粒子自己的飞行经验。除此之外,每个粒子还知道【到目前为止整个群体中所有粒子发现的最好位置】(gbest,是pbest中的最好值),这个可以看做是粒子同伴的经验。粒子就是通过自己的经验和同伴中最好的经验来决定下一步的行动。

PSO算法首先初始化一群随机粒子(随机解),然后粒子们就追随当前的最优粒子在解空间中搜索,即通过迭代找到最优解。假设 [公式] 维搜索空间中的第 [公式] 个粒子的位置和速度分别为 [公式] 和 [公式] ,在每一次迭代中,粒子通过跟踪两个最优解来更新自己,第一个就是粒子本身所找到的最优解,即个体极值pbest, [公式] ;另一个是整个种群目前找到的最优解,即全局最优解gbest, [公式] 。在找到这两个最优值时,粒子根据如下公式来更新自己的速度和新的位置。

[公式]

其中, [公式] 为惯性权重, [公式] 和 [公式] 为正的学习因子, [公式] 和 [公式] 为0到1之间均匀分布的随机数。

粒子群算法的性能很大程度上取决于算法的控制参数,例如粒子数、最大速度、学习因子、惯性权重等,各个参数的选取规则如下:

  1. 粒子数:粒子数的多少根据问题的复杂程度自行决定。对于一般的优化问题,取20-40个粒子就完全可以得到很好的结果;对于比较简单的问题,10个粒子已经足够可以取得好的结果;对于比较复杂的问题或者特定类别的问题,粒子数可以取到100以上。

  2. 粒子的维度:这是由优化问题决定,就是问题解的维度。

  3. 粒子的范围:由优化问题决定,每一维可设定不同的范围。

  4. 最大速度Vmax:决定粒子在一个循环中最大的移动距离,通常设定为粒子的范围宽度。

  5. 学习因子:学习因子使粒子具有自我总结和向群体中优秀个体学习的能力,从而向群体内或邻域内最优点靠近,通常取 [公式] 和 [公式] 为2,但也有其他的取值,一般 [公式] 等于 [公式] ,且范围在0到4之间。

  6. 惯性权重:决定了对粒子当前速度继承的多少,合适的选择可以使粒子具有均衡的探索能力和开发能力,惯性权重的取法一般有常数法、线性递减法、自适应法等。


基本粒子群算法

  • 原理

基本粒子群算法采用常数学习因子 [公式][公式] 及常惯性权重 [公式] ,粒子根据如下的公式来更新自己的速度和新的位置。

[公式]


  • 算法步骤

基本粒子群算法的基本步骤如下:

【1】随机初始化种群中各微粒的位置和速度;

【2】评价每个微粒的适应度,将当前各微粒的位置和适应值存储在各微粒的pbest中,将所有pbest中适应值最优个体的位置和适应值存储于gbest中;

【3】用下式更新粒子的速度和位移:

[公式]

【4】对每个微粒,将其适应值与其经历过的最好位置作比较,如果较好,则将其作为当前的最好位置;

【5】比较当前所有pbest和gbest的值,更新gbest;

【6】若满足停止条件(通常为预设的运算精度或迭代次数),搜索停止,输出结果,否则返回【3】继续搜索。


  • Matlab代码与试算

采用基本粒子群算法求取Sphere Model函数 [公式] 的最小值。

Particle_Swarm_Optimization_Method.m

function [x_optimization,f_optimization]=Particle_Swarm_Optimization_Method(fitness,N,c1,c2,w,M,D)
format long;
%   f:待优化的目标函数
%   N:粒子数目
%   c1:学习因子1
%   c2:学习因子2
%   w:惯性权重
%   M:最大迭代次数
%   D:自变量的个数
%   x_optimization:目标函数取最小值时的自变量值
%   f_optimization:目标函数的最小值
%------初始化种群的个体------------
for i = 1:N
   for j = 1:D         %   D维搜索空间
       x(i,j) = randn;  %随机初始化位置   randn:正态分布的随机数
       v(i,j) = randn;  %随机初始化速度
   end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i = 1:N
   p(i) = fitness(x(i,:));       %   个体极值
   pi(i,:) = x(i,:);
end
Pg = x(N,:);             %Pg为全局最优
for i = 1:(N-1)
   if fitness(x(i,:)) < fitness(Pg)     %  将适应值最优的个体存储
       Pg = x(i,:);
   end
end
%------进入主要循环,按照公式依次迭代------------
for t = 1:M
   for i = 1:N
       v(i,:) = w*v(i,:) + c1*rand*(pi(i,:) - x(i,:)) + c2*rand*(Pg - x(i,:));
       x(i,:) = x(i,:) + v(i,:);
       if fitness(x(i,:)) < p(i)     %   更新个体极值
           p(i) = fitness(x(i,:));
           pi(i,:) = x(i,:);
       end
       if p(i) < fitness(Pg)         %   更新全局极值
           Pg = pi(i,:);
       end
   end
   Pbest(t)=fitness(Pg);
end
x_optimization = Pg';
f_optimization = fitness(Pg);


解:本例中函数最小点为 [公式] ,最小值为0,现在用PSO算法求最小值,首先看看不同迭代步数对结果的影响,粒子群规模为40,学习因子都为2,惯性权重取0.5,迭代步数分别取1000,5000,10000。

首先建立目标函数文件fitness.m。

fitness.m

function F = fitness(x)
F = 0;
for i = 1:30
   F = F + x(i)^2;
end

test.m

[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,40,2,2,0.5,1000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization
[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,40,2,2,0.5,5000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization
[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,40,2,2,0.5,10000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization

命令行窗口

x_optimization =

  -0.203643806779367
   0.004002658504391
  -0.074941760623031
   0.202828222081087
  -0.000524266138323
  -0.103282496122516
   0.069940940915824
   0.224712848311454
   0.009116556529499
   0.041747672665697
  -0.115744530014599
   0.008324066893113
  -0.022343703252904
   0.006402636234152
  -0.231688976225837
   0.105157069032689
   0.019036253581153
  -0.003145132913665
  -0.035976401745438
  -0.045138518377071
  -0.077820436024370
  -0.025756407633560
  -0.159193629330254
   0.278237342057476
  -0.054883001208617
  -0.231413816601646
   0.166511326667179
  -0.066557614071586
  -0.030319312815608
  -0.046405622613089


f_optimization =

   0.439842896379014


x_optimization =

   0.033911123724507
  -0.008147918069209
   0.017400189665077
  -0.061229253488577
  -0.123615521693440
  -0.000936577773137
  -0.096360645602730
  -0.026363975956553
  -0.106348809431333
   0.006567647391543
  -0.072915168393561
   0.070642516969111
  -0.031982133303148
   0.052805456865892
  -0.018763102557558
  -0.049897180300623
   0.051058695822665
   0.099637809979345
   0.038350127166670
  -0.014412752178912
  -0.084432915352984
  -0.088508395148359
   0.032420678214677
   0.060300023200814
  -0.003245103240019
   0.051213192850383
  -0.151210567142661
   0.003972696340481
  -0.046250488846935
   0.159703206183376


f_optimization =

   0.145864445774178


x_optimization =

   0.004240164300054
  -0.023527149367452
   0.008715853267022
   0.010757849454739
  -0.129276052404614
   0.024563617151546
   0.012667589873705
  -0.002475120619650
   0.031828379323105
  -0.019966653146839
  -0.048641610586738
   0.020712666845974
   0.018611086412345
   0.030191385786884
  -0.004277974342346
   0.012197935289109
  -0.046489632116562
  -0.018770500813800
  -0.011646839137421
   0.020356913351388
   0.059918199922185
  -0.080422636675985
  -0.005354456376674
   0.005028386980940
  -0.040197783963151
  -0.072035425652768
  -0.010230701402834
   0.017110069408012
   0.012346401009822
  -0.006123407845671


f_optimization =

   0.044445115342608

在其他参数不变的情况下,一般迭代步数越大,求得的解的精度越高,但这并不是绝对的,因为PSO算法本质上也是一种随机算法,即使用同样的参数,每一次求解也可能得出不同的结果,同时如果对于多峰函数,PSO算法还有可能陷入局部最优点。

下面看粒子群规模对结果的影响,学习因子都为2,惯性权重为0.5,迭代步数都为10000,粒子群规模分别取50,60和80。

test.m

[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,50,2,2,0.5,10000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization
[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,60,2,2,0.5,10000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization
[x_optimization,f_optimization] = Particle_Swarm_Optimization_Method(@fitness,80,2,2,0.5,10000,30);
x_optimization = double(x_optimization);
f_optimization = double(f_optimization);
x_optimization
f_optimization

命令行窗口

x_optimization =

  -0.073611380522001
  -0.021908541053983
  -0.010810473749682
  -0.042714310599363
  -0.070682636079655
  -0.017109091404758
   0.049270845876185
   0.031245077524827
   0.083780249899494
  -0.026065691289565
  -0.023970672784154
  -0.021291206278738
  -0.091336531009053
   0.000349365739912
   0.016359094667683
  -0.044224071171242
  -0.070403279713934
  -0.032001755957378
  -0.024121811241049
  -0.075618445900566
  -0.061313274310489
  -0.075184985641426
   0.001548313670636
  -0.010444997045968
   0.012462497120872
   0.002872591839675
   0.082681063240601
  -0.009230455495692
   0.070214795579745
  -0.070799535364695


f_optimization =

   0.074656914017208


x_optimization =

  -0.094410028494356
  -0.004589819770237
  -0.007366364476676
   0.076992652418444
  -0.101145516026344
   0.036864206183417
   0.012220405060786
  -0.039118880084193
  -0.114145667260480
  -0.124536379419096
   0.026158906710145
   0.078751071623844
  -0.015334122007902
   0.086005738304570
  -0.017118781458174
   0.019194143770836
   0.017973083667948
   0.042497351297172
  -0.009329139701721
   0.091028771109835
   0.021201738445990
  -0.061943723354998
  -0.070485354240977
   0.114457580587634
  -0.052689011966822
   0.083869616525665
  -0.054902075056660
  -0.138650587818845
  -0.097705454809928
  -0.251093283455119


f_optimization =

   0.209403863870569


x_optimization =

  -0.003220432246500
  -0.000076816207993
  -0.005314899939919
   0.014522092407788
  -0.014696692331831
  -0.007989286300044
   0.001861681233914
  -0.001638663900564
  -0.005774603946167
  -0.000464771967507
  -0.006137818370138
  -0.001398927980209
  -0.004465238679096
   0.005913867711140
  -0.006720148483339
  -0.000172177952597
  -0.013951478158435
  -0.003534508147095
  -0.014222172034220
  -0.004949109936742
  -0.002065563091123
  -0.005694020228356
   0.016250856162974
  -0.000572994144839
  -0.004261331573720
  -0.002280055059197
  -0.015097904173360
   0.001463793107481
   0.002448043817841
  -0.000206975356649


f_optimization =

   0.001703273236163

粒子群规模不是越大越好,关键是各个参数之间的搭配,才能求得比较好的结果。


2.权重改进的粒子群算法

在微粒群算法的可调整参数中,惯性权重 [公式] 是最重要的参数,较大的 [公式] 有利于提高算法的全局搜索能力,而较小的 [公式] 会增强算法的局部搜索能力,根据不同的权重变化公式,可得到不同的PSO算法,常见的有线性递减权重法、自适应权重法、随机权重法。


线性递减权重法

  • 原理

由于较大的惯性因子有利于跳出局部极小点,便于全局搜索,而较小的惯性因子则有利于对当前的搜索区域进行精确局部搜索,以利于算法收敛,因此针对PSO算法容易早熟以及算法后期易在全局最优解附近产生振荡现象,可以采用线性变化的权重,让惯性权重从最大值 [公式] 线性减小到最小值 [公式] , [公式] 随算法迭代次数的变化公式为:

[公式]

其中, [公式] 、 [公式] 分别表示 [公式] 的最大值和最小值, [公式] 表示当前迭代步数, [公式] 表示最大迭代步数,通常取 [公式] 。

  • 算法步骤

线性递减粒子群算法的基本步骤如下:

【1】随机初始化种群中各微粒的位置和速度;

【2】评价每个微粒的适应度,将当前各微粒的位置和适应值存储在各微粒的pbest中,将所有pbest中适应值最优个体的位置和适应值存储于gbest中;

【3】用下式更新粒子的速度和位移:

[公式]

【4】更新权重 [公式] ;

【5】对每个微粒,将其适应值与其经历过的最好位置作比较,如果较好,则将其作为当前的最好位置;比较当前所有pbest和gbest的值,更新gbest;

【6】若满足停止条件(通常为预设的运算精度或迭代次数),搜索停止,输出结果,否则返回【3】继续搜索。

  • Matlab代码与试算

用线性递减权重的粒子群算法求函数 [公式] 的最小值。其中粒子数取40,学习因子都取2,最大权重取0.9,最小权重取0.4,迭代步数取10000。

解:此函数的最小点为 [公式] ,最小值为 [公式] 。

建立目标函数文件fitness.m

fitness.m

function F = fitness(x)
F = 100*(x(1)^2 - x(2))^2 + (1 - x(1))^2;

test.m

[x_optimization,f_optimization] = LDW_PSO(@fitness,40,2,2,0.9,0.4,10000,2);
x_optimization
f_optimization

LDW_PSO.m

function [x_optimization,f_optimization] = LDW_PSO(fitness,N,c1,c2,wmax,wmin,M,D)
%   f:待优化的目标函数
%   N:粒子数目
%   c1:学习因子1
%   c2:学习因子2
%   wmax:最大惯性权重
%   wmin:最小惯性权重
%   M:最大迭代次数
%   D:自变量的个数
%   x_optimization:目标函数取最小值时的自变量值
%   f_optimization:目标函数的最小值
format long;
%------初始化种群的个体------------
for i = 1:N
    for j = 1:D         %   D维搜索空间
        x(i,j) = randn;  %随机初始化位置   randn:正态分布的随机数
        v(i,j) = randn;  %随机初始化速度
    end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i = 1:N
    p(i) = fitness(x(i,:));       %   个体极值
    pi(i,:) = x(i,:);
end
Pg = x(N,:);             %Pg为全局最优
for i = 1:(N-1)
    if fitness(x(i,:)) < fitness(Pg)     %  将适应值最优的个体存储
        Pg = x(i,:);
    end
end
%------进入主要循环,按照公式依次迭代------------
for t = 1:M
    for i = 1:N
        w = wmax - (t-1)*(wmax-wmin)/(M-1);     %   权重线性递减
        v(i,:) = w*(v(i,:) + c1*rand*(pi(i,:) - x(i,:)) + c2*rand*(Pg - x(i,:)));
        x(i,:) = x(i,:) + v(i,:);
        if fitness(x(i,:)) < p(i)     %   更新个体极值
            p(i) = fitness(x(i,:));
            pi(i,:) = x(i,:);
        end
        if p(i) < fitness(Pg)         %   更新全局极值
            Pg = pi(i,:);
        end
    end
end
x_optimization = Pg';
f_optimization = fitness(Pg);

命令行窗口

x_optimization =

     1
     1


f_optimization =

     0

对于本例题中的函数而言,用线性递减权重的粒子群算法求得了非常精确的最优点。但是在实际问题中,对于不同问题,其每次迭代所需的比例关系并不相同,所以 [公式] 的线性递减只对某些问题很有效。

此外,如果在进化初期搜索不到最优点,随着 [公式] 的逐渐减小,算法局部收敛能力加强,容易陷入局部最优;如果在进化初期探测到次好点,这时 [公式] 的相对取小就可使算法很快搜索到最优点,而 [公式] 的线性递减降低了算法的收敛速度。


自适应权重法

  • 原理

为了平衡PSO算法的全局搜索能力和局部改良能力,还可采用非线性的动态惯性权重系数公式,其表达式如下:

[公式]

其中 [公式] 分别表示 [公式] 的最大值和最小值, [公式] 表示粒子当前的目标函数值, [公式] 和 [公式] 分别表示当前所有微粒的平均目标值和最小目标值。在上式中,惯性权重随着微粒的目标函数值而自动改变,因此称为自适应权重

当各微粒的目标值趋于一致或者趋于局部最优时,将使惯性权重增加,而各微粒的目标值比较分散时,将使惯性权重减小,同时对于目标函数值优于平均目标值的微粒,其对应的惯性权重因子较小,从而保护了该微粒,反之对于目标函数值差于平均目标值的微粒,其对应的惯性权重因子较大,使得该微粒向较好的搜索区域靠拢。

  • 算法步骤

自适应权重粒子群算法的基本步骤如下:

【1】随机初始化种群中各微粒的位置和速度;

【2】评价每个微粒的适应度,将当前各微粒的位置和适应值存储在各微粒的pbest中,将所有pbest中适应值最优个体的位置和适应值存储于gbest中;

【3】用下式更新粒子的速度和位移:

[公式]

【4】更新权重

[公式]

【5】对每个微粒,将其适应值与其经历过的最好位置作比较,如果较好,则将其作为当前的最好位置;比较当前所有pbest和gbest的值,更新gbest;

【6】若满足停止条件(通常为预设的运算精度或迭代次数),搜索停止,输出结果,否则返回【3】继续搜索。

  • Matlab代码与试算

用自适应权重的粒子群算法求函数 [公式] 的最小值。取粒子数为40,学习因子都取2,最大惯性权重取0.9,最小惯性权重取0.6,迭代步数取10000。

解:建立fitness.m文件

fitness.m

function F = fitness(x)
F = 0.5 + (sin(x(1)^2 + x(2)^2)^2 - 0.5)/(1.0 + 0.001*(x(1)^2 + x(2)^2))^2;

test.m

[x_optimization,f_optimization] = AW_PSO(@fitness,40,2,2,0.9,0.6,10000,2);
x_optimization
f_optimization

AW_PSO.m

function [x_optimization,f_optimization] = AW_PSO(fitness,N,c1,c2,wmax,wmin,M,D)
%   f:待优化的目标函数
%   N:粒子数目
%   c1:学习因子1
%   c2:学习因子2
%   wmax:最大惯性权重
%   wmin:最小惯性权重
%   M:最大迭代次数
%   D:自变量的个数
%   x_optimization:目标函数取最小值时的自变量值
%   f_optimization:目标函数的最小值
format long;
%------初始化种群的个体------------
for i = 1:N
    for j = 1:D         %   D维搜索空间
        x(i,j) = randn;  %随机初始化位置   randn:正态分布的随机数
        v(i,j) = randn;  %随机初始化速度
    end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i = 1:N
    p(i) = fitness(x(i,:));       %   个体极值
    pi(i,:) = x(i,:);
end
Pg = x(N,:);             %Pg为全局最优
for i = 1:(N-1)
    if fitness(x(i,:)) < fitness(Pg)     %  将适应值最优的个体存储
        Pg = x(i,:);
    end
end
%------进入主要循环,按照公式依次迭代------------
for t = 1:M
    for j = 1:N
        f_optimization(j) = fitness(x(j,:));
    end
    f_avg = sum(f_optimization)/N;      %   适应度平均值
    f_min = min(f_optimization);        %   适应度最小值
    for i = 1:N
        if f_optimization(i) <= f_avg
            w = wmin - (f_optimization(i) - f_min)*(wmax - wmin)/(f_avg - f_min);
        else
            w = wmax;
        end
        v(i,:) = w*(v(i,:) + c1*rand*(pi(i,:) - x(i,:)) + c2*rand*(Pg - x(i,:)));
        x(i,:) = x(i,:) + v(i,:);
        if fitness(x(i,:)) < p(i)     %   更新个体极值
            p(i) = fitness(x(i,:));
            pi(i,:) = x(i,:);
        end
        if p(i) < fitness(Pg)         %   更新全局极值
            Pg = pi(i,:);
        end
    end
end
x_optimization = Pg';
f_optimization = fitness(Pg);

命令行窗口

x_optimization =

   1.0e-06 *

   0.172784775909731
  -0.008767853535804


f_optimization =

     0

本例题中的函数的最小点为 [公式] ,最小值为0,自适应权重的粒子群算法求得的结果的精度还是可以的。


随机权重法

  • 原理

将PSO算法中设定 [公式] 为服从某种随机分布的随机数,这样一定程度上可从两方面来克服 [公式] 的线性递减所带来的不足。

首先,如果在进化初期接近最好点,随机 [公式] 可能产生相对小的 [公式] 值,加快算法的收敛速度,另外,如果在算法初期找不到最好点, [公式] 的线性递减,使得算法最终收敛不到此最好点,而 [公式] 的随机生成可以克服这种局限。

[公式] 计算公式如下:

[公式]

其中 [公式] 表示标准正态分布的随机数, [公式] 表示0到1之间的随机数。

  • 算法步骤

随机权重粒子群算法的基本步骤如下:

【1】随机初始化种群中各微粒的位置和速度;

【2】评价每个微粒的适应度,将当前各微粒的位置和适应值存储在各微粒的pbest中,将所有pbest中适应值最优个体的位置和适应值存储于gbest中;

【3】用下式更新粒子的速度和位移:

[公式]

【4】更新权重

[公式]

【5】对每个微粒,将其适应值与其经历过的最好位置作比较,如果较好,则将其作为当前的最好位置;比较当前所有pbest和gbest的值,更新gbest;

【6】若满足停止条件(通常为预设的运算精度或迭代次数),搜索停止,输出结果,否则返回【3】继续搜索。

  • Matlab代码与试算

求下面函数的最小值 [公式]

取粒子数为40,学习因子都取2,随机权重平均值的最大值取0.8,随机权重平均值的最小值取0.5,随机权重平均值的方差取0.2,迭代步数取10000。

解:首先建立目标函数文件fitness.m文件

fitness.m

function F = fitness(x)
F = 4*x(1)^2 - 2.1*x(1)^4 + x(1)^6/3 + x(1)*x(2) - 4*x(2)^2 + 4*x(2)^4;

test.m

[x_optimization,f_optimization] = RW_PSO(@fitness,40,2,2,0.8,0.5,0.2,10000,2);
x_optimization
f_optimization

RW_PSO.m

function [x_optimization,f_optimization] = RW_PSO(fitness,N,c1,c2,mu_max,mu_min,sigma,M,D)
%   f:待优化的目标函数
%   N:粒子数目
%   c1:学习因子1
%   c2:学习因子2
%   mu_max:随机权重平均值最大值
%   mu_min:随机权重平均值最小值
%   sigma:随机权重的方差
%   M:最大迭代次数
%   D:自变量的个数
%   x_optimization:目标函数取最小值时的自变量值
%   f_optimization:目标函数的最小值
format long;
%------初始化种群的个体------------
for i = 1:N
    for j = 1:D         %   D维搜索空间
        x(i,j) = randn;  %随机初始化位置   randn:正态分布的随机数
        v(i,j) = randn;  %随机初始化速度
    end
end
%------先计算各个粒子的适应度,并初始化Pi和Pg----------------------
for i = 1:N
    p(i) = fitness(x(i,:));       %   个体极值
    pi(i,:) = x(i,:);
end
Pg = x(N,:);             %Pg为全局最优
for i = 1:(N-1)
    if fitness(x(i,:)) < fitness(Pg)     %  将适应值最优的个体存储
        Pg = x(i,:);
    end
end
%------进入主要循环,按照公式依次迭代------------
for t = 1:M
    for i = 1:N
        mu = mu_min + (mu_max - mu_min)*rand();     %   随机权重的平均值
        w = mu + sigma*randn();                     %   随机权重
        v(i,:) = w*(v(i,:) + c1*rand*(pi(i,:) - x(i,:)) + c2*rand*(Pg - x(i,:)));
        x(i,:) = x(i,:) + v(i,:);
        if fitness(x(i,:)) < p(i)     %   更新个体极值
            p(i) = fitness(x(i,:));
            pi(i,:) = x(i,:);
        end
        if p(i) < fitness(Pg)         %   更新全局极值
            Pg = pi(i,:);
        end
    end
end
x_optimization = Pg';
f_optimization = fitness(Pg);

命令行窗口

x_optimization =

  -0.089842011145412
   0.712656402204421


f_optimization =

  -1.031628453489878

本题中的函数的理论最小点有两个,分别为 [公式] 和 [公式] ,最小值为 [公式] ,随机权重的粒子群算法求得的结果精度还可以。