欢迎光临散文网 会员登陆 & 注册

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

2023-09-04 16:01 作者:bili_45793681098  | 我要投稿

1. 概述

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

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

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

编辑

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

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

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

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

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

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

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

  • 电磁学在医学中也扮演着重要角色。 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 []。


期货量化交易软件:种群优化算法类电磁算法的评论 (共 条)

分享到微博请遵守国家法律