粒子群算法可用于解决强非线性优化问题,原理较为简单(参加:最优化算法之粒子群算法(PSO)_青萍之末的博客-CSDN博客_粒子群算法),这里给出Fortran代码实现模块( module POS)。该代码适用于任意参数个数的情况,并采用OpenMP加速计算。

注意:代码求取的是目标函数极小值问题,如需求极大值,需对目标函数objFun取反。

module PSO
implicit none
contains
!****************************************************************************
! 粒子群优化算法 Particle Swarm Optimization
! 输入:
! objFun     ... 目标函数
! nParticle  ... 粒子数
! maxIts     ... 最大迭代次数
! w          ... 惯性因子(阻尼), 经典值 1.0
! c1, c2     ... 学习因子, 经典值 2.0
! rang       ... 参数范围
! x0         ... 初始值
! 输出:
! x          ... 结果
! err        ... 误差
!****************************************************************************
subroutine particleSwarmOptimization(objFun, nParticle, maxIts, w, c1, c2, rang, x, err, x0)
!$ use omp_lib
implicit none
interface
real function objFun(x) !求极小值
real x(:)
end function
end interface
integer, intent(in):: nParticle, maxIts
real,    intent(in):: w, c1, c2, rang(:,:)
real,   intent(out):: x(:), err
real,    intent(in), optional:: x0(:)
real, allocatable:: xPos(:,:), pBest(:,:), gBest(:), minErr(:)
real, allocatable:: rand1(:), rand2(:), v(:,:), objVal(:)
integer i, its
call RANDOM_SEED()
!参数个数
i = size(x)
allocate(xPos(i,nParticle), v(i,nParticle), pBest(i,nParticle), gBest(i)) !位置、速度, 最佳位置
allocate(rand1(nParticle), rand2(nParticle))   !随机数
allocate(minErr(nParticle), objVal(nParticle))
!初始位置及速度
call random_number(xPos); call random_number(v(1,1)); call random_number(v)
do i = 1, nParticlexPos(:,i) = xPos(:,i)*(rang(2,:)-rang(1,:)) + rang(1,:)v(:,i) = (v(:,i)-0.5) * (rang(2,:)-rang(1,:))
end do
if(present(x0)) xPos(:,1) = x0(:)!初始化误差
minErr = huge(1.0)
gBest = xPos(:,1)!$OMP parallel default(shared) private(fre) num_threads(omp_get_num_procs()-1)
do its = 1, maxIts!$OMP singlecall random_number(rand1); call random_number(rand2(1)); call random_number(rand2)!$OMP end single!$OMP dodo i = 1, nParticle!目标函数objVal(i) = objFun(xPos(:,i))!更新个体最优if(objVal(i)<minErr(i)) thenpBest(:,i) = xPos(:,i)minErr(i) = objVal(i)end if!更新速度v(:,i) = (0.9-0.5*(its-1.0)/max(maxIts-1.0,1.0))*w*v(:,i) + c1*rand1(i)*(pBest(:,i)-xPos(:,i)) &+ c2*rand2(i)*(gBest(:)-xPos(:,i))!限制范围v(:,i) = modulo(v(:,i)-rang(1,:),rang(2,:)-rang(1,:)) + rang(1,:)end do!$OMP end do!$OMP singlegBest = pBest(:,minloc(minErr,1)) !全局最优!$OMP end single
end do
!$OMP end parallel
!结果
x = gBest
err = minval(minErr)
deallocate(xPos, pBest, gBest, minErr, rand1, rand2, v, objVal)
end subroutine
end module

测试例子

program Test
use PSO
implicit none
real x(2), rang(2,2), err
!一元函数
rang(:,1) = [0.0,6.0]
call particleSwarmOptimization(fun1, 80, 20, 1.0, 0.5, 1.0, rang(:,1:1), x(1:1), err)
print*,'result: ', x(1:1) !真解 2.0
print*,'error: ', err
!二元函数
rang(:,1) = [-3.0,6.0]
rang(:,2) = [-4.0,3.0]
call particleSwarmOptimization(fun2, 8000, 20, 1.0, 2.0, 2.0, rang, x, err)
print*,'result: ', x!真解 0.5,1.0
print*,'error: ', err
pause
contains
! z= ( x*x + y*y )
function Fun2(x) result(res)
implicit none
real x(:), res
res = (x(1)-0.5)**2 + (x(2)+1.0)**2
end function
! z = (x-2)*(x-2)
function Fun1(x) result(res)
implicit none
real x(:), res
res = (x(1)-2)**2
end function
end program Test

