期货量化交易软件:种群优化算法类电磁算法

文章介绍了赫兹量化背景下,类电磁(EM)算法如何模仿电荷的吸引-排斥机制,在全球优化问题中寻找解决方案。通过模拟粒子在电磁力作用下的运动,EM算法在多个领域广泛应用。文章详细阐述了算法原理、组成和初始化过程,以及粒子的运动规则。
摘要由CSDN通过智能技术生成

1. 概述

赫兹量化在过去的几十年间,世界各地的研究人员提出了许多元启发式搜索方法来解决复杂的全局优化问题,以及改进它们的方法。

类电磁(ЕМ)算法是一种相对较新的元启发式搜索算法,基于物理空间中电磁粒子行为的模拟,由 I. Birbil 和 S.С. Fang 于 2003 年首次引入。 它被描述为一种群体的进化算法,具有随机噪声和基于电磁的带电粒子之间相互作用。

该算法的灵感来自电磁学理论中电荷的吸引和排斥机制,用于在连续域中不受限制地求解非线性优化问题。 由于其能够解决复杂的全局优化问题,EM 在许多领域被广泛用作优化工具。

编辑

添加图片注释,不超过 140 字(可选)

关于电磁学和电荷的有趣事实:

  • 有两种类型的电荷:正电荷和负电荷。 所有电荷即可为正值亦或为负值。

  • 电磁场可以无线电波的形式传输信息。 我们每天在收听广播或看电视时即利用的此功能。

  • 我们有地球磁场,它可以保护我们免受太阳风和宇宙射线的伤害。

  • 有各种各样的材料可以被磁化,这令制造电磁铁成为可能。 电磁铁可用于各种应用,例如发电机。

  • 有很多应用都基于电磁学。 例如,计算机、移动电话和其它设备均用到电磁技术。

  • 所有发光物体(例如灯泡和车灯)都会发出电磁辐射。

  • 电磁学在医学中也扮演着重要角色。 MRI 和 CT 等医疗设备均利用电磁场创建人体内部图像。

  • 一些动物,如鲨鱼和电鳗,可以利用电磁在水中导航。

  • 电磁力是自然界的四种基本力之一,另外还有万有引力、弱力和强力。

2. 算法

赫兹期货量化EM 以电磁学理论为指导,模拟电荷的吸引-排斥机制,利用有限变量实现全局最优解。 在算法中,所有解都被视为搜索空间中的带电粒子,每个粒子的电荷与目标函数的值相关联。 具有较佳目标输出的粒子将施加吸引力,而具有较差目标值的粒子将向其它粒子施加排斥力。 目标函数的值越好,粒子之间的吸引力或排斥力就越高。

该算法的原理是在初始阶段形成一组随机解,每个解由对应于电磁粒子上的电荷的坐标向量表示。 进而,在算法的每次迭代中,在电磁力的作用下模拟这些电荷在空间中的运动。 在运动时,每个电荷与其它电荷相互作用,导致运动方向和速度的变化。 结果,目标函数的最优值的解逐渐收敛。

EM 算法的主要组成部分是:

  1. 形成初始解(电荷)群,其中每个电荷由坐标向量表示,并对应于优化问题的某个解。

  2. 计算电荷之间相互作用的电磁力。 计算于算法的每次迭代中执行,并取决于电荷(解)之间的距离。

  3. 电荷在电磁相互作用力影响下在空间中的运动。

  4. 目标函数在每次迭代时更新公式解的群(例如,目标函数可以是机器学习问题中的损失函数)。

  5. 判定算法停止的条件,例如,达到目标函数的某个值。

粒子相互作用,根据电荷和它们之间的距离吸引或排斥。 该算法在若干次迭代中执行,每次迭代都会更新粒子的坐标和电荷,并计算适应度函数的新值。

EM 优化算法的逻辑单元是一个粒子。 它可以通过 S_Particle 结构来描述,它是搜索空间中的代理者。 每个粒子都有 c[] 坐标,它决定了其在搜索空间中的位置,以及 C 电荷,它影响与其它粒子的相互作用。 对于每个粒子,计算适应度函数 f 的值,该值评估对应于给定坐标的解的质量。 此外,对于每个粒子,计算到其它粒子的距离 R 和力矢量 F,其可判定粒子在搜索空间中的运动方向。

 
 

//—————————————————————————————————————————————————————————————————————————————— struct S_Particle { double c []; //coordinates double C; //charge double f; //fitness double R []; //euclidean distance to other particles double F []; //force vector }; //——————————————————————————————————————————————————————————————————————————————

