期貨量化交易軟件:種群優(yōu)化算法類電磁算法
1. 概述
赫茲量化在過去的幾十年間,世界各地的研究人員提出了許多元啟發(fā)式搜索方法來解決復雜的全局優(yōu)化問題,以及改進它們的方法。
類電磁(ЕМ)算法是一種相對較新的元啟發(fā)式搜索算法,基于物理空間中電磁粒子行為的模擬,由 I. Birbil 和 S.С. Fang 于 2003 年首次引入。 它被描述為一種群體的進化算法,具有隨機噪聲和基于電磁的帶電粒子之間相互作用。
該算法的靈感來自電磁學理論中電荷的吸引和排斥機制,用于在連續(xù)域中不受限制地求解非線性優(yōu)化問題。 由于其能夠解決復雜的全局優(yōu)化問題,EM 在許多領域被廣泛用作優(yōu)化工具。

編輯
關于電磁學和電荷的有趣事實:
有兩種類型的電荷:正電荷和負電荷。 所有電荷即可為正值亦或為負值。
電磁場可以無線電波的形式傳輸信息。 我們每天在收聽廣播或看電視時即利用的此功能。
我們有地球磁場,它可以保護我們免受太陽風和宇宙射線的傷害。
有各種各樣的材料可以被磁化,這令制造電磁鐵成為可能。 電磁鐵可用于各種應用,例如發(fā)電機。
有很多應用都基于電磁學。 例如,計算機、移動電話和其它設備均用到電磁技術。
所有發(fā)光物體(例如燈泡和車燈)都會發(fā)出電磁輻射。
電磁學在醫(yī)學中也扮演著重要角色。 MRI 和 CT 等醫(yī)療設備均利用電磁場創(chuàng)建人體內部圖像。
一些動物,如鯊魚和電鰻,可以利用電磁在水中導航。
電磁力是自然界的四種基本力之一,另外還有萬有引力、弱力和強力。
2. 算法
赫茲期貨量化EM 以電磁學理論為指導,模擬電荷的吸引-排斥機制,利用有限變量實現全局最優(yōu)解。 在算法中,所有解都被視為搜索空間中的帶電粒子,每個粒子的電荷與目標函數的值相關聯。 具有較佳目標輸出的粒子將施加吸引力,而具有較差目標值的粒子將向其它粒子施加排斥力。 目標函數的值越好,粒子之間的吸引力或排斥力就越高。
該算法的原理是在初始階段形成一組隨機解,每個解由對應于電磁粒子上的電荷的坐標向量表示。 進而,在算法的每次迭代中,在電磁力的作用下模擬這些電荷在空間中的運動。 在運動時,每個電荷與其它電荷相互作用,導致運動方向和速度的變化。 結果,目標函數的最優(yōu)值的解逐漸收斂。
EM 算法的主要組成部分是:
形成初始解(電荷)群,其中每個電荷由坐標向量表示,并對應于優(yōu)化問題的某個解。
計算電荷之間相互作用的電磁力。 計算于算法的每次迭代中執(zhí)行,并取決于電荷(解)之間的距離。
電荷在電磁相互作用力影響下在空間中的運動。
目標函數在每次迭代時更新公式解的群(例如,目標函數可以是機器學習問題中的損失函數)。
判定算法停止的條件,例如,達到目標函數的某個值。
粒子相互作用,根據電荷和它們之間的距離吸引或排斥。 該算法在若干次迭代中執(zhí)行,每次迭代都會更新粒子的坐標和電荷,并計算適應度函數的新值。
EM 優(yōu)化算法的邏輯單元是一個粒子。 它可以通過 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 類是電磁優(yōu)化算法的實現。 它基于給出的一組實數上查找函數的最佳值。 該算法基于模擬物理系統中磁性和電粒子之間的相互作用過程。
該類包含以下字段:
S_Particle p[] - 表示優(yōu)化問題潛在解的粒子數組。
double rangeMax[] — 每個坐標的最大搜索范圍值數組。
double rangeMin[] — 每個坐標的最小搜索范圍值數組。
double rangeStep[] - 每個坐標的搜索步驟數組。
double cB[] — 最佳解的坐標數組。
double fB - 最佳函數解的值。
該類包含以下方法:
void Init() 初始化算法,設置坐標數、粒子數、環(huán)境常數和移動步長。
void Moving(int iter) 根據磁場和電場相互作用的規(guī)則迭代運動粒子的算法。
void Revision() 對粒子進行修訂,檢查它們是否超出搜索范圍,并在必要時調整它們的位置。
該類還包含私有字段:
int coordinatesNumber —坐標數。
int particlesNumber — 粒子數。
double envConstant — 環(huán)境常數。
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); }; //——————————————————————————————————————————————————————————————————————————————
“電磁算法”優(yōu)化算法初始化方法從重置隨機數生成器和設置某些變量的初始值開始。 然后,該方法將幾個參數作為輸入:坐標數、粒子數、環(huán)境值和移動步長。 接下來,該方法創(chuàng)建多個所需大小的數組,并用初始值填充它們。
數組存儲每個坐標范圍的最大值和最小值、更改坐標的步驟、矢量和每個粒子的當前位置。 然后,該方法創(chuàng)建一個粒子數組,并為每個粒子創(chuàng)建數組來存儲其坐標、與其它粒子的距離矩陣、作用力矢量和函數的當前最佳值。 最后,該方法創(chuàng)建一個數組來存儲所有粒子的最佳坐標。 因此,該方法初始化“電磁算法”優(yōu)化算法工作所需的所有變量和數組。
//—————————————————————————————————————————————————————————————————————————————— 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() 方法是每次迭代時必須執(zhí)行的第一個方法。 它負責在解的搜索空間中粒子的運動。 首先,該方法檢查粒子是否已初始化。 如果還沒有,則每個粒子接收給定限制內的隨機坐標,并將其當前估計值和電荷重置為零。 另外還計算搜索空間每個維度中最大值和最小值之間的差異向量 vect []。