股票量化軟件-股票量化交易:群體優(yōu)化算法粒子群(PSO)

1. 概述
大概有不少人讀過斯坦尼斯瓦夫·萊姆(Stanis?aw Lem)的精彩科幻暢銷書《無敵》("The Invincible")。 令人驚訝的是,對(duì)“群體”智能的最早描述之一正是隨著這部科幻小說的發(fā)行而誕生的。 這個(gè)故事是有關(guān)未集中控制的幸存機(jī)器人。 值得注意的是,最簡單且數(shù)量龐大的標(biāo)本幸存下來,而非那些最復(fù)雜、最聰明、和最強(qiáng)大的標(biāo)本。今天赫茲股票量化交易軟件帶大家了解下群體優(yōu)化算法粒子群,
在數(shù)千年的宏觀演化過程中,這些機(jī)器已經(jīng)學(xué)會(huì)了有效地應(yīng)對(duì)他們的競(jìng)爭(zhēng)對(duì)手,在智力和能源利用方面都遙遙領(lǐng)先。 他們不僅要與其他機(jī)器人作戰(zhàn),還要與星球上的生命世界作戰(zhàn)。 這部作品中的幻想元素能夠可靠地與進(jìn)化和自然本身進(jìn)行比較。
自遠(yuǎn)古時(shí)代以來,人們就對(duì)群體動(dòng)物的行為(所謂的群體行為)感興趣 — 遷徙到溫暖國度的鳥群如何運(yùn)作;蜂群如何生產(chǎn)食物;蟻群如何在創(chuàng)造復(fù)雜結(jié)構(gòu)的同時(shí)生存;魚群如何在行動(dòng)整齊劃一,且為什么它們的行為如此同步。 社會(huì)中的獨(dú)立組織展現(xiàn)出協(xié)調(diào)良好的整體有機(jī)體的某些模式,這些都激發(fā)了算法優(yōu)化領(lǐng)域的新思路。
群體智能描述的是模擬自組織系統(tǒng)的集體行為。 此類算法的數(shù)量相當(dāng)多。 在 J.Kennedy 和 R.Eberhart 于 1995 年編寫的規(guī)范版本中,該方法的基礎(chǔ)模型是通過簡化雷諾茲(Reynolds)模型獲得的。 這種簡化的成果,種群中不同的個(gè)體開始作為單獨(dú)物體出現(xiàn),這些物體沒有大小,但具有一定的速度。
由于這極端類似物質(zhì)粒子,產(chǎn)出的的簡單物體被稱為粒子,它們的種群被稱為群體。 在每個(gè)時(shí)刻(每次迭代),粒子在空間中都具有一定位置和速度矢量。 針對(duì)粒子的每個(gè)位置,計(jì)算出目標(biāo)函數(shù)的相應(yīng)值,并在此基礎(chǔ)上,根據(jù)一定的規(guī)則,粒子在搜索空間中改變其位置和速度。 在判定粒子的下一個(gè)位置時(shí),也會(huì)考慮來自所有其它相鄰粒子當(dāng)中的最佳位置信息,對(duì)應(yīng)于適應(yīng)度函數(shù)的任務(wù)。
群算法示例:
粒子群法
螞蟻算法
蜜蜂算法
人工免疫系統(tǒng)
灰狼算法
蝙蝠算法
引力搜索算法
利他主義算法
以及許多其它
從模擬集體行為到集體優(yōu)化的過渡基于以下生物學(xué)思想:群居的生物體團(tuán)結(jié)一致,能改善其生活條件。 平均而言,群居中的每個(gè)生物體,在與捕食者的斗爭(zhēng)中都有更好的生存機(jī)會(huì),與獨(dú)立生物體相比,群居可以更有效地搜索、加工和儲(chǔ)存食物,等等。 換言之,任何群居生物在其生存的整個(gè)時(shí)間段里,都會(huì)以不同程度的效率解決各種優(yōu)化問題,例如,最大化食物量,同時(shí)最小化來自捕食者的損失。 考慮到這些,形成了構(gòu)造各種數(shù)學(xué)優(yōu)化方法的基礎(chǔ)。
粒子群自始創(chuàng)以來,就是最著名和最流行的優(yōu)化算法之一。 其各種實(shí)現(xiàn)的眾多作者聲稱該算法在優(yōu)化具有許多參數(shù)的復(fù)雜函數(shù)方面非常有效,甚至也適用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)。
在本文中,赫茲量化交易軟件將嘗試找出該算法是否真的適合解決復(fù)雜問題。 在算法的經(jīng)典版本,及其許多修訂版中,存在重大限制,關(guān)聯(lián)的事實(shí)就是優(yōu)化函數(shù)必須是平滑和連續(xù)的,這意味著它完全不適合離散函數(shù)。 然而,根據(jù)該系列文章,所有正在考慮的算法都將以這種方式進(jìn)行修改(如果有任何限制),從而消除缺陷,令算法至少能純技術(shù)性地工作。 換言之,所有算法都必須無無差別對(duì)待函數(shù)的平滑性(例如在交易者的問題中),并且在參數(shù)步驟上沒有限制。
2. 算法原理
雖然上一篇文章介紹了優(yōu)化世界,但它沒有涵蓋主程序(EA、腳本、指標(biāo))與優(yōu)化算法核心的相交原理。 注意這一點(diǎn)很重要,因?yàn)闊o論如何,細(xì)心的讀者都會(huì)有一個(gè)問題:為什么算法和示例程序要以這種方式編寫。 優(yōu)化算法的現(xiàn)有版本,均以這般方式構(gòu)造,算法引用適應(yīng)度函數(shù)作為外部對(duì)象,而算法是主要的可執(zhí)行程序。
下面的圖例 1 顯示出算法將優(yōu)化的參數(shù)傳遞給適應(yīng)度函數(shù),并獲取適應(yīng)度值(評(píng)估準(zhǔn)則)的圖表。 該系統(tǒng)不便于構(gòu)建程序來解決用戶、包括交易者的問題。 為何不方便呢? 例如,我們赫茲量化交易軟件不能調(diào)用測(cè)試器依據(jù)整個(gè)歷史記錄運(yùn)行。

