智能优化算法:沙猫群算法—附代码

智能优化算法:沙猫群算法

摘要:沙猫群优化算法(Sand Cat Swarm Optimization,SCSO)是由Amir Seyyedabbasi和Farzad Kiani于2022年提出的一种新的元启发式算法,该算法是一种模仿自然界中沙猫生存行为的智能优化算法。

1.沙猫群优化算法基本原理

沙猫(Felis margarita)是哺乳动物科的一种猫科动物,生活在中亚撒哈拉、非洲撒哈拉、阿拉伯半岛等多沙多石沙漠的恶劣环境中。沙猫和家猫在外观上并没有太大区别,但小巧、敏捷、谦逊的沙猫在狩猎和生存方面与家猫有着不同的生活行为。沙猫不像许多猫科动物那样生活在一个群体中。沙猫的爪子和肉垫上覆盖有高密度沙色至浅灰色的皮毛,这些皮毛的覆盖可以抵御沙漠严酷的冷热天气,并且也让沙猫很难被捕食者发现和跟踪到。沙猫的体长约为45-57厘米,它的尾巴大约是头部和身体长度的一半(28-35厘米),腿短,前爪短而弯曲,后爪则细长一些且弯曲较弱。成年沙猫体重在1到3.5公斤之间,头部两侧的耳朵有5-7厘米长,沙猫的耳朵在觅食中起着相当大的作用。沙猫夜行、地下和隐蔽的天性使它非常特别。

动物在严酷恶劣的环境中很难寻找食物,沙猫在沙漠中也不例外。沙猫会在凉爽的夜晚寻找食物,白天躲在石头下休息,夜晚出去狩猎,沙猫大部分时间都在洞穴里度过,它们的姿势是仰卧以释放身体内的热量。为了克服口渴,它们从食物中提取水分,通常会吃自己体重10%左右的食物,但也可以吃得比平时多。雄性沙猫在夜间走得比雌性多,雄性和雌性猫的平均步行距离分别为 5.5 公里和 3.2 公里,冬天的步行平均值低于夏季。和猫科动物一样,沙猫也用爪子捕食,捕食小型沙漠啮齿动物、爬行动物、小鸟、刺鼠、昆虫和蛇。

沙猫的狩猎机制非常有趣,它们利用敏锐的听觉能力获得低频噪音,通过这种方式,沙猫可以发现在地下移动的猎物(昆虫和啮齿动物)。沙猫耳朵的耳廓凸缘(外耳)与家猫没有区别,但沙猫的耳道长度(中耳)比家猫长,中耳的空气空间很大,所以沙猫可以检测到不同声音之间到达时间的差异。猫耳朵的声输入导纳量与鼓膜有关,沙猫的鼓膜是家猫的5倍。此外,中耳腔和骨链会影响声输入导纳,科学研究表明,沙猫接收到低于 2 kHz频率的能力令人难以置信,在这个频率下,沙猫比家猫敏感约8 dB。这些独特的特征可能是沙猫检测噪音(猎物移动)、跟踪猎物并根据猎物位置成功攻击的原因。如果猎物在地下,沙猫也有一种神奇的快速挖掘能力。根据沙猫的行为,将觅食分为两个阶段:搜索和攻击猎物。本文提出的算法(SCSO)就包括了这两个阶段,此外,还提出了一种机制来实现探索和利用阶段的平衡。

沙猫群优化模拟了沙猫的两个主要行为:搜寻猎物和攻击猎物。

1.1 初始化

