群智能优化算法搜索过程及适应度可视化 给出了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秒一帧比较适合观察算法动态。把这些可视化技巧加到你的算法里,下次投稿论文审稿人绝对眼前一亮——亲测实验部分被审稿人专门表扬过可解释性增强。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