粒子群算法Fortran代码(OMP并行)

article/2025/6/9 22:44:37

    粒子群算法可用于解决强非线性优化问题,原理较为简单(参加:最优化算法之粒子群算法(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


http://chatgpt.dhexx.cn/article/bmtPrAhv.shtml

相关文章

基于C语言实现并行程序设计

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86771681 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/86771681 lab1 分别用omp和mpi实现树型求和和蝶式求和 树型omp实现思路&#xff1a;对每一层的计算并行化&#xf…

0成本睡后收入!从0教你搭建外卖红包CPS小程序

外卖返利小程序源码; 轻松部署搭建&#xff0c;小程序服务号数据互通&#xff1b; 对接美团官方; 佣金比例自定义分配; 三级分佣&#xff0c;所有资金数据一目了然&#xff1b; 拉新立减最低4.9元购月卡&#xff1b; 签到20天免费领取会员卡&#xff1b; 提现秒到账&#xff01…

SLAM前端之ndt_omp使用

ndt_omp(部分参考https://zhuanlan.zhihu.com/p/48853182) 简介&#xff1a; koide3/ndt_omp。继承自pcl ndt&#xff0c;并做了多线程等优化。参考&#xff1a;koide3/ndt_omp 环境需求&#xff1a; 1) 需要编译安装pcl-1.8.1或以上版本。因为ndt_omp是继承自pcl ndt的。 …

正交匹配追踪算法OMP

浅谈压缩感知&#xff08;九&#xff09;&#xff1a;正交匹配追踪算法OMP </h1><div class"clear"></div><div class"postBody">主要内容&#xff1a; OMP算法介绍 OMP的MATLAB实现 OMP中的数学知识 一、OMP算法介绍 来源&#…

OMP算法代码学习

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请注明出处&#xff0c;谢谢&#xff01; https://blog.csdn.net/jbb0523/article/details/45130793 </div><link rel"stylesheet" href"https://csdnimg.cn/release/phoenix/…

美团饿了么返利公众号小程序搭建(付源码)

外卖返利小程序源码; 轻松部署搭建&#xff0c;小程序服务号数据互通&#xff1b; 对接美团官方; 佣金比例自定义分配; 三级分佣&#xff0c;所有资金数据一目了然&#xff1b; 拉新立减最低4.9元购月卡&#xff1b; 签到20天免费领取会员卡&#xff1b; 提现秒到账&#xff01…

OMP算法笔记

OMP算法笔记 OMP算法整理&#xff08;以备自己后期查阅&#xff0c;集合了几篇博主的文章&#xff09; &#xff08;1&#xff09;数理知识基础–投影矩阵 详见&#xff1a; 作者&#xff1a;nineheaded_bird 来源&#xff1a;CSDN 原文&#xff1a;https://blog.csdn.net/teng…

使用python实现微信小程序自动签到2.0

微信小程序自动签到 功能描述目标输出包管理 程序的结构设计步骤1步骤2步骤3步骤4 代码实现使用findler抓包工具查看请求类型再次使用findler抓包&#xff0c;查看请求内容使用多线程完成多用户提交的功能使用itchat第三方库实现微信自动回复 将程序部署到服务器中使用scp命令将…

并行程序设计——OMP编程

并行程序设计——OMP编程 实验一 实验内容 分别实现课件中的梯形积分法的Pthread、OpenMP版本&#xff0c;熟悉并掌握OpenMP编程方法&#xff0c;探讨两种编程方式的异同。 实验代码 OpenMP编程 #include <stdio.h> #include <stdlib.h> #include <omp.h&g…

利用中国知网快速自动生成参考文献

1.打开知网 2.输入引用的文献名称 3.点击文章 4.点击“导出/参考文献” 5.自动生成参考文献

知网导出外文参考文献格式和下载文章(2019.5)

如果不弹出页面&#xff0c;是网络的原因&#xff0c;等一等

谷歌学术、中国知网生成参考文献

谷歌学术 step1.登陆谷歌学术 step2.查找需要的文献 step3.点击引用标志 step4.生成相关引用 step5.选择不同的标准复制粘贴 中国知网 step1.在知网搜索需要的论文 step2.点击导出参考文献 step3.生成参考文献引用

中国知网文献引用导入EndNote9.X,Web of science导入endnote以及谷歌学术导入endnote图文详解,全网最细版本适用EndNote9.x,Endnote20版本

文章目录 一、EndNote导入文献的以下几种格式1.1 中国知网1.2web of science1.3 谷歌学术 一、EndNote导入文献的以下几种格式 all as we konow&#xff0c;引用参考文献也就是如下三个&#xff0c;那么分别导入endnote改怎么使用呢&#xff1f; 1.1 中国知网 在你想要的文献里…

在CNKI上导出TXT文件

在使用CiteSpace之前要先下载数据源&#xff0c;今天就来讲一讲从CNKI上导出txt文件。 1、从学校官网进入中国知网CNKI&#xff0c;单击高级检索 2、输入关键字&#xff0c;可以选择组合输入&#xff0c;单击搜索 3、在每页显示处选择50 4、勾选所有所有记录&#xff08;每次导…

EndNote20导入知网文献和导出BibTeX于TexStudio

第一步&#xff1a;在知网官网中找到一篇论文并点击引号键 第二步&#xff1a;点击EndNote下载该txt文件 第三步&#xff1a;在EndNote20中点击File->Import->File&#xff0c;引入刚刚下载的txt文件 注意Import Option选择的是EndNote Import&#xff0c;点击import导入…

知网导出之Excel

背景&#xff1a;需要整理知网XX方向的论文&#xff0c;包括题目&#xff0c;内容&#xff0c;发表时间等等信息。但是一个个写也太麻烦了&#xff0c;所以&#xff0c;一些不需要人总结的东西&#xff0c;就直接导出好了。 流程&#xff1a; 选择好文献之后&#xff0c;选择自…

知网如何快速引用参考文献

1.在知网搜索界面&#xff0c;搜索自己想搜的内容&#xff0c;然后点击下图引号位置 2.在弹框中选择你要引用的格式 复制粘贴到自己论文中即可

知网 BibTeX自动生成(使用BibTeX引用中文参考文献)

前言 谷歌学术具备生成英文文献的bibtex文献引用代码的功能&#xff0c;而知网里不具备生成中文文献的bibtex引用代码的功能。因此&#xff0c;本文将生成中文文献bibtex引用代码的操作过程简单记录便于自己再次翻阅&#xff0c;操作方法源自知乎作者 上官无忌 &#xff0c;具…

知网导出引用文件,插入到Endnote管理文献

直接选endnote是txt格式 改格式也没用&#xff0c;endnote改也不行 这里选择refworks 导出txt之后 选择refworks import即可

Web of Science如何导出参考文献

Web of Science&#xff08;WOS&#xff09;是大型综合性、多学科、核心期刊引文索引数据库。 Endnote是一款可以有效管理参考文献的软件&#xff0c;并且在论文写作时&#xff0c;利用endnote可以很方便的修改引用格式。 1.进入论文界面 2.点击查看PDF,然后点击红圈 3. 可以…