注:該算法已按照智能優化算法APP標準格式進行整改,可直接集成到APP中,方便大家與自己的算法進行對比。(近期智能優化算法APP將會迎來超級大更新!請時刻保持關注哦!)
向光生長算法(Phototropic Growth Algorithm, PGA)是一種受到植物向光性生長機制啟發的智能優化方法。在自然界中,植物依靠體內生長素的分布調節,主動朝向光源生長,以最大化光合作用效率,展現出令人驚嘆的環境適應能力。科研人員正是借助這一生物行為特征,提出了PGA算法,模擬植物在光照引導下的三大關鍵策略:趨光性定向生長、自適應分枝調節機制,以及在資源受限環境中的探索式延展過程。這些策略被巧妙抽象為數學模型,有效融合全局探索與局部開發能力,使 PGA 在求解復雜、多約束優化問題中展現出卓越的解質量。
該成果于2025年7月最新發表在計算機領域一區期刊Knowledge-Based Systems上,具有出色的應用前景。

為了在多變的環境條件下實現最優生長和發育,植物進化出多種機制,其中之一即為向光性。向光性是指植物對光源發生趨向或背離的定向生長反應。該響應對于植物適應光照變化、最大化光合作用至關重要。向光性涉及多個生理過程,主要包括細胞分裂和細胞伸長的變化。下圖所示的有絲分裂過程在向光性中起著關鍵作用,它通過產生能夠朝向光源伸長的新細胞來實現定向生長。有絲分裂是指細胞分裂為兩個完全相同的子細胞的過程。

細胞伸長是植物生長與發育中的另一個關鍵過程。當光線照射植物的一側時,生長素會在陰影一側積聚,從而使該區域的細胞比光照區域的細胞伸長得更快。由此,陰影區域生長更快,導致植物向著光源方向彎曲。下圖展示了細胞伸長的過程,其中陰影區域的細胞更快地伸長,使植物向光傾斜。

