北京白癜风医院 https://baike.baidu.com/item/北京中科白癜风医院/9728824
1.概述
赫兹量化在过去的几十年间,世界各地的研究人员提出了许多元启发式搜索方法来解决复杂的全局优化问题,以及改进它们的方法。
类电磁(ЕМ)算法是一种相对较新的元启发式搜索算法,基于物理空间中电磁粒子行为的模拟,由I.Birbil和S.С.Fang于年首次引入。它被描述为一种群体的进化算法,具有随机噪声和基于电磁的带电粒子之间相互作用。
该算法的灵感来自电磁学理论中电荷的吸引和排斥机制,用于在连续域中不受限制地求解非线性优化问题。由于其能够解决复杂的全局优化问题,EM在许多领域被广泛用作优化工具。
编辑
添加图片注释,不超过字(可选)
关于电磁学和电荷的有趣事实:
有两种类型的电荷:正电荷和负电荷。所有电荷即可为正值亦或为负值。电磁场可以无线电波的形式传输信息。我们每天在收听广播或看电视时即利用的此功能。我们有地球磁场,它可以保护我们免受太阳风和宇宙射线的伤害。有各种各样的材料可以被磁化,这令制造电磁铁成为可能。电磁铁可用于各种应用,例如发电机。有很多应用都基于电磁学。例如,计算机、移动电话和其它设备均用到电磁技术。所有发光物体(例如灯泡和车灯)都会发出电磁辐射。电磁学在医学中也扮演着重要角色。MRI和CT等医疗设备均利用电磁场创建人体内部图像。一些动物,如鲨鱼和电鳗,可以利用电磁在水中导航。电磁力是自然界的四种基本力之一,另外还有万有引力、弱力和强力。
2.算法
赫兹期货量化EM以电磁学理论为指导,模拟电荷的吸引-排斥机制,利用有限变量实现全局最优解。在算法中,所有解都被视为搜索空间中的带电粒子,每个粒子的电荷与目标函数的值相关联。具有较佳目标输出的粒子将施加吸引力,而具有较差目标值的粒子将向其它粒子施加排斥力。目标函数的值越好,粒子之间的吸引力或排斥力就越高。
该算法的原理是在初始阶段形成一组随机解,每个解由对应于电磁粒子上的电荷的坐标向量表示。进而,在算法的每次迭代中,在电磁力的作用下模拟这些电荷在空间中的运动。在运动时,每个电荷与其它电荷相互作用,导致运动方向和速度的变化。结果,目标函数的最优值的解逐渐收敛。
EM算法的主要组成部分是:
形成初始解(电荷)群,其中每个电荷由坐标向量表示,并对应于优化问题的某个解。计算电荷之间相互作用的电磁力。计算于算法的每次迭代中执行,并取决于电荷(解)之间的距离。电荷在电磁相互作用力影响下在空间中的运动。目标函数在每次迭代时更新公式解的群(例如,目标函数可以是机器学习问题中的损失函数)。判定算法停止的条件,例如,达到目标函数的某个值。
粒子相互作用,根据电荷和它们之间的距离吸引或排斥。该算法在若干次迭代中执行,每次迭代都会更新粒子的坐标和电荷,并计算适应度函数的新值。
EM优化算法的逻辑单元是一个粒子。它可以通过S_Particle结构来描述,它是搜索空间中的代理者。每个粒子都有c[]坐标,它决定了其在搜索空间中的位置,以及C电荷,它影响与其它粒子的相互作用。对于每个粒子,计算适应度函数f的值,该值评估对应于给定坐标的解的质量。此外,对于每个粒子,计算到其它粒子的距离R和力矢量F,其可判定粒子在搜索空间中的运动方向。
//——————————————————————————————————————————————————————————————————————————————structS_Particle{doublec[];//coordinatesdoubleC;//chargedoublef;//fitnessdoubleR[];//euclideandistancetootherparticlesdoubleF[];//forcevector};//——————————————————————————————————————————————————————————————————————————————
C_AO_EM类是电磁优化算法的实现。它基于给出的一组实数上查找函数的最佳值。该算法基于模拟物理系统中磁性和电粒子之间的相互作用过程。
该类包含以下字段:
S_Particlep[]-表示优化问题潜在解的粒子数组。doublerangeMax[]—每个坐标的最大搜索范围值数组。doublerangeMin[]—每个坐标的最小搜索范围值数组。doublerangeStep[]-每个坐标的搜索步骤数组。doublecB[]—最佳解的坐标数组。doublefB-最佳函数解的值。
该类包含以下方法:
voidInit()初始化算法,设置坐标数、粒子数、环境常数和移动步长。voidMoving(intiter)根据磁场和电场相互作用的规则迭代运动粒子的算法。voidRevision()对粒子进行修订,检查它们是否超出搜索范围,并在必要时调整它们的位置。
该类还包含私有字段:
intcoordinatesNumber—坐标数。intparticlesNumber—粒子数。doubleenvConstant—环境常数。doublemovConstant—移动步长。doubleexponent—距离指数。doublevect[]—向量数组。boolrevision—指示粒子需要修订的标志。
该类包含私密方法:
doubleSeInDiSp(doubleIn,doubleInMin,doubleInMax,doubleStep)在均匀网格上分配点。doubleRNDfromCI(doublemin,doublemax)在给定范围内生成一个随机数。
//——————————————————————————————————————————————————————————————————————————————classC_AO_EM{//----------------------------------------------------------------------------public:S_Particlep[];//particlespublic:doublerangeMax[];//maximumsearchrangepublic:doublerangeMin[];//minimumsearchrangepublic:doublerangeStep[];//stepsearchpublic:doublecB[];//bestcoordinatespublic:doublefB;//FFofthebestcoordinatespublic:voidInit(constintcoordinatesNumberP,//coordinatesnumberconstintparticlesNumberP,//particlesnumberconstdoubleenvConstantP,//environmentalconstantconstdoublemovConstantP,//movementstepconstdoubleexponentP);//exponentpublic:voidMoving();public:voidRevision();//----------------------------------------------------------------------------private:intcoordinatesNumber;//coordinatesnumberprivate:intparticlesNumber;//particlesnumberprivate:doubleenvConstant;//environmentalconstantprivate:doublemovConstant;//movementstepprivate:doubleexponent;//exponentprivate:doublevect[];//vectorprivate:boolrevision;private:doubleSeInDiSp(doubleIn,doubleInMin,doubleInMax,doubleStep);private:doubleRNDfromCI(doublemin,doublemax);};//——————————————————————————————————————————————————————————————————————————————
“电磁算法”优化算法初始化方法从重置随机数生成器和设置某些变量的初始值开始。然后,该方法将几个参数作为输入:坐标数、粒子数、环境值和移动步长。接下来,该方法创建多个所需大小的数组,并用初始值填充它们。
数组存储每个坐标范围的最大值和最小值、更改坐标的步骤、矢量和每个粒子的当前位置。然后,该方法创建一个粒子数组,并为每个粒子创建数组来存储其坐标、与其它粒子的距离矩阵、作用力矢量和函数的当前最佳值。最后,该方法创建一个数组来存储所有粒子的最佳坐标。因此,该方法初始化“电磁算法”优化算法工作所需的所有变量和数组。
//——————————————————————————————————————————————————————————————————————————————voidC_AO_EM::Init(constintcoordinatesNumberP,//coordinatesnumberconstintparticlesNumberP,//particlesnumberconstdoubleenvConstantP,//environmentalconstantconstdoublemovConstantP,//movementstepconstdoubleexponentP)//exponent{MathSrand((int)GetMicrosecondCount());//resetofthegeneratorfB=-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(inti=0;iparticlesNumber;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[]。