d d d 维优化问题中, 沙猫是一个 1 × d 1 \times d 1×d 维的表示问题解的数组, 定义如下:
Sand C a t i = [ x 1 , x 2 , … , x d ] ; i ∈ \mathrm{Cat}_{\mathrm{i}}=\left[\mathrm{x}_1, \mathrm{x}_2, \ldots, \mathrm{x}_{\mathrm{d}}\right] ; i \in Cati=[x1,x2,,xd];i population ( 1 , n ) (1, n) (1,n) (1)
式中: 每个变量值 x 1 , x 2 , … , x d \mathrm{x}_1, \mathrm{x}_2, \ldots, \mathrm{x}_{\mathrm{d}} x1,x2,,xd 是浮点数; 这里每个 x \mathrm{x} x 必须位于上下边界之间 ∀ x i ∈ [ \forall x_i \in[ xi[ lower, upper ] ] ]
S C S O S C S O SCSO 算法运行时, 首先, 根据问题的大小 ( N p o p × N d ) , ( p o p = 1 , … , n ) \left(N_{p o p} \times N_d\right),(p o p=1, \ldots, n) (Npop×Nd),(pop=1,,n), 用沙猫种群创建一 个初始化矩阵:
 Sand  C a t i = [ X 1 ⋮ X i ⋮ X n ] n × d = [ x 11 ⋯ x 1 j ⋯ x 1 d ⋮ ⋱ ⋮ ⋮ x i 1 ⋯ x i j ⋯ x i d ⋮ ⋮ ⋱ ⋮ x n 1 ⋯ x n j ⋯ x n d ] n × d (2) \text { Sand } \mathrm{Cat}_{\mathrm{i}}=\left[\begin{array}{c} X_1 \\ \vdots \\ X_i \\ \vdots \\ X_n \end{array}\right]_{n \times d}=\left[\begin{array}{ccccc} x_{11} & \cdots & x_{1 j} & \cdots & x_{1 d} \\ \vdots & \ddots & \vdots & & \vdots \\ x_{i 1} & \cdots & x_{i j} & \cdots & x_{i d} \\ \vdots & & \vdots & \ddots & \vdots \\ x_{n 1} & \cdots & x_{n j} & \cdots & x_{n d} \end{array}\right]_{n \times d}\tag{2}  Sand Cati=X1XiXnn×d=x11xi1xn1x1jxijxnjx1dxidxndn×d(2)
式中: Sand Cat in i _{\mathrm{i}} i 沙猫群的种群矩阵; X i X_i Xi 为第 i \mathrm{i} i 个沙猫群; x i , j x_{i, j} xi,j 为第 i \mathrm{i} i 个种群的维度。
每只沙猫的适应度成本是通过对定义的适应度函数的评估得到的, 该函数定义了问题的 相关参数, SCSO 会得到参数 (变量) 的最佳值。每只沙猫都会输出对应函数的值, 当一次 迭代完成时, 选择迄今为止在该迭代中具有最佳成本的沙猫, 最好的解决方案 (如果在之前 的迭代中没有这么好的答案)和其他沙猫在下一次迭代中, 试着朝这个最好的方向移动。每 次迭代中的最佳解可以代表离猎物最近的猫, 如果在下一次迭代中没有找到更好的解决方 案, 则该迭代的解决方案不会不必要地存储在内存中, 这确保了内存的有效使用。图 1 所 示的过程发生在每次迭代中。沙猫群种群的适应度函数为:
Fitness = f ( =f( =f( Sand Cat ) = f ( x 1 , x 2 , … , x d ) ; ∀ x i )=f\left(\mathrm{x}_1, \mathrm{x}_2, \ldots, \mathrm{x}_{\mathrm{d}}\right) ; \forall \mathrm{x}_i )=f(x1,x2,,xd);xi (is calculated for n n n time ) ) )
 Fitness  = [ F 1 ⋮ F i ⋮ F n ] n × 1 = [ f ( x 11 , x 12 , ⋯ x 1 d ) ⋮ f ( x 1 , x i 2 , ⋯ x i d ) ⋮ f ( x n 1 , x n 2 , ⋯ x n d ) ] n × 1 (3) \text { Fitness }=\left[\begin{array}{c} F_1 \\ \vdots \\ F_i \\ \vdots \\ F_n \end{array}\right]_{n \times 1}=\left[\begin{array}{c} f\left(x_{11}, x_{12}, \cdots x_{1 d}\right) \\ \vdots \\ f\left(x_1, x_{i 2}, \cdots x_{i d}\right) \\ \vdots \\ f\left(x_{n 1}, x_{n 2}, \cdots x_{n d}\right) \end{array}\right]_{n \times 1} \tag{3}  Fitness =F1FiFnn×1=f(x11,x12,x1d)f(x1,xi2,xid)f(xn1,xn2,xnd)n×1(3)
式中: Fitness 为沙猫群的适应度函数。

1.2 搜索猎物( 探索)

