CrazyClimber算法的具体步骤如下:假设信号的时频分布图为一个离散的B×K矩阵,设B的方向为水平方向,K的方向为垂直方向,矩阵上每一点(i,j),i∈[1,2,…,B],j∈[1,2,…,K]的值为小波变换系数M(i,j),则有:初始化N个可移动爬升起始点(称为Climber),和度量矩阵D。这N个爬升起始点在整个时频分布平面上是均匀分布的,度量矩阵D的初始值取为0。只对一个点的移动规则进行描述,其余点有相同的移动规则,每一步迭代用时间t表示,则:A)在初始时刻t=0,记录可移动爬升点的初始位置,记为Xk(0),其中k∈[1,2,…,N]。设定系统的初始参数为B0。B)在t时刻,可移动爬升点对应的位置为Xk(t)=(i,j)。在下一个时刻t+1,在不考虑边界点的情况下,可移动爬升点对应的位置Xk(t+1)=(i',j')由以下规则确定:a)对t时刻的i值,按照概率1/2左移或者右移一格,即有i'=i+1或i'=i-1。b)以相同的概率对t时刻的j值上移或者下移一格,即有j'=j+1或j'=j-1,也可以不移动,具体规则是如果M(i',j')>=M(i',j),则该点垂直移动,Xk(t+1)=(i',j');如果M(i',j')<M(i',j),则该点按概率p'垂直移动,Xk(t+1)=(i',j');按概率(1-p')不动,Xk(t+1)=(i',j)。其中,p'=exp。c)更新系统参数Bt。C)移动结束后,在度量矩阵D的相应位置(i',j')上增加度量值M(i',j')。D)重复步骤B)、C),直到系统温度低于设定值。E)对度量矩阵D,任意给定一个点(i,j),在(i+Δi,j)和(i+Δi,j±Δj)里寻找其最优的相邻点,并与其形成一条脊线。F)重复步骤E),直到所有满足要求的点都在脊线中,形成整个时频平面的脊线。G)按公式(3-46)计算每条脊线的能量,剔除能量小于某阙值的脊线。%crazyclimber算法functionout=ridge(c)%c是要提取脊线的时频矩阵,c元素为非负[B,A]=size(c);N=floor(A*B/4);%生成N个Climbertemp=zeros(B,A);fori=1:1:A*Bifmod(i,4)==0temp(i)=1;endendT=max(max(c))-min(min(c));%系统初始化温度Tt=T;%系统当前温度t=2;%系统当前时间whileTt>=T/1000%对时间t做循环fori=4:4:A*B%对每个climber做移动ifmod(i,B)==0heng=mod(i,B)+B;elseheng=mod(i,B);end%计算climber的横坐标zong=ceil(i/B)%计算climber的纵坐标p=sign(2*rand-1);%横坐标以0.5的等概率分别向左和右移动ifheng==1p=1;elseifheng==Ap=-1;end%排除边界条件heng_new=heng+p;%纵坐标按规则移动p=sign(2*rand-1);ifzong==1p=1;elseifzong==Ap=-1;end%排除边界条件zong_new=zong+p;ifc(heng_new,zong_new)>c(heng_new,zong)temp(heng,zong)=0;temp(heng_new,zong_new)=1;elsept=exp((c(heng_new,zong_new)-c(heng_new,zong))/Tt);if(rand<=pt)zong_new=zong+p;temp(heng,zong)=0;temp(heng_new,zong_new)=1;elsezong_new=zong;temp(heng,zong)=0;temp(heng_new,zong_new)=1;endendendTt=T/log2(t);t=t+1;end