中华穿山甲优化( Chinese Pangolin Optimizer ,CPO)算法由GUO Zhiqing 等人提出,该算法的灵感来自中华穿山甲独特的狩猎行为,包括引诱和捕食行为。
算法流程如下:
1. 开始
设置算法参数和最大迭代次数:初始化算法所需的参数和最大迭代次数。
计算适应度值并更新初始化:计算初始种群的适应度值,并更新穿山甲的位置 λM 和蚂蚁的位置 XA。
更新当前种群位置和最优个体位置:更新当前种群的位置和最优个体的位置。
2. 迭代过程
2.1 判断是否达到最大迭代次数
如果当前迭代次数 t 小于最大迭代次数 tmax,则继续迭代;否则,输出穿山甲的新位置 λMnew 及其适应度值,并结束算法。
2.2 计算香气浓度 CM
使用公式 (9) 到 (14) 计算香气浓度 CM。
2.3 计算快速下降因子 C1
使用公式 (28) 计算快速下降因子 C1。
2.4 计算能量消耗因子 E
使用公式 (24) 计算能量消耗因子 E。
2.5 计算能量波动因子 A1
使用公式 (23) 计算能量波动因子 A1。
2.6 计算疲劳指数因子 Fatigue
使用公式 (25) 计算疲劳指数因子 Fatigue。
2.7 计算 Levy 飞行函数步长 Llevy
使用公式 (29) 和 (30) 计算 Levy 飞行函数的步长 Llevy。
2.8 计算香气轨迹因子 a
使用公式 (21) 和 (22) 计算香气轨迹因子 a。
2.9 根据香气浓度 CM 的不同范围进行不同的操作
2.9.1 如果 CM≥0.2
计算位置 XA:使用公式 (19) 和 (20) 计算蚂蚁的位置 XA。
计算穿山甲的位置 λM:使用公式 (26) 和 (27) 计算穿山甲的位置 λM。
更新最优位置 X∗:使用公式 (31) 更新最优位置 X∗。
计算适应度值并检查边界:计算新的适应度值并检查是否超出边界。
判断是否是最优的穿山甲位置:如果是,则更新迭代次数 t=t+1,继续迭代;否则,直接更新迭代次数 t=t+1。
2.9.2 如果 0≤CM<0.3
搜索和定位阶段:使用公式 (32) 和 (33) 计算穿山甲的位置 λM。
更新最优位置 X∗:使用公式 (38) 更新最优位置 X∗。
计算适应度值并检查边界:计算新的适应度值并检查是否超出边界。
判断是否是最优的穿山甲位置:如果是,则更新迭代次数 t=t+1,继续迭代;否则,直接更新迭代次数 t=t+1。
2.9.3 如果 0.3≤CM<0.6
快速接近阶段:使用公式 (34) 和 (35) 计算穿山甲的位置 λM。
更新最优位置 X∗:使用公式 (38) 更新最优位置 X∗。
计算适应度值并检查边界:计算新的适应度值并检查是否超出边界。
判断是否是最优的穿山甲位置:如果是,则更新迭代次数 t=t+1,继续迭代;否则,直接更新迭代次数 t=t+1。
2.9.4 如果 CM≥0.6
挖掘和进食阶段:使用公式 (36) 和 (37) 计算穿山甲的位置 λM。
更新最优位置 X∗:使用公式 (38) 更新最优位置 X∗。
计算适应度值并检查边界:计算新的适应度值并检查是否超出边界。
判断是否是最优的穿山甲位置:如果是,则更新迭代次数 t=t+1,继续迭代;否则,直接更新迭代次数 t=t+1。
3. 结束
输出穿山甲的新位置 λMnew 及其适应度值:当达到最大迭代次数时,输出最终的穿山甲位置及其适应度值,算法结束。
参考文献:
[1]Zhiqing GUO, Guangwei LIU, and Feng JIANG, Chinese Pangolin Optimizer: A novel bio-inspired metaheuristic for solving optimization problems
二、23个函数介绍
参考文献:
[1] Yao X, Liu Y, Lin G M. Evolutionary programming made faster[J]. IEEE transactions on evolutionary computation, 1999, 3(2):82-102.
三、部分代码及结果
SearchAgents_no = 100;
Max_iter = 1000;
fn=12;
Function_name=strcat('F',num2str(fn));
[lb,ub,dim,fobj]=Get_Functions_details(Function_name);
[Best_score,Best_pos,PO_cg_curve]=(SearchAgents_no,Max_iter,lb,ub,dim,fobj);
semilogy(PO_cg_curve,'LineWidth',2)
title(Function_name)
xlabel('迭代次数');
ylabel('适应度值');