1. 简介
Sine-Cosine 算法(Sine-Cosine Algorithm,SCA)是一种相对较新的优化算法。它属于基于种群的元启发式算法(Metaheuristic)家族,并且是基于数学函数的优化方法。
这类算法的核心思想是通过模拟种群个体在解空间中的移动来逼近最优解。SCA 的特别之处在于它使用了三角函数 sin 和 cos 来指导个体的更新方向。
2. Sine-Cosine 算法原理
SCA 由 Seyedali Mirjalili 于 2016 年提出,是一种用于解决优化问题的元启发式算法。
它通过以下两个更新公式来调整解的位置:
$$ X_{ij}^{(t+1)} = X_{ij}^{(t)} + r_1 \sin(r_2) \left| r_3 P_{ij}^{(t)} - X_{ij}^{(t)} \right| $$
$$ X_{ij}^{(t+1)} = X_{ij}^{(t)} + r_1 \cos(r_2) \left| r_3 P_{ij}^{(t)} - X_{ij}^{(t)} \right| $$
这两个公式通常合并为一个条件表达式:
$$ X_{ij}^{(t+1)} = \begin{cases} X_{ij}^{(t)} + r_1 \cos(r_2) \left| r_3 P_{ij}^{(t)} - X_{ij}^{(t)} \right|, & r_4 \geq 0.5 \ X_{ij}^{(t)} + r_1 \sin(r_2) \left| r_3 P_{ij}^{(t)} - X_{ij}^{(t)} \right|, & r_4 < 0.5 \end{cases} $$
其中:
- $ X_{ij}^{(t)} $:第 $ t $ 次迭代中第 $ i $ 个个体的第 $ j $ 维位置;
- $ P_{ij}^{(t)} $:当前最优个体的位置;
- $ r_1, r_2, r_3, r_4 $:随机参数,用于控制探索与开发的平衡。
参数说明
$ r_1 $ 控制解的更新方向是否偏向最优解:
- $ r_1 < 1 $:引导个体向最优解靠近;
- $ r_1 > 1 $:引导个体远离最优解,扩大搜索范围。
- $ r_1 $ 从常数 $ a $ 线性递减到 0:
$$ r_1 = a - t \cdot \frac{a}{T_{\max}} $$
**$ r_2 \in [0, 2\pi] $**:控制移动幅度;
**$ r_3 \in [0, 2] $**:加权最优解的影响;
**$ r_4 \in [0, 1] $**:在 sin 与 cos 函数之间切换。
3. SCA 的实际应用流程
SCA 的优化流程如下:
- 初始化种群,生成一组随机解;
- 评估每个解的适应度;
- 更新最优解;
- 使用上述公式更新每个个体的位置;
- 重复步骤 2~4,直到达到最大迭代次数。
下图展示了 SCA 的整体流程:
3.1 示例:特征选择
Belazzoug 等人曾将 SCA 应用于文本分类的特征选择问题。
每个解是一个固定长度的向量,每维表示一个特征的取值,范围在 [0, 1] 之间。若某维的值 ≥ 0.5,则该特征被选中。
目标函数结合了分类准确率和特征子集大小,是一个典型的多目标优化问题:
$$ f = \alpha E + (1 - \alpha) \cdot \frac{n_i}{n_T} $$
其中:
- $ \alpha \in [0,1] $:误差率与特征数的权重;
- $ E $:分类误差;
- $ n_i $:当前解选中的特征数;
- $ n_T $:总特征数。
误差值 $ E $ 通常通过信息增益(Mutual Information)来计算。
3.2 数值计算示例
我们以经典的 Six-Hump Camel 函数 为例进行优化测试:
$$ f(x_1, x_2) = \left(\frac{x_1^4}{3} - 2.1 x_1^2 + 4\right) x_1^2 + \left(4 x_2^2 - 4\right) x_2^2 + x_1 x_2 $$
$$ x_1, x_2 \in [-5, 5] $$
函数的全局最小值为:
$$ f(x_1, x_2) = -1.0316 $$
对应的解有两个:
- $ x_1 = 0.0898, x_2 = -0.7126 $
- $ x_1 = -0.0898, x_2 = 0.7126 $
使用 Dr. Pereira 提供的实现代码进行优化,部分迭代结果如下:
迭代 | $ x_1 $ | $ x_2 $ | $ f(x_1, x_2) $ |
---|---|---|---|
0 | 0.1435 | -0.5494 | -0.8402 |
100 | -0.0882 | 0.7054 | -1.0312 |
500 | -0.0911 | 0.7089 | -1.0315 |
1000 | -0.0904 | 0.7124 | -1.0316 |
可以看到,SCA 能够逐步逼近最优解。
4. 探索与开发的平衡
SCA 的性能关键在于探索(Exploration)与开发(Exploitation)的平衡。
通过分析 sin 和 cos 函数的取值范围:
- 当函数值在 [1, 2] 或 [-2, -1] 区间时,算法倾向于探索;
- 当函数值在 [-1, 1] 区间时,算法倾向于开发。
下图展示了 sin 和 cos 函数在 [0, 2π] 区间的图像:
小结
- 探索阶段:寻找新的、潜在的解区域;
- 开发阶段:在已有解附近进行精细搜索。
5. 为什么 SCA 有效?
SCA 的高效性来源于以下几点:
✅ 并行探索:通过种群机制,多个解并行搜索;
✅ 多区域搜索:利用 sin/cos 的范围变化,同时探索多个区域;
✅ 动态调整:参数随迭代变化,实现探索与开发的平衡;
✅ 最优解保留:始终保留当前最优解,避免丢失;
✅ 收敛性保障:随着迭代进行,$ r_1 $ 逐渐减小,算法趋于收敛。
6. 总结
本文简要介绍了 Sine-Cosine 算法的基本原理和应用流程。SCA 作为一种基于数学函数的元启发式优化算法,具有结构简单、收敛性好、易实现等优点。
虽然我们没有讨论 SCA 的各种改进版本,但这些变种也值得进一步研究。建议读者查阅相关文献,深入理解其扩展应用和性能优化策略。