1 算法原理詳解
(1)初始化
該算法首先初始化一個由細胞組成的種群,記作集合?,這些細胞也被視為搜索代理。在算法中,光照對細胞行為的影響具有核心地位。因此,種群被劃分為兩個區域:光照區域和陰影區域,分別表示接受良好光照的細胞與處于遮蔽位置的細胞。處于光照區域的細胞數量由區間內的一個隨機值控制,?與為該比例的上下限。該值通過公式生成,其中是在范圍內均勻分布的隨機變量。此設定確保在整體種群?中所占比例合理受限于指定區間。
為了將該比例轉換為具體的細胞數量,需要將其乘以總種群規模?。然而,該操作可能產生一個小數,而當??表示具體細胞數時,小數并無實際意義。因此,引入下取整函數以將結果向下取整至最接近的整數。計算??的最終公式如下所示:
在確定??之后,算法繼續將解集合??中的前??個個體指定為處于光照區域的細胞(記為?)。該子集的數學表示如下:
陰影區域的細胞數量??等于總細胞數??減去光照區域細胞數?,其表達式為:
陰影區域的細胞集合??是解集??的子集,可定義為:
(2)光照區細胞的有絲分裂
為了對有絲分裂過程進行數學建模,種群中的每個細胞都會分裂成兩個子細胞,這一母細胞分裂成兩個子細胞的現象稱為有絲分裂。變異算子是生成子細胞多樣性的關鍵組成部分。該算子應用于第一個復制體,并相對于從種群中隨機選取的細胞進行計算。通過隨機選擇細胞的方法,此方法準確模擬了由于輻射或化學物質等環境因素引起的變異的隨機性,保證變異算子具有廣泛的可能結果:
在許多生物系統中,生長和適應速率在初期通常較為強勁,但隨著時間推移逐漸減弱。例如,細胞生物學表明,細胞在早期階段經歷快速生長和分裂,但隨著成熟臨近,這種迅猛的增長速度會減緩,這通常歸因于資源限制、環境壓力以及細胞的內在老化過程。受此啟發,算法采用指數衰減函數𝛼來模擬這一自然演變過程。此行為的數學表達見以下公式:
此方程基于指數衰減函數的標準形式推導而來,通常表示為:
其中,𝐴為初始值,𝑘為衰減常數,𝑡為時間。
基因突變中的內在隨機性體現了自然界的適應策略。盡管突變遵循一定模式,但其不可預測性確保了物種能夠應對未知挑戰。算法中的𝑟2和𝑟3項即反映了這種生物隨機性。定義為?,其取值范圍為?1到1,允許突變既可增強也可減弱,體現了突變的雙重特性:部分有益于生存,部分則可能有害。為更好理解,考慮有絲分裂的生物學表達:
變異項是引入多樣性的重要組成部分,其數學表達式為:
針對光照區域細胞的變異算子?是所提優化算法的重要組成部分。它模擬了變異的隨機性和多樣性,保證了解空間的廣泛多樣性。引入隨機變異因子?和生長限制因子?,使得變異算子在不同環境條件下表現出強大的魯棒性和適應性。
為了數學地描述這一行為,生長素重分布算子計算當前光照細胞相對于最佳光照細胞的位移,記作?。該位移通過當前細胞與最佳光照細胞的位置差進行建模,并乘以代表生長素影響和光照強度的調節因子。基于新細胞位置?受當前細胞?與最佳光照細胞?之間差異影響的基本假設,可表示為:
然而,這一位置差異?需要通過若干因子進行調節,以體現生長素的影響及生物過程中的內在隨機性。生長限制因子?代表生長素的作用,而?引入了隨機成分,反映了生物過程中的不確定性。結合這些因子后,調節后的位置偏移可表示為:
最后,新細胞的位置?由當前位置與經過調節的位移相加得到:
為了確定?,可以借鑒之前定義的隨機變量?和?。由于它們被定義為?,使其取值范圍在?之間,?也可類似定義為:
該取值范圍使該算子能夠同時考慮正向和負向的變化,模擬植物細胞中生長素的雙向調控作用。該公式雖具數學結構性,但實質體現了自然界“適應與優化”的核心策略。考慮到細胞隨著成熟對生長變化的敏感度降低,通過逐漸減小的生長限制因子?體現,隨著時間推移,?下降,從而限制了允許的生長變化幅度。這種設計能夠模擬細胞過程中的內在隨機性,更真實地反映細胞對光照的響應行為。
(3)陰影區域細胞的有絲分裂
本節介紹了用于更新陰影區域細胞?的兩種主要變異算子。該類變異算子的目標是模擬植物在生長和發育過程中,因環境因素而產生的變化。變異算子:作用于第一份有絲分裂副本。用于更新?的第一變異算子形式上與?的更新公式類似,這是因為陰影區域細胞的變異主要歸因于遺傳因素。該變異算子的更新公式如下所示:
此處,??的計算方式與類似。該算子的整體作用在于引入獨立于物理條件的陰影區細胞變異。生長素重分布算子是用于更新值的第二種突變算子。該算子通過模擬光照條件差異下生長素從光照細胞向陰影細胞的再分配過程,推動陰影細胞的生長,從而使植物向光彎曲。根據當前最優光照細胞來計算該變化量,變化量通過隨機突變因子進行縮放以模擬隨機變化,同時通過生長限制因子?控制允許的生長變化幅度。生長素重分布算子的更新公式如下所示:
其中,??是一個在區間??之間的隨機數。由上述兩種突變算子生成的新細胞將被追加到當前解集(即?)中。隨后,根據適應度值對所有解進行評估,并剔除最差的解。該機制確保了解集的規模保持不變,且僅保留適應度最高的細胞參與后續進化過程。
在算法的第二階段,考慮了生長素對細胞伸長的影響。生長素是一類植物激素,參與調控植物體內多種生長與發育過程,尤其在細胞沿植物軸向方向的生長調控中發揮著關鍵作用。當植物暴露于不均勻的光照條件下時,生長素的分布將出現差異化。結果是,處于陰影區域的細胞比位于光照區域的細胞具有更高濃度的生長素。陰影區細胞中較高的生長素濃度會導致其細胞伸長程度大于光照區的細胞,從而使植物莖尖朝向光源發生彎曲。這一適應機制對于植物最大化光照利用、促進生長與生存具有重要意義。在細胞伸長階段,算法引入了細胞的彎曲現象及其彎曲因子,以模擬細胞在搜索空間中的運動行為。
在彎曲度的計算中,優先考慮光照區域的細胞。植物細胞的彎曲度可通過公式進行計算:
其中,??是一個自適應參數,用于在算法初期支持搜索空間的探索行為,在后期則促進對最優解的開發(利用);??是方向切換系數,賦予了移動過程中的靈活性,模擬了現實世界中的變異性。
彎曲因子受光照強度的影響。在求解實際優化問題時,本文所提出的算法將當前最優適應度解視為光源,所有細胞會趨向該最優解發生彎曲。彎曲因子(?)的計算方式如公式所示:
其中,??是一個位于區間 (?1, 1) 內的隨機數。術語??確保每個細胞朝著當前最優解的方向移動,從而模擬植物的向光彎曲響應;同時,隨機數??引入了受控的隨機性。
除了曲率因子之外,細胞鄰域在決定細胞伸長的程度上也起著關鍵作用。一個細胞是否處于光照區或陰影區,可以通過其周圍的細胞來推斷。從物理上看,陰影區的細胞往往彼此靠近,而光照區的細胞則相對分散。細胞鄰域項考慮了相鄰細胞的影響,并通過因子??進行縮放,以限制成熟細胞隨時間發生的變化幅度;同時通過??體現細胞在感知生長素過程中的隨機性。細胞鄰域的計算公式如下所示:
其中,??是一個取值范圍在??內的隨機數。因此,每個細胞在“細胞伸長階段”的更新公式如下所示:
PGA優化算法的流程圖如下所示:

2 結果展示
3、MATLAB核心代碼
3、MATLAB核心代碼
%% 淘個代碼 %%
% 微信公眾號搜索:淘個代碼,獲取更多代碼
% 向光生長算法(Phototropic Growth Algorithm, PGA)
function?[Fbest,Xbest,CNVG]=PGA(N,T,lb,ub,dim,fobj,nn)
% initialise the best cell
Fbest=inf;
vec_flag=[1,-1];
Nl=round((0.2*rand+0.4)*N);%eq.(2&3)
%Initialise the plant cells
X=initialization(N,dim,ub,lb);
for?i=1:Nfitness(i)=feval(fobj,X(i,:)',nn);
end
[GYbest, gbest] = min(fitness);
Xbest= X(gbest,:);
Ns=N-Nl;
Xs=X(1:Ns,:);
Xl=X(Ns+1:N,:);% Initialisng fitness variables
fitness_s=fitness(1:Ns);
fitness_l=fitness(Ns+1:N);[fitnessBest_s, gbest1] = min(fitness_s);
Xbest_s = Xs(gbest1,:);[fitnessBest_l, gbest2] = min(fitness_l);
Xbest_l = Xl(gbest2,:);Curvaure=1;
% ConcS=Curvaure*(mean(Xs)./Xbest_s).*(mean(fitness_s)/fitnessBest_s);
% ConcL=Curvaure*(mean(Xl)./Xbest_l).*(mean(fitness_l)/fitnessBest_l);t=0; % Loop counterwhile t<Talpha = exp(-1*t/T); % eq(5)for i=1:size(Xs,1)FU=Xs(i,:)>ub;FL=Xs(i,:)<lb;Xs(i,:)=(Xs(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;fitness_s(i) = feval(fobj,Xs(i,:)',nn);if?fitness_s(i)<fitnessBest_sfitnessBest_s=fitness_s(i);Xbest_s=Xs(i,:);endendfor?i=1:size(Xl,1)FU=Xl(i,:)>ub;FL=Xl(i,:)<lb;Xl(i,:)=(Xl(i,:).*(~(FU+FL)))+ub.*FU+lb.*FL;fitness_l(i) = feval(fobj,Xl(i,:)',nn);if fitness_l(i)<fitnessBest_lfitnessBest_l=fitness_l(i);Xbest_l=Xl(i,:);endendflag_index = floor(2*rand()+1);beta=vec_flag(flag_index);Curvaure=beta*(alpha-mean(fitness_s)/Fbest); %Eq(17)for i=1:size(Xl,1)r2=2*rand(1,dim)-1;r3=2*rand(1,dim)-1;r4=2*rand(1,dim)-1;dd=randi([1,N]);flag_index = floor(2*rand()+1);beta=vec_flag(flag_index);Xlnew1(1,:)=X(dd,:)+beta*alpha.*r2.*abs(X(dd,:)-Xl(i,:))+beta*alpha.*r3.*abs(Xbest_l-Xl(i,:));%Eq(9)Xlnew1(2,:)=Xl(i,:)+alpha.*r4.*abs(Xbest_l-Xl(i,:));%Eq(13)for j=1:2Tp=Xlnew1(j,:)>ub;Tm=Xlnew1(j,:)<lb;Xlnew1(j,:)=(Xlnew1(j,:).*(~(Tp+Tm)))+ub.*Tp+lb.*Tm;fitness_lNew(j)=feval(fobj, Xlnew1(j,:)',nn);endXl=[Xl; Xlnew1];fitness_l=[fitness_l fitness_lNew];endfor?i=1:size(Xs,1)r=2*rand(1,dim)-1;flag_index = floor(2*rand()+1);beta=vec_flag(flag_index);Xsnew1(1,:)=Xs(i,:)+beta*alpha.*r.*abs(Xs(i,:)-X(randi([1,N]),:));% Eq(15)Xsnew1(2,:)=Xl(randi(Ns),:)+beta*alpha.*r.*(Xbest_l-Xs(i,:));%% Eq(16)for?j=1:2Tp=Xsnew1(j,:)>ub;Tm=Xsnew1(j,:)<lb;Xsnew1(j,:)=(Xsnew1(j,:).*(~(Tp+Tm)))+ub.*Tp+lb.*Tm;fitness_sNew(j)=feval(fobj, Xsnew1(j,:)',nn);endXs=[Xs; Xsnew1];fitness_s=[fitness_s fitness_sNew];end[fitness_s, SortOrder]=sort(fitness_s);Xs=Xs(SortOrder,:);[fitnessBest_s,Sbest]=min(fitness_s);Xbest_s=Xs(Sbest,:);Xs=Xs(1:Ns,:);fitness_s=fitness_s(1:Ns);[fitness_l, SortOrder]=sort(fitness_l);Xl=Xl(SortOrder,:);[fitnessBest_l,lbest]=min(fitness_l);Xbest_l=Xl(lbest,:);Xl=Xl(1:Nl,:);fitness_l=fitness_l(1:Nl);if fitnessBest_l<FbestFbest=fitnessBest_l;Xbest=Xbest_l;elseif fitnessBest_s<FbestFbest=fitnessBest_s;Xbest=Xbest_s;endX=[Xs;Xl];fitall=[fitness_s fitness_l];for i=1:Nr=2*rand(1,dim)-1;flag_index = floor(2*rand()+1);beta=vec_flag(flag_index);FOC=r.*(Curvaure.*X(i,:)-Xbest); ?%eq(18)Cell_vicinity=beta*alpha.*r.*(X(i,:)+X(i+1,:))/2; ? %eq(19)Xnew(1,:)=X(i,:)+FOC+Cell_vicinity; ?%eq(20)for j=1:1Tp=Xnew(j,:)>ub;Tm=Xnew(j,:)<lb;Xnew(j,:)=(Xnew(j,:).*(~(Tp+Tm)))+ub.*Tp+lb.*Tm;fitnessn(j)=feval(fobj, Xnew(j,:)',nn);endX=[X; Xnew];fitall=[fitall fitnessn];end[fitall, SortOrder]=sort(fitall);X=X(SortOrder,:);[Fbest,best]=min(fitall);Xbest=X(best,:);X=X(1:N,:);Nl=N-Ns;Xs=X(1:Ns,:);Xl=X(Ns+1:N,:);fitness_s=fitness(1:Ns);fitness_l=fitness(Ns+1:N);[fitnessBest_s, gbest1] = min(fitness_s);Xbest_s = Xs(gbest1,:);[fitnessBest_l, gbest2] = min(fitness_l);Xbest_l = Xl(gbest2,:);% ? ? Update iteration countert=t+1;CNVG(t)=Fbest;endend
參考文獻
[1]?Bohat V K, Hashim F A, Batra H, et al. Phototropic growth algorithm: A novel metaheuristic inspired from phototropic growth of plants[J]. Knowledge-Based Systems, 2025, 322: 113548.
完整代碼獲取
后臺回復關鍵詞:
TGDM869
獲取更多代碼:
或者復制鏈接跳轉:https://docs.qq.com/sheet/DU3NjYkF5TWdFUnpu