沙猫的猎物 搜索机制依赖于低频噪声发射。每只沙猫的解表达为 X i = ( x i 1 , x i 2 , x i 3 , … , x i d ) X_i=\left(x_{i 1}, x_{i 2}, x_{i 3}, \ldots, x_{i d}\right) Xi=(xi1,xi2,xi3,,xid) 。SCSO 算法得益于沙丘猫在低频探测方面的听觉能力, 这样就声 明了每只猫的敏感范围, 前面提到, 沙丘猫可以感知低于 2 k H z 2 \mathrm{kHz} 2kHz 的低频, 在数学模型中, 根 据算法的工作原理, 这个值 r G r_G rG 将随着迭代过程的进行从 2 线性地降低为 0 , 以逐渐靠近猎 物而不会丢失或跳过。因此为了搜索猎物,假设沙猫的敏感范围为 2 k H z 2 \mathrm{kHz} 2kHz 到 0, S M S_M SM 模拟了沙 猫的听觉特性, 其假设为 2, 当然对于不同问题可以适当调整以确定代理行为的速度, 这证 明了所提出的方程的灵活性和多功能性。例如, 如果最大迭代次数为 100 , 则 r G r_G rG 的值将在 前 50 次迭代中大于 1, 在最后 50 次迭代中小于 1。上述数学模型定义如下:
r G → = s M − ( 2 × S M ×  iter  c iter ⁡ M a x ) (4) \overrightarrow{r_G}=s_M-\left(\frac{2 \times S_M \times \text { iter }_{\mathrm{c}}}{\operatorname{iter}_{\mathrm{Max}}}\right) \tag{4} rG =sM(iterMax2×SM× iter c)(4)
控制探索阶段和开发阶段之间转换的主要参数是 R, 由于这种自适应策略, 两个阶段的 转换和可能性将更加平衡, R R R 的定义如下:
R ⃗ = 2 × r G → × rand ⁡ ( 0 , 1 ) − r G → (5) \vec{R}=2 \times \overrightarrow{r_G} \times \operatorname{rand}(0,1)-\overrightarrow{r_G} \tag{5} R =2×rG ×rand(0,1)rG (5)
搜索空间在定义的边界之间随机初始化。在搜索步骤中, 每个当前搜索代理的位置更新 都是基于一个随机位置。这样, 搜索代理就能够在搜索空间中探索新的空间。为避免陷入局 部最优, 每只沙丘猫的灵敏度范围是不同的, 定义为:
r ⃗ = r G → × rand ⁡ ( 0 , 1 ) (6) \vec{r}=\overrightarrow{r_G} \times \operatorname{rand}(0,1) \tag{6} r =rG ×rand(0,1)(6)
式中: r G → \overrightarrow{r_G} rG 为从 2 线性下降到 0 的一般灵敏度范围, 而 r ⃗ \vec{r} r 是每只猫的灵敏度范围。此外, r ⃗ \vec{r} r 用 于探索或利用阶段的操作, 而 r G → \overrightarrow{r_G} rG 用于导引参数 R \mathrm{R} R 以实现在这些阶段间转移控制。
在 SCSO 算法中, 沙猫根据最优解、自己当前位置以及灵敏度范围来更新自己的位置, 搜索到其他可能的最好的猎物位置, 可以在新的搜索区域中找到新的局部最优, 获得的位置 位于当前位置和猎物位置之间, 同时随机性保证了算法的运行成本和复杂度低。对上述搜索 过程进行数学建模, 如下:
Pos ⁡ ∘ → ( t + 1 ) = r ⃗ ⋅ ( Pos ⁡ b c → ( t ) − rand ⁡ ( 0 , 1 ) ⋅ Pos ⁡ c → ( t ) ) (7) \overrightarrow{\operatorname{Pos}^{\circ}}(t+1)=\vec{r} \cdot\left(\overrightarrow{\operatorname{Pos}_{b c}}(t)-\operatorname{rand}(0,1) \cdot \overrightarrow{\operatorname{Pos}_c}(\mathrm{t})\right) \tag{7} Pos (t+1)=r (Posbc (t)rand(0,1)Posc (t))(7)
式中: P o s b c → \overrightarrow{P_{o s_{b c}}} Posbc 为最优解、 Pos ⁡ c \operatorname{Pos}_c Posc 为自己当前位置、 r ⃗ \vec{r} r 为灵敏度范围。

1.3攻击猎物(利用)