C_AO_EM 类是电磁优化算法的实现。 它基于给出的一组实数上查找函数的最佳值。 该算法基于模拟物理系统中磁性和电粒子之间的相互作用过程。

该类包含以下字段:

  • S_Particle p[] - 表示优化问题潜在解的粒子数组。

  • double rangeMax[] — 每个坐标的最大搜索范围值数组。

  • double rangeMin[] — 每个坐标的最小搜索范围值数组。

  • double rangeStep[] - 每个坐标的搜索步骤数组。

  • double cB[] — 最佳解的坐标数组。

  • double fB - 最佳函数解的值。

该类包含以下方法:

  • void Init() 初始化算法,设置坐标数、粒子数、环境常数和移动步长。

  • void Moving(int iter) 根据磁场和电场相互作用的规则迭代运动粒子的算法。

  • void Revision() 对粒子进行修订,检查它们是否超出搜索范围,并在必要时调整它们的位置。

该类还包含私有字段:

  • int coordinatesNumber —坐标数。

  • int particlesNumber — 粒子数。

  • double envConstant — 环境常数。

  • double movConstant — 移动步长。

  • double exponent — 距离指数。

  • double vect[] — 向量数组。

  • bool revision — 指示粒子需要修订的标志。

该类包含私密方法:

  • double SeInDiSp(double In, double InMin, double InMax, double Step) 在均匀网格上分配点。

  • double RNDfromCI(double min, double max) 在给定范围内生成一个随机数。

 
 

//—————————————————————————————————————————————————————————————————————————————— class C_AO_EM { //---------------------------------------------------------------------------- public: S_Particle p []; //particles public: double rangeMax []; //maximum search range public: double rangeMin []; //minimum search range public: double rangeStep []; //step search public: double cB []; //best coordinates public: double fB; //FF of the best coordinates public: void Init (const int coordinatesNumberP, //coordinates number const int particlesNumberP, //particles number const double envConstantP, //environmental constant const double movConstantP, //movement step const double exponentP); //exponent public: void Moving (); public: void Revision (); //---------------------------------------------------------------------------- private: int coordinatesNumber; //coordinates number private: int particlesNumber; //particles number private: double envConstant; //environmental constant private: double movConstant; //movement step private: double exponent; //exponent private: double vect []; //vector private: bool revision; private: double SeInDiSp (double In, double InMin, double InMax, double Step); private: double RNDfromCI (double min, double max); }; //——————————————————————————————————————————————————————————————————————————————

“电磁算法”优化算法初始化方法从重置随机数生成器和设置某些变量的初始值开始。 然后,该方法将几个参数作为输入:坐标数、粒子数、环境值和移动步长。 接下来,该方法创建多个所需大小的数组,并用初始值填充它们。

数组存储每个坐标范围的最大值和最小值、更改坐标的步骤、矢量和每个粒子的当前位置。 然后,该方法创建一个粒子数组,并为每个粒子创建数组来存储其坐标、与其它粒子的距离矩阵、作用力矢量和函数的当前最佳值。 最后,该方法创建一个数组来存储所有粒子的最佳坐标。 因此,该方法初始化“电磁算法”优化算法工作所需的所有变量和数组。

 
 

//—————————————————————————————————————————————————————————————————————————————— void C_AO_EM::Init (const int coordinatesNumberP, //coordinates number const int particlesNumberP, //particles number const double envConstantP, //environmental constant const double movConstantP, //movement step const double exponentP) //exponent { MathSrand ((int)GetMicrosecondCount ()); // reset of the generator fB = -DBL_MAX; revision = false; coordinatesNumber = coordinatesNumberP; particlesNumber = particlesNumberP; envConstant = envConstantP; movConstant = movConstantP; exponent = exponentP; ArrayResize (rangeMax, coordinatesNumber); ArrayResize (rangeMin, coordinatesNumber); ArrayResize (rangeStep, coordinatesNumber); ArrayResize (vect, coordinatesNumber); ArrayResize (p, particlesNumber); for (int i = 0; i < particlesNumber; i++) { ArrayResize (p [i].c, coordinatesNumber); ArrayResize (p [i].R, particlesNumber); ArrayResize (p [i].F, coordinatesNumber); p [i].f = -DBL_MAX; } ArrayResize (cB, coordinatesNumber); } //——————————————————————————————————————————————————————————————————————————————

Moving() 方法是每次迭代时必须执行的第一个方法。 它负责在解的搜索空间中粒子的运动。 首先,该方法检查粒子是否已初始化。 如果还没有,则每个粒子接收给定限制内的随机坐标,并将其当前估计值和电荷重置为零。 另外还计算搜索空间每个维度中最大值和最小值之间的差异向量 vect []。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值