圖例 1. PSO 與適應(yīng)度函數(shù)的相交
圖例 2 中顯示出的結(jié)構(gòu)則要方便得多。 這里的優(yōu)化算法不是一個(gè)獨(dú)立的程序,而是一個(gè)單獨(dú)的模塊、或“黑匣子”。 該模塊為每個(gè)優(yōu)化參數(shù)提供“最小”、“最大”、和“步長”參數(shù)。 MQL 程序根據(jù)請(qǐng)求接收優(yōu)化的參數(shù),并返回適應(yīng)度值,換眼言之,適應(yīng)度函數(shù)值。 這種結(jié)構(gòu)允許構(gòu)建一系列非常靈活的解決方案,從在智能交易系統(tǒng)中使用自動(dòng)優(yōu)化,到編寫自定義優(yōu)化管理器。

圖例 2. PSO 與 MQL程序的相交
還值得一提的是,調(diào)用優(yōu)化算法方法(圖例 2 中的 MQL 模塊)的組織可用一個(gè)針對(duì)所有優(yōu)化算法 (AO) 都通用的相同設(shè)計(jì)流圖來表示:
Initialization_АО_0
迭代周期(世代)
{
1)?Method_АО_1
2) 獲取優(yōu)化參數(shù)的每個(gè)變體的適應(yīng)度值
3)?Method_АО_2
}
因此,我們看到只用到了三種公開方法:Initialization_АО_0,Method_АО_1?和?Method_АО_2。 這足以在任何復(fù)雜程度的用戶項(xiàng)目中組織優(yōu)化過程。
PSO 工作流本身如圖例 3 所示,包括以下邏輯步驟:
隨機(jī)粒子生成(第一次迭代)
獲取每個(gè)粒子的適應(yīng)度值
獲取所有粒子的一般適應(yīng)度值
粒子速度調(diào)節(jié)
斷點(diǎn)或轉(zhuǎn)到步驟 2
程序完成。