如前所述, 沙猫是根据耳朵的能力来检测猎物的。对 SCSO 算法的攻击阶段进行数学建 模, 表示最佳位置与当前位置之间的距离, 如下:
Pos ⁡ m d → = ∣ rand ⁡ ( 0 , 1 ) ⋅ Pos ⁡ b → ( t ) − Pos ⁡ c → ( t ) ∣ , Pos ⁡ → ( t + 1 ) = Pos ⁡ b → ( t ) − r ⃗ ⋅ Pos ⁡ m d → ⋅ cos ⁡ ( θ ) . (8) \begin{aligned} &\overrightarrow{\operatorname{Pos}_{\mathrm{md}}}=\left|\operatorname{rand}(0,1) \cdot \overrightarrow{\operatorname{Pos}_b}(t)-\overrightarrow{\operatorname{Pos}_c}(\mathrm{t})\right|, \\ &\overrightarrow{\operatorname{Pos}}(t+1)=\overrightarrow{\operatorname{Pos}_b}(t)-\vec{r} \cdot \overrightarrow{\operatorname{Pos}_{\mathrm{md}}} \cdot \cos (\theta) . \end{aligned}\tag{8} Posmd =rand(0,1)Posb (t)Posc (t),Pos (t+1)=Posb (t)r Posmd cos(θ).(8)
式中: Pos ⁡ b ‾ \overline{\operatorname{Pos}_b} Posb 为最佳位置(最佳解); Pos ⁡ c → \overrightarrow{\operatorname{Pos}_c} Posc 为当前位置; Pos ⁡ r n d ‾ \overline{\operatorname{Pos}_{\mathrm{rnd}}} Posrnd 为随机位置。 假设沙丘猫的灵敏度范围是一个圆, 这样移动的方向就可以通过圆上的一个随机角度 θ \theta θ 定, 当然, 在指定运动方向时, 公式 8 中声明的其他参数也是有效的。由于所选的随机角度 在 0 到 360 之间, 其值将在-1 到 1 之间。这样, 群体中的每个成员都能够在搜索空间中沿 着不同的圆周方向移动。SCSO 利用轮盘选择算法为每只沙丘猫选择一个随机角度, 这样沙 猫就可以接近狩猎位置。为避免陷入局部最优, SCSO 采用了随机角度, 公式 8 中的随机角 度将对沙猫的狩猎和引导产生积极作用, 随机位置 Pos rnd 可以确保涉及的猫可以靠近猎物。

1.4探索和利用

