群智能优化算法搜索过程及适应度可视化:北方苍鹰、灰狼、蝗虫优化算法对比研究
咱们今天来点硬核但好玩的——用Python把群智能优化算法的搜索过程画出来。可替换性强,每个优化算法都有增加可视化结果的前后程序对比,您对比着看,就能轻松掌握该方法,可灵活增加到你自己的优化算法上。可替换性强,每个优化算法都有增加可视化结果的前后程序对比,您对比着看,就能轻松掌握该方法,可灵活增加到你自己的优化算法上。给出了3种优化算法,北方苍鹰优化算法(NGO),灰狼优化算法(GWO),蝗虫优化
群智能优化算法搜索过程及适应度可视化 给出了3种优化算法,北方苍鹰优化算法(NGO),灰狼优化算法(GWO),蝗虫优化算法(GOA) 无论是自己改进优化算法,还是自己提出优化算法,该项工作绝对可以起到锦上添花的作用。 可替换性强,每个优化算法都有增加可视化结果的前后程序对比,您对比着看,就能轻松掌握该方法,可灵活增加到你自己的优化算法上
咱们今天来点硬核但好玩的——用Python把群智能优化算法的搜索过程画出来。这三种算法(北方苍鹰NGO、灰狼GWO、蝗虫GOA)在论文里看着都差不多,但可视化之后你会发现它们的搜索策略天差地别。

先看个灰狼算法的二维可视化效果。把下面这段代码塞到你的GWO主循环里:
if iter % 10 == 0:
plt.clf()
plt.scatter(alpha_pos[0], alpha_pos[1], marker='*', s=200, c='gold')
plt.scatter(population[:,0], population[:,1], c='gray', alpha=0.6)
plt.xlim(-10,10)
plt.ylim(-10,10)
plt.title(f'GWO Iteration {iter}')
plt.pause(0.1)
重点来了:population[:,0]和population[:,1]这两个切片操作,把灰狼群的位置坐标拆成了x和y分量。这里有个坑——很多人直接用Matplotlib画动态图会卡顿,记得在循环里加上plt.pause(0.1)让图像刷新,不然你会看到窗口直接无响应。
北方苍鹰的俯冲行为可视化更有意思。在NGO的位置更新公式后面加个轨迹记录:
# 在更新位置后记录
trajectory = []
def update_position():
global trajectory
new_pos = ... # 原更新公式
trajectory.append(new_pos.copy())
return new_pos
# 绘图时添加轨迹线
plt.plot(np.array(trajectory)[:,0], np.array(trajectory)[:,1],
'y--', alpha=0.3)
注意这里用copy()防止数组引用导致的数值覆盖,这个细节处理不好会让轨迹线全部重叠在同一点上。alpha=0.3参数让轨迹线呈现半透明效果,迭代次数多了也不会糊成一团。

群智能优化算法搜索过程及适应度可视化 给出了3种优化算法,北方苍鹰优化算法(NGO),灰狼优化算法(GWO),蝗虫优化算法(GOA) 无论是自己改进优化算法,还是自己提出优化算法,该项工作绝对可以起到锦上添花的作用。 可替换性强,每个优化算法都有增加可视化结果的前后程序对比,您对比着看,就能轻松掌握该方法,可灵活增加到你自己的优化算法上
蝗虫算法的群体排斥可视化最带感。在GOA的适应度计算阶段插入这段:
from mpl_toolkits.mplot3d import Axes3D
# 三维绘图初始化
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
# 在迭代中更新
ax.scatter(population[:,0], population[:,1], fitness,
c='green', depthshade=False)
ax.view_init(elev=30, azim=iter*2) # 视角旋转
这里elev=30把视角固定在30度俯角,azim=iter*2让图像每迭代一次旋转2度,生成动态图时会呈现蝗虫群在三维空间中的盘旋效果。注意三维绘图必须提前导入mpl_toolkits.mplot3d,否则会报错找不到投影模式。

适应度曲线对比才是重头戏。把三种算法的历史最优值存下来,用这个对比脚本:
plt.plot(gwo_history, 'r--', linewidth=2)
plt.plot(ngo_history, 'g-', linewidth=1.5)
plt.plot(goa_history, 'b:', linewidth=1)
plt.yscale('log') # 关键设置!
plt.legend(['GWO', 'NGO', 'GOA'], loc='upper right', fontsize=8)
这里yscale('log')用对数坐标能把后期细微变化放大显示。遇到过有些同学抱怨曲线后期都平了看不出区别,加上这个设置立刻就能看到算法在收敛阶段的性能差异。
最后说个骚操作:把三种算法的搜索过程录制成gif,用imageio库三行代码搞定:
import imageio
frames = [] # 存储每帧图片
# 在每次绘图后执行
frames.append(imageio.imread('temp.png'))
imageio.mimsave('compare.gif', frames, duration=0.2)
注意图片保存路径别写错,建议用临时文件过渡。duration参数控制播放速度,0.2秒一帧比较适合观察算法动态。把这些可视化技巧加到你的算法里,下次投稿论文审稿人绝对眼前一亮——亲测实验部分被审稿人专门表扬过可解释性增强。
更多推荐
所有评论(0)