圖例 3. PSO 工作流
我們赫茲量化交易軟件來更詳細(xì)地研究粒子群算法。
群體智能系統(tǒng)由許多粒子相互之間,以及與環(huán)境相互作用組成。 每個(gè)粒子都遵循簡單的規(guī)則,盡管沒有中央行為控制系統(tǒng)來告訴每個(gè)粒子該做什么。 它們之間的局部和隨機(jī)相交作用導(dǎo)致出現(xiàn)不受個(gè)體控制的智能群體行為。
如果我們用羊群來類比,那么我們可以說所有粒子都必須執(zhí)行簡單的任務(wù):
避免與其它粒子相交;
根據(jù)周圍粒子的速度調(diào)整速度;
盡量在自己與環(huán)境之間保持相當(dāng)小的距離。
PSO 算法從種群初始化開始。 第二步是計(jì)算每個(gè)粒子的適應(yīng)度值,然后更新單個(gè)和全局最佳分?jǐn)?shù),然后更新粒子的速度和位置。 當(dāng)使用 PSO 時(shí),數(shù)值優(yōu)化問題的可能解由粒子的位置表示。 此外,每個(gè)粒子都有一個(gè)當(dāng)前速率,反映其至新位置的絕對(duì)大小和方向,據(jù)推測(cè)更好的解/位置。
粒子還存儲(chǔ)其適應(yīng)度值、當(dāng)前位置、已知最佳位置(含有已知最適應(yīng)度的以前位置)、和已知最佳位置的適應(yīng)度。 重復(fù)步驟 2 到 4,直到滿足完成條件。 在第一次迭代中,所有粒子都被打散,以便找到最佳解(探索)。 每個(gè)顆粒都進(jìn)行評(píng)估。 找到了鄰域拓?fù)涞淖罴呀猓⒏氯后w中每個(gè)成員的個(gè)體和全局最佳粒子。 收斂是將所有粒子吸引到具有最佳解的粒子周圍來達(dá)成的。
盡管 PSO 算法的核心非常簡單,但我們需要理解它,以便能夠修改本文中的代碼,來滿足我們的需求。 PSO 是一個(gè)迭代過程。 在主處理循環(huán)的每次迭代中,首先更新每個(gè)粒子的當(dāng)前速度。 粒子的當(dāng)前速度,其局部信息和群的全局信息,需要通盤考慮。 然后取該粒子的新速度值更新每個(gè)粒子的位置。
在數(shù)學(xué)上,這兩個(gè)粒子坐標(biāo)更新方程如下所示:
v(t+1) = w * v(t) + c1 * rp * (p(t) – x(t)) + (c2 * rg * (g(t) – x(t))
x(t+1) = x(t) + v(t+1)
位置更新過程實(shí)際上比建議的方程簡單得多。 第一個(gè)方程用于更新粒子的速度。
v(t+1) 項(xiàng)表示時(shí)間 t+1 處的速度。 新的速度取決于三項(xiàng)。
第一個(gè): w * v(t)。 w 因子稱為慣性的重量分?jǐn)?shù),只是一個(gè)常數(shù);v(t) 是時(shí)間 t 處的當(dāng)前速度。
第二項(xiàng): c1 * rp * (p(t) – x(t))。 c1 因子是一個(gè)常數(shù),稱為認(rèn)知(或個(gè)人或局部)權(quán)重分?jǐn)?shù)。 rp 乘數(shù)是 [0, 1] 范圍內(nèi)的隨機(jī)變量。 p(t) 向量是迄今為止找到的粒子的最佳位置,x(t) 向量是粒子的當(dāng)前位置。
第三項(xiàng): 速度更新 c2 * rg * (g(t) – x(t)。 c2 因子是一個(gè)常數(shù),稱為社會(huì)(或全局)權(quán)重分?jǐn)?shù)。 rg 乘數(shù)是 [0, 1] 范圍內(nèi)的隨機(jī)變量。 g(t) 矢量的值是迄今為止在群體中發(fā)現(xiàn)的任何粒子的已知最佳位置。 一旦確定了新速度 v(t+1),它就被用來計(jì)算粒子的新位置 x(t+1)。
3. 經(jīng)典實(shí)現(xiàn)
描述空間中一組坐標(biāo)(優(yōu)化參數(shù))的邏輯單元是粒子,可用結(jié)構(gòu)來表示,其中 c[] 是粒子的坐標(biāo),cB[] 是粒子所有迭代的最佳坐標(biāo),v[] 是粒子每個(gè)坐標(biāo)的速度,ff - 粒子的當(dāng)前適應(yīng)度值,ffB - 粒子在所有迭代中的最佳適應(yīng)度值。 在粒子結(jié)構(gòu)的構(gòu)造函數(shù)中,我們可用 “double” 數(shù)據(jù)類型初始化 ff 和 ffB 的值,它們表示最小可能值,因?yàn)樵撍惴ㄖ荚谡业胶瘮?shù)的最大值(要找到最小值,在最大適應(yīng)度結(jié)果值前面添加一個(gè) “-” 符號(hào)就足夠了)。
//——————————————————————————————————————————————————————————————————————————————
struct S_Particles
{
?public:
? ?double c ?[]; //coordinates
? ?double cB []; //best coordinates
? ?double v ?[]; //velocity
? ?double ff; ? ?//the value of the fitness function
? ?double ffB; ? //best value fitness function
? ?S_Particles ()
? ?{
? ? ?ff ?= -DBL_MAX;
? ? ?ffB = -DBL_MAX;
? ?}
};
//——————————————————————————————————————————————————————————————————————————————
我們的 PSO 算法類實(shí)現(xiàn)只有三個(gè)公開方法?InitPS()、Preparation()?和?Dwelling()(Initialization_АО_0,Method_АО_1?和?Method_АО_2)。 在私密方法之外,GenerateRNDparticles ()?和?ParticleMovement ()?對(duì)于 PSO 來說是唯一的,而其余的已經(jīng)在上一篇文章中討論過了。?p []?結(jié)構(gòu)數(shù)組是一群粒子。 除了事實(shí)上每個(gè)粒子都有適應(yīng)度值、自己的坐標(biāo)、和最佳坐標(biāo)之外,群體作為一個(gè)整體還具有最佳坐標(biāo)?cB,和最佳適應(yīng)度值?ffB。
//——————————————————————————————————————————————————————————————————————————————
class C_AO_PSO
{
?public:
?//----------------------------------------------------------------------------
?S_Particles p ? ?[]; //particles
?double rangeMax ?[]; //maximum search range
?double rangeMin ?[]; //manimum search range
?double rangeStep []; //step search
?double cB ? ? ? ?[]; //best coordinates
?double ffB; ? ? ? ? ?//FF of the best coordinates
?void InitPS (const int ? ?params, ? ? ? //number of opt. parameters
? ? ? ? ? ? ? const int ? ?size, ? ? ? ? //swarm size
? ? ? ? ? ? ? const double inertiaP, ? ? //inertia
? ? ? ? ? ? ? const double selfBoostP, ? //boost
? ? ? ? ? ? ? const double groupBoostP); //group boost
?void Preparation ();
?void Dwelling ();
?private:
?//----------------------------------------------------------------------------
?int swarmSize; //swarm size
?int parameters;//number of optimized parameters
?double inertia;
?double selfBoost;
?double groupBoost;
?bool ? dwelling;
?void ? GenerateRNDparticles ();
?void ? ParticleMovement ? ? ();
?double SeInDiSp ? ? ? ? ? ? (double in, double inMin, double inMax, double step);
?double RNDfromCI ? ? ? ? ? ?(double min, double max);
};
//——————————————————————————————————————————————————————————————————————————————
InitPS()?方法是在優(yōu)化開始之前初始化算法(Initialization_АО_0)。 方法參數(shù)值分配給方法中的私密成員,并把大小分配到群體,和群體中每個(gè)粒子的內(nèi)部參數(shù)。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_PSO::InitPS (const int ? ?paramsP,
? ? ? ? ? ? ? ? ? ? ? const int ? ?sizeP,
? ? ? ? ? ? ? ? ? ? ? const double inertiaP,
? ? ? ? ? ? ? ? ? ? ? const double selfBoostP,
? ? ? ? ? ? ? ? ? ? ? const double groupBoostP)
{
?ffB = -DBL_MAX;
?parameters = paramsP;
?swarmSize ?= sizeP;
?ArrayResize (rangeMax, ?parameters);
?ArrayResize (rangeMin, ?parameters);
?ArrayResize (rangeStep, parameters);
?dwelling = false;
?inertia ? ?= inertiaP;
?selfBoost ?= selfBoostP;
?groupBoost = groupBoostP;
?ArrayResize (p, swarmSize);
?for (int i = 0; i < swarmSize; i++)
?{
? ?ArrayResize (p [i].c, ?parameters);
? ?ArrayResize (p [i].cB, parameters);
? ?ArrayResize (p [i].v, ?parameters);
?}
?ArrayResize (cB, parameters);
}
//——————————————————————————————————————————————————————————————————————————————
Preparation ()?方法在每次迭代(世代)時(shí)首先調(diào)用(Method_АО_1)。 該方法很簡單,但非常重要。 根據(jù)該方法是在第一個(gè)世代還是在后續(xù)世代(由?dwelling?標(biāo)志確定)上調(diào)用,將重置群體適應(yīng)度值,并創(chuàng)建隨機(jī)群,或者粒子將移動(dòng)到新坐標(biāo)。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_PSO::Preparation ()
{
?if (!dwelling)
?{
? ?ffB = -DBL_MAX;
? ?GenerateRNDparticles ();
? ?dwelling = true;
?}
?else ParticleMovement ();
}
//——————————————————————————————————————————————————————————————————————————————
在?GenerateRNDparticles ()?方法中隨機(jī)生成群體種群。 粒子在為每個(gè)它們指定的范圍內(nèi)具有隨機(jī)坐標(biāo),并且每個(gè)坐標(biāo)擁有隨機(jī)速度。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_PSO::GenerateRNDparticles ()
{
?for (int s = 0; s < swarmSize; s++)
?{
? ?for (int k = 0; k < parameters; k++)
? ?{
? ? ?p [s].c ?[k] = RNDfromCI (rangeMin [k], rangeMax [k]);
? ? ?p [s].c ?[k] = SeInDiSp (p [s].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
? ? ?p [s].cB [k] = p [s].c [k];
? ? ?p [s].v ?[k] = RNDfromCI (0.0, (rangeMax [k] - rangeMin [k]) * 0.5);
? ?}
?}
}
//——————————————————————————————————————————————————————————————————————————————
ParticleMovement()?方法觸發(fā)將粒子移動(dòng)到新位置的算法。 為達(dá)此目的,有必要根據(jù)上述公式計(jì)算每個(gè)坐標(biāo)的速度。 我不知道為什么使用術(shù)語“速率(velocity)”,因?yàn)樗旧鲜且粋€(gè)位移值,或者換句話說,粒子此刻的位置和它應(yīng)該移動(dòng)的位置之間的差異。 計(jì)算出每個(gè)坐標(biāo)的差值后,我們只需把當(dāng)前值相加即可。 之后,檢查在給定步驟中超出優(yōu)化參數(shù)的最小/最大邊界(對(duì)于粒子,這些是坐標(biāo))是否不可接受。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_PSO::ParticleMovement ()
{
?double rp; ? ? ? //random component of particle movement
?double rg;
?double velocity;
?double posit;
?double positBest;
?double groupBest;
?for (int i = 0; i < swarmSize; i++)
?{
? ?for (int k = 0; k < parameters; k++)
? ?{
? ? ?rp = RNDfromCI (0.0, 1.0);
? ? ?rg = RNDfromCI (0.0, 1.0);
? ? ?
? ? ?velocity ?= p [i].v ?[k];
? ? ?posit ? ? = p [i].c ?[k];
? ? ?positBest = p [i].cB [k];
? ? ?groupBest = cB [k];
? ? ?p [i].v [k] = inertia * velocity + selfBoost * rp * (positBest - posit) + groupBoost * rg * (groupBest - posit);
? ? ?p [i].c [k] = posit + p [i].v [k];
? ? ?p [i].c [k] = SeInDiSp (p [i].c [k], rangeMin [k], rangeMax [k], rangeStep [k]);
? ?}
?}
}
//——————————————————————————————————————————————————————————————————————————————
Dwelling ()?方法是優(yōu)化(Method_АО_2) 算法的第三個(gè)公開方法。 該方法的目的是更新每個(gè)粒子相對(duì)于其先前性能的最佳坐標(biāo)和適應(yīng)度值,并在必要時(shí)更新群體的適應(yīng)度,和群的最佳坐標(biāo)。 在迭代循環(huán)中獲取適應(yīng)度值后,調(diào)用該方法。
//——————————————————————————————————————————————————————————————————————————————
void C_AO_PSO::Dwelling ()
{
?for (int i = 0; i < swarmSize; i++)
?{
? ?//remember the best position for the particle
? ?if (p [i].ff > p [i].ffB)
? ?{
? ? ?p [i].ffB = p [i].ff;
? ? ?for (int k = 0; k < parameters; k++) p [i].cB [k] = p [i].c [k];
? ?}
? ?if (p [i].ff > ffB)
? ?{
? ? ?ffB = p [i].ff;
? ? ?for (int k = 0; k < parameters; k++) cB [k] = p [i].c [k];
? ?}
?}
}
//——————————————————————————————————————————————————————————————————————————————
該函數(shù)在指定范圍內(nèi)依據(jù)給定步長離散化 “雙精度” 數(shù)字。
//——————————————————————————————————————————————————————————————————————————————
// Choice in discrete space
double C_AO_PSO::SeInDiSp (double in, double inMin, double inMax, double step)
{
?if (in <= inMin) return (inMin);
?if (in >= inMax) return (inMax);
?if (step == 0.0) return (in);
?else return (inMin + step * (double)MathRound ((in - inMin) / step));
}
//——————————————————————————————————————————————————————————————————————————————
該函數(shù)獲取指定范圍內(nèi)的隨機(jī) “雙精度” 數(shù)字。
//——————————————————————————————————————————————————————————————————————————————
// Random number generator in the custom interval
double C_AO_PSO::RNDfromCI (double min, double max)
{
?if (min == max) return (min);
?double Min, Max;
?if (min > max)
?{
? ?Min = max;
? ?Max = min;
?}
?else
?{
? ?Min = min;
? ?Max = max;
?}
?return (double(Min + ((Max - Min) * (double)MathRand () / 32767.0)));
}
//——————————————————————————————————————————————————————————————————————————————
理論結(jié)束了。 我們赫茲量化交易軟件開始實(shí)踐。
由于我采用了與圖例 2 中描述的本系列的第一篇文章(我將在未來繼續(xù)這樣做)相同的結(jié)構(gòu)來構(gòu)建算法,因此我們將算法連接到測(cè)試臺(tái)并不困難。
當(dāng)在測(cè)試臺(tái)運(yùn)行時(shí),我們將看到類似于下面顯示的動(dòng)畫。 在這種情況下,我們可以清楚地看到一群粒子的行為。 群體行為真的很像自然界中的群體。 在函數(shù)的熱圖上,它以密集云的形式移動(dòng)。
您可能還記得,黑色圓圈表示函數(shù)的全局最優(yōu)值(最大值),而黑點(diǎn)表示在當(dāng)前迭代時(shí)獲得的搜索算法的最佳平均坐標(biāo)。 我解釋一下平均值的來源。 熱圖在坐標(biāo)上是二維的,正在優(yōu)化的函數(shù)可以包含數(shù)百個(gè)變量(測(cè)量值)。 故此,結(jié)果按坐標(biāo)取平均值。

