布谷鸟搜索算法(Cuckoo Search,CS)
布谷鸟算法的启发当然来自于布谷鸟,因为布谷鸟这种鸟很有意思,生出来的孩子自己不养,直接被扔到其他鸟的鸟巢中去了,但有时候,这些布谷鸟蛋会被被寄宿的那些鸟妈妈发现,然后就被抛弃,有时候,这些宿主会直接放弃整个鸟巢寻找新住处。然而道高一尺魔高一丈,有些品种的布谷鸟生下来的布谷鸟蛋的颜色能和去寄宿的鸟的鸟蛋颜色很相似,并且布谷鸟的破壳时间往往比那些宿主的鸟蛋早,这样,一旦小布谷鸟破壳,它就会将一些鸟蛋扔出鸟巢去以求获得更多的食物,并且,小布谷鸟能模拟宿主鸟孩子的叫声来骗取更多的食物!简单来说,就是如何更高效地去骗吃骗喝。
流程图如下图所示。
程序如下:
import numpy as np
import scipy.special as sc_special
import matplotlib.pyplot as plt #matplotlib的pyplot模块一般是最常用的,可以方便用户快速绘制二位图表
from matplotlib import cm #matplotlib是python最著名的绘图库
from mpl_toolkits.mplot3d import Axes3D #3D绘图
"""
Cuckoo search function
---------------------------------------------------
Input parameters:
n: 巢的数量
m: 维数
fit_func: 适用度函数
lower_boundary: 下边界
upper_boundary: 上边界
iter_num: 迭代次数 (默认: 100)
pa: 被宿主发现蛋的概率 (default: 0.25)
beta:与问题规模相关的步长比例因子 (note: 1 < beta < 2) (default: 1.5)
step_size: 与问题规模相关的步长比例因子 (default: 0.1)
Output:
最佳解决方案及值
"""
#绘制图像
def plot_3d(ax):
x = np.arange(-3, 3, 0.1) #在指定的间隔内返回均匀间隔的数字
y = np.arange(-3, 3, 0.1)
x,y = np.meshgrid(x, y)
z = 3*(1-x)**2*np.e**(-x**2-(y+1)**2) - 10*(x/5-x**3-y**5)*np.e**(-x**2-y**2) - (np.e**(-(x+1)**2-y**2))/3
ax.plot_surface(x,y,z,rstride=1,cstride=1,cmap=cm.coolwarm)# rstride:行之间的跨度 cstride:列之间的跨度,cmap是颜色映射表
ax.set_zlim(-10,10) ##坐标系的下边界和上边界
ax.set_xlabel('x')
ax.set_ylabel('y')
ax.set_zlabel('z')
plt.pause(3) #延时
plt.show() #显示
def fit_func(nest):
x, y = nest