学习周报第十周
算法优化
代码详细解释
1 | def func(x): |
注释:确定数据为2维,以Rastrigin函数为测试函数。
1 | def fast_flood_fill_optimizer_V3( |
1 | for iteration in range(max_iterations): |
数据测试
对上周提出的算法进行多维度的数据测试并且和QDA进行对比
(1)洒水
二维测试:稳定在0.6到1之间,1秒左右收敛。
多维测试:因为实在转换为二维网格,不适用于高纬度。
在修改收敛判断条件,例如将收俩条件改为,判断是否多次迭代后,“湖泊”数量不变,效果仍不显著,并且有概率会陷入局部最小值长时间不收敛的情况。
(2)QDA
2,5,10维度都接近10的负12次,收敛速度,0-10秒不等。
差分进化
1. 种群初始化
- 目的:为算法提供一个初始的、多样化的解集。
- 方法:在问题的 n 维解空间中,随机且均匀地生成 M 个个体。
- 个体表示:每个个体 Xi(0) 是一个 n 维向量,其每个属性 xi,j(0) 在给定的上下限
[min(Lj), max(Lj)]之间随机取值。 - 建议:种群规模 M 通常建议取维数 n 的 5 到 10 倍。
2. 变异操作
- 目的:通过“差分”生成新的候选解。
- 方法:对于第 g 代种群中的每个个体,随机选择三个不同的个体 X1(g), X2(g), X3(g)。
- 公式:通过以下向量等式生成一个变异个体 H(g): H(g)=X1(g)+F⋅(X2(g)−X3(g))
- 参数:F 是一个缩放因子,通常取 0.5 左右。过小容易导致早熟收敛,过大则容易陷入局部最优。
3. 交叉操作
-
目的:将变异个体与原始个体进行基因互补,生成试验个体。
-
方法:将第 g 代原始种群中的个体 xi,j(g) 和变异个体 hi,j(g) 的每个属性进行比较。
-
公式:通过以下概率公式生成新的试验个体 vi,j(g) 的每个属性:
-
参数:cr 是一个交叉概率,通常取 0.1 左右。
4. 选择操作
-
目的:通过“适者生存”的原则,决定哪些个体进入下一代种群。
-
方法:比较试验个体 Vi(g) 和原始个体 Xi(g) 的适应度(函数值)。
-
机制:执行完全确定的竞争机制。如果试验个体的适应度 f(Vi(g)) 优于原始个体的适应度 f(Xi(g)),则用试验个体替换原始个体。
-
公式:
(这里假设适应度值越小越好)
测试:速度上根据参数调整,种群数量严格控制到维度的5到10倍
算法在5维以下,算法收敛局部最小值精度很高,速度快。
算法到5维以上,算法收敛局部最小值精度较低,速度快。
计算速度在5维左右与qda拉开差距
测试函数为:Rastrigin
QDA优化
scale在原本的代码中简单的折半,优化为动态。
1 | # 计算当前种群在每个维度上的范围 |
测试:因为其本身优越的性能,在高维度状态下,收敛极其缓慢。不是很实用。究其原因在于:QDA 算法用种群中最远的两个点来计算 scale。只要有一个“行走者”因为随机采样或偶然情况偏离了种群,这个离群点就会导致 scale 值被大幅拉大。
我认为这可能是qda算法性能优越的关键所在。着眼于全局,找到局部,而不是定向的从局部优开始寻找,简而言之:理解寻找最优解的能力,正比于全局关联性。我会在下周的时候验证,如果可行的话,将会运用于我最终的优化算法构建。
定义:参数的定义。
第一性原理:遇事不决量子力学。(物理)
关于为什么DE快于QDA没有什么想法,在之后时间里验证。
调参:为什么这么调整,可解释性


