2023/3/20 粒子群(PSO)算法
老师又没来,这说明助教比老师强,男助教能讲算法,女助教讲论文怎么写,说明男助教强
大作业相关
- 下周起开始汇报,下周一
- 按照题目第一关键字,顺序号第二关键字
- 讲 15 分钟,问答 5 分钟
- 下周一、三讲的组只需要把算法设计讲出来即可
上课内容
The Particle Swarm Optimization Algorithm(粒子群)
- Origins:1986 年,有人描述这个过程用 3 个简单的行为。
- Separation
- 避免人群过于拥挤
- Alignment
- 朝领头的个体对齐
- Cohesion(内聚)
- 个体会朝着中间个体走,开始向中间集合
- Separation
- 结合了自身经验和群体(原文为 social)经验
- Concept:
- 用大量粒子探索解空间,找到最优解
- 对于每一个粒子,通过邻居做调整
- 邻居是固定的
伪代码(注意是伪代码)
void PSO() {
P = Particle_init(); // 预处理粒子点位置
for(int i=0;i<iteration_max;i++) {
for(auto p : P) {
fp = f(p);
if(fp > f(pBest[id(p)])) pBest[id(p)] = p;
}
gBest = best gBest, p in P;
for(auto& p : P) {
v[id(p)] = v[id(p)] + c1 * rand() * (pBest[id(p)] - p) + c2 * rand() * (gBest - p);
p = p + v[id(p)];
}
}
}
- 伪代码中的参数
- pBest[i]: 对于 \(i\) 号粒子,他自己历史最佳的位置
- gBest: 所有粒子中最佳位置
- c1: 局部信息的权重
- c2: 全局信息的权重
- p: 粒子位置
- v: 路径方向
- id(p): 指 p 的下标
- 参数的一些注意事项
- 粒子数量属于 [10, 50]
- 通常 \(C_1 + C_2 = 4\)
- \(C_1\) 是个人最佳价值的重要性
- \(C_2\) 是邻居最佳价值的重要性
- rand() 是 [0,1] 区间的随机数
- 速度要适中
- 算法
- 创建一些粒子
- 用目标函数评估粒子位置
- 用粒子当前位置更新当前粒子的历史最优位置 pBest
- 更新整个粒子群中历史最优位置 gBest
- 更新粒子速度 \(v_i^{t+1} = v_t^t + c_1 U_1^t (pb_i^t – p_i^t) + c_2 U_2^t (gb^t – p_i^t)\)
- 把粒子移动到新位置上 \(p_i^{t+1} = p_i^t + v_i^{t+1}\)
- 跳到第二步直到终止
- 特点
- Intensification:由于有 pbest,因此可以在自己的附近区域内做搜索。
- Diversification:可以让 gbest,让粒子从自己的位置到 gbest 位置路径区域上找最优解。
- 优点
- 参数少
- 实现简单
- 可以并行
- 有效的全局搜索算法
- 缺点
- 网络权重的编码而且遗传算子的选择有时比较麻烦。
- 对于离散的优化问题处理不佳,容易陷入局部最优解,因此一般需要使用期改进方法避免陷入局部最优解
今天还讲了粒子群做二位装箱、模拟退火做 TSP,但是我都没听,反正我不做这俩