探索和利用是通过自适应的 r G r_G rG R R R 保证的。这些参数允许 SCSO 在两个阶段之间无缝切 换。由于参数 R R R 取决于 r G r_G rG, 因此其波动范围也会减小。如前所述, 当参数 r G r_G rG 的值以平衡的 方式分布时, R R R 值也会很好地平衡, 因此两个阶段之间的操作机会将根据问题进行适当的 调整。换句话说, R R R 是区间 [ − 2 r G , 2 r G ] \left[-2 r_G, 2 r_G\right] [2rG,2rG] 中的随机值, 其中 r G r_G rG 在迭代过程中从 2 线性下降到 0。当 R R R 的随机值在 [ − 1 , 1 ] [-1,1] [1,1] 时, 沙猫的下一个位置可以在其当前位置和狩猎位置之间的任何 位置。SCSO 算法在 R \mathrm{R} R 小于或等于 1 时强制搜索代理进行利用, 否则, 搜索代理将被迫探索 和寻找猎物。对上述过程进行数学建模, 如下:
X ⃗ ( t + 1 ) = { Pos ⁡ b ( t ) → − Pos ⁡ r n d → ⋅ cos ⁡ ( θ ) ⋅ r ⃗ ∣ R ∣ ≤ 1 ;  exploitation  r ⃗ ⋅ ( Pos ⁡ b c → ( t ) − rand ⁡ ( 0 , 1 ) ⋅ Pos ⁡ c → ( t ) ) ∣ R ∣ > 1 ;  exploration  (9) \vec{X}(t+1)=\left\{\begin{array}{cc} \overrightarrow{\operatorname{Pos}_b(t)}-\overrightarrow{\operatorname{Pos}_{r n d}} \cdot \cos (\theta) \cdot \vec{r} & |R| \leq 1 ; \text { exploitation } \\ \vec{r} \cdot\left(\overrightarrow{\operatorname{Pos}_{b c}}(t)-\operatorname{rand}(0,1) \cdot \overrightarrow{\operatorname{Pos}_c}(\mathrm{t})\right) & |R|>1 ; \text { exploration } \end{array}\right.\tag{9} X (t+1)=Posb(t) Posrnd cos(θ)r r (Posbc (t)rand(0,1)Posc (t))R1; exploitation R>1; exploration (9)
在寻找猎物阶段 (探索) 时, 每只猫的不同半径避免了局部最优陷阱。此功能也是攻击 猎物(利用)的有效参数之一。公式 9 表示了每只沙猫在探索和开发阶段的位置更新。 当 R ≤ 1 R \leq 1 R1 时, 沙猫被引导攻击它们的猎物, 否则, 沙猫的任务是在全局区域寻找新 的可能解决方案。所提出算法的平衡行为以及在全局空间中寻找其他可能的局部区域的努力 具有快速准确的收玫速度, 因此在高维和多目标问题中表现良好是有用的。

请添加图片描述

3.实验结果

请添加图片描述

4.参考文献

[1] Seyyedabbasi A , Kiani F . Sand Cat swarm optimization: a nature-inspired algorithm to solve global optimization problems[J]. Engineering with Computers, 2022:1-25.

5.Matlab代码

  • 7
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
智能优化算法是一类基于智能优化算法,包括粒子优化算法(PSO)、蚁优化算法(ACO)、人工鱼算法(AFSA)等。下面是一个简单的粒子优化算法的Python代码示例: ```python import random class Particle: def __init__(self, dim, minx, maxx): self.__pos = [random.uniform(minx, maxx) for i in range(dim)] self.__vel = [0.0 for i in range(dim)] self.__best_pos = self.__pos[:] self.__fitness = 0.0 self.__best_fitness = 0.0 def get_pos(self): return self.__pos def set_pos(self, pos): self.__pos = pos def get_vel(self): return self.__vel def set_vel(self, vel): self.__vel = vel def get_best_pos(self): return self.__best_pos def set_best_pos(self, best_pos): self.__best_pos = best_pos def get_fitness(self): return self.__fitness def set_fitness(self, fitness): self.__fitness = fitness def get_best_fitness(self): return self.__best_fitness def set_best_fitness(self, best_fitness): self.__best_fitness = best_fitness class PSO: def __init__(self, dim, size, iter_num, c1, c2, w, minx, maxx): self.__particles = [Particle(dim, minx, maxx) for i in range(size)] self.__size = size self.__iter_num = iter_num self.__c1 = c1 self.__c2 = c2 self.__w = w self.__gbest_fitness = 0.0 self.__gbest_pos = [0.0 for i in range(dim)] self.__minx = minx self.__maxx = maxx def fitness(self, pos): # 计算适应度函数值 return sum([x**2 for x in pos]) def update(self): for i in range(self.__size): particle = self.__particles[i] pos = particle.get_pos() vel = particle.get_vel() best_pos = particle.get_best_pos() fitness = particle.get_fitness() best_fitness = particle.get_best_fitness() # 更新速度和位置 for j in range(len(pos)): vel[j] = self.__w * vel[j] + self.__c1 * random.random() * (best_pos[j] - pos[j]) + self.__c2 * random.random() * (self.__gbest_pos[j] - pos[j]) pos[j] += vel[j] # 边界处理 if pos[j] < self.__minx: pos[j] = self.__minx vel[j] = 0.0 elif pos[j] > self.__maxx: pos[j] = self.__maxx vel[j] = 0.0 # 更新个体最优解和全局最优解 fitness = self.fitness(pos) if fitness > best_fitness: particle.set_best_pos(pos) particle.set_best_fitness(fitness) if fitness > self.__gbest_fitness: self.__gbest_pos = pos[:] self.__gbest_fitness = fitness def run(self): for i in range(self.__iter_num): self.update() print("Iteration {}: Best Fitness = {}".format(i+1, self.__gbest_fitness)) if __name__ == '__main__': pso = PSO(dim=2, size=20, iter_num=50, c1=2.0, c2=2.0, w=0.8, minx=-10.0, maxx=10.0) pso.run() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能算法研学社(Jack旭)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值