粒子群算法Fortran代码(OMP并行)相关推荐

  1. 粒子群算法matlab代码实例使用与参数解读(二维数据)

    粒子群算法与matlab代码实例使用 粒子群算法介绍 粒子群算法使用场景 粒子群的优缺点 实例编程分析 代码分析 参数分析 更多应用场景 在网络中有很多的博客都已经粒子群算法的算法本质讲解的非常清晰明 ...

  2. 基于觅食生境选择的改进粒子群算法-附代码

    基于觅食生境选择的改进粒子群算法 文章目录 基于觅食生境选择的改进粒子群算法 1.粒子群优化算法 2. 改进粒子群算法 3.实验结果 4.参考文献 5.Matlab代码 6.Python代码 摘要:在 ...

  3. 粒子群算法matlab代码(注释很详细哦,图像也美美哒,任意维度)

    2022.07.09更新: 更简洁的实现请点击这里 原博文: 答疑: 我把答疑放在最前面了.很多小伙伴真的是零基础,既不懂matlab也不懂粒子群算法.因此我把最常问我的问题总结一下. Q1:为什么我 ...

  4. MATLAB蚁群算法、遗传算法、粒子群算法解决TSP问题(可以直接运行)

    MATLAB蚁群算法.遗传算法.粒子群算法解决TSP问题(可以直接运行) 1. 生成数据文件citys_data.mat 2. 蚁群算法 流程图 代码 结果展示 3.遗传算法 流程图 代码 结果展示 ...

  5. 粒子群算法优化的OTSU图像分割

    文章目录 1 基本概念 2 算法实现 3 算法优化举例 4 算法构成要素分析 5算法优缺点分析 6 算法图像分割中应用 1 基本概念 粒子群优化算法(PSO):它是进化算法的一种,它源于鸟群捕食的行为 ...

  6. 【MATLAB】混合粒子群算法原理、代码及详解

    目录 1.算法 1.1.原理 1.2.性能比较 1.3.步骤 2.代码 2.1.源码及注释 2.2.执行与效果 1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群 ...

  7. 【Simulink】粒子群算法(PSO)整定PID参数(附代码和讲解)

    目录 0.背景 1.粒子群算法 1.1.算法简介 1.2.算法步骤 1.3.算法举例 2.PID自整定 2.1.基于M文件编写的PID参数自整定 *2.2.复杂系统的PID自整定(基于simulink ...

  8. 相控阵天线(四):阵列天线波束赋形(遗传算法、粒子群算法、进化差分算法、含python代码)

    目录 波束赋形简介 遗传算法波束赋形 粒子群算法波束赋形 差分进化算法波束赋形 智能算法比较 遗传算法波束赋形代码示例 波束赋形简介 根据期望的方向图辐射特性(如方向图形状.主瓣宽度.副瓣电平.方向性 ...

  9. MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容

    MATLAB代码:基于粒子群算法的电动汽车充电站最优选址和定容 关键词:选址定容 电动汽车 充电站位置 仿真平台:MATLAB 主要内容:代码主要做的是一个电动汽车充电站的选址定容问题,提出了能够计及 ...

最新文章

  1. VisualStudio 合并代码文件
  2. 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号
  3. Control~Kalman filter
  4. linux shell 变量减法_第四章 shell和环境变量
  5. c# asp.net Pdf 转换图片 在线预览 发布到iis中问题 最终解决篇—_—!
  6. c语言求上升沿次数,[求助]上升沿信号在C语言中怎么写啊
  7. python命令行输入参数_Python3.x那些事儿:[3]命令行参数传递
  8. linux环境下安装nginx步骤(不错)
  9. 第一次写python
  10. 检查字符串是否包含数字的Python程序
  11. docker搭建zookeeper集群
  12. mysql三大范式_数据库的三大范式?
  13. win10远程计算机证书错误,win10系统下出现Wi-Fi证书错误的四种解决方案
  14. android arcgis 添加地图,ArcGis for Android在地图上添加自定义图标
  15. project各版本网盘免费下载
  16. PCB设计--AD18导入二维码避坑指南
  17. 设置css手机屏幕 media all,手机屏幕自适应之css写法@media
  18. 如何进行架构技术选型
  19. MonoRail例子(入门篇)
  20. 电商零售交易数据分析

热门文章

  1. 河北工业职业技术学院计算机怎样,河北工业职业技术学院宿舍怎么样 住宿条件好不好...
  2. 图神经网络在推荐系统的应用!
  3. 你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!
  4. postfix各类故障详细分析与解决
  5. 有关statistics
  6. Windows10家庭版 提升管理员权限
  7. [转]Google Dremel 原理 - 如何能3秒分析1PB
  8. 搜集源码之github搜索语法,网盘搜索,搜索引擎等
  9. 基于java的滑雪场学具租赁管理系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
  10. 24c02读程序C语言详解,24C02读写操作程序(C语言)