基于?Skin?測(cè)試函數(shù)的 PSO

基于?Forest?測(cè)試函數(shù)的?PSO。

基于?Megacity?測(cè)試函數(shù)的?PSO。
正如您在動(dòng)畫中看到的,測(cè)試表明 PSO 可以很好地應(yīng)對(duì)平滑的第一個(gè)函數(shù),但僅在優(yōu)化兩個(gè)變量的時(shí)候。 隨著搜索空間維度的增加,算法的效率急劇下降。 這在第二個(gè)和第三個(gè)離散函數(shù)上尤其明顯。 結(jié)果明顯比上一篇文章中描述的隨機(jī)算法更差。 我們將回到結(jié)果,并在形成結(jié)果比較表格時(shí)詳細(xì)討論它們。
看著著名的 PSO 算法如何慘敗于隨機(jī)算法,人們可能想給該算法第二次機(jī)會(huì)。 在下一節(jié)中,我將嘗試修改 PSO 算法。
4. 修訂版
在我看來,PSO 的弱點(diǎn)是:
1) 每個(gè)坐標(biāo)必然會(huì)變化的概率幾乎等于 1。 這意味著群體中的每個(gè)粒子在每次迭代中充其量只是在全局區(qū)域的局部極值的某個(gè)地方振蕩,而在最壞的情況下,它永遠(yuǎn)不會(huì)準(zhǔn)確地達(dá)到全局極值的點(diǎn)。 這意味著算法的一個(gè)特征 — 在局部極值處卡頓,即收斂性差。
2) 該算法不能很好地處理離散函數(shù),部分是源于第一個(gè)缺陷。 粒子坐標(biāo)跳到正在優(yōu)化的函數(shù)表面的最近“區(qū)域”,故無法詳細(xì)研究任何局部極值的鄰域。
3) 算法探索新領(lǐng)域的能力較弱。 群體集中在一個(gè)地方的某處,而不會(huì)試圖逃離局部的“洞”。 一些作者提到嘗試創(chuàng)建多群體修改實(shí)現(xiàn),但優(yōu)化復(fù)雜多變量函數(shù)的問題仍然懸而未決,由于相互距離的原理尚不清楚,因?yàn)椴粌H必須滿足聯(lián)動(dòng)的原理,而且還必須滿足相互排斥的可能性。 否則,這樣的實(shí)現(xiàn)就沒有意義了,因?yàn)閱蝹€(gè)群體終將簡單地匯聚在一個(gè)區(qū)域或點(diǎn)上。 與此同時(shí),簡單的一個(gè)、或雙變量函數(shù)的優(yōu)化是通過收斂性極佳的最簡單的方法進(jìn)行的。
那么,我們可以做些什么來改進(jìn)算法呢?
很明顯(盡管不一定是真的),我們需要將來自其它粒子的最好單個(gè)坐標(biāo)傳遞給粒子。 “供體”粒子的整體坐標(biāo)越好,通過坐標(biāo)的概率就越大。 選擇粒子的概率偏移如圖例 4 所示。 我們生成一個(gè)從 0 到 1 的隨機(jī)數(shù),用拋物線函數(shù)轉(zhuǎn)換結(jié)果數(shù)字,然后將其縮放到群體中粒子序列號(hào)的范圍,從 0 到 SwarmSize-1。 為此,我們需要為 PSOm(修改后的算法)引入一個(gè)附加參數(shù) — 復(fù)制坐標(biāo)的概率,我們還需要對(duì)群體進(jìn)行排序,以便粒子越好,越接近索引 0。