当前位置:   article > 正文

Python优化算法09——黏菌优化算法(SMA)

Python优化算法09——黏菌优化算法(SMA)

科研里面优化算法都用的多,尤其是各种动物园里面的智能仿生优化算法,但是目前都是MATLAB的代码多,python几乎没有什么包,这次把优化算法系列的代码都从底层手写开始。

需要看以前的文章可以参考:Python优化算法_阡之尘埃的博客-CSDN博客


算法介绍

黏菌优化算法(Slime Mould Algorithm, SMA)是一种新兴的自然启发式优化算法,其灵感来源于黏菌(Slime Mould)的觅食行为。黏菌是一种简单的单细胞生物,以其高效的资源分配和路径选择能力闻名。研究人员观察到黏菌在寻找食物的过程中,能够动态调整其形态结构,以最小化能量消耗并优化食物获取,这为优化问题的求解提供了新的思路。

黏菌优化算法通过模拟黏菌的这种行为来进行优化求解。其基本思想是:

  1. 初始化:在问题空间中随机生成一组解,称为黏菌个体。

  2. 适应度评估:计算每个黏菌个体的适应度,通常根据优化问题的目标函数来衡量。

  3. 更新位置:根据当前的适应度信息和某些更新策略调整黏菌个体的位置。黏菌会倾向于往更优解的方向移动,同时保留一定的随机性以跳出局部最优。

  4. 信息共享:黏菌个体之间可以共享信息,类似于生物中的化学信号交流,这使得算法能够更有效地探索和开发搜索空间。

  5. 迭代:重复适应度评估和位置更新的过程,直到满足停止条件(如达到最大迭代次数或找到满意的解)。

黏菌优化算法因其简单性和灵活性,被应用于各种优化问题,如函数优化、路径规划、资源分配等。其优点在于能够在复杂搜索空间中找到高质量解,并且对不同类型的问题具有较好的适应性。不过,与其他算法一样,SMA也可能面临收敛速度和全局探索能力之间的权衡,需要根据具体问题进行参数调整。

其流程图为:

公式就不多写了,不如看代码直接。


代码实现

导入包

  1. import numpy as np
  2. import pandas as pd
  3. import matplotlib.pyplot as plt 
  4. import seaborn as sns
  5. import warnings
  6. import copy
  7. plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
  8. plt.rcParams ['axes.unicode_minus']=False               #显示负号
  9. warnings.filterwarnings('ignore')
  10. plt.rcParams['font.family'] = 'DejaVu Sans'

只给代码不给使用案例就都是钓鱼的。我这里给出代码,也要给使用案例,先采用一些简单的优化算法常用的测试函数。由于都优化算法需要测试函数,我们先都定义好常见的23个函数:

  1. '''F1函数'''
  2. def F1(X):
  3. Results=np.sum(X**2)
  4. return Results
  5. '''F2函数'''
  6. def F2(X):
  7. Results=np.sum(np.abs(X))+np.prod(np.abs(X))
  8. return Results
  9. '''F3函数'''
  10. def F3(X):
  11. dim=X.shape[0]
  12. Results=0
  13. for i in range(dim):
  14. Results=Results+np.sum(X[0:i+1])**2
  15. return Results
  16. '''F4函数'''
  17. def F4(X):
  18. Results=np.max(np.abs(X))
  19. return Results
  20. '''F5函数'''
  21. def F5(X):
  22. dim=X.shape[0]
  23. Results=np.sum(100*(X[1:dim]-(X[0:dim-1]**2))**2+(X[0:dim-1]-1)**2)
  24. return Results
  25. '''F6函数'''
  26. def F6(X):
  27. Results=np.sum(np.abs(X+0.5)**2)
  28. return Results
  29. '''F7函数'''
  30. def F7(X):
  31. dim = X.shape[0]
  32. Temp = np.arange(1,dim+1,1)
  33. Results=np.sum(Temp*(X**4))+np.random.random()
  34. return Results
  35. '''F8函数'''
  36. def F8(X):
  37. Results=np.sum(-X*np.sin(np.sqrt(np.abs(X))))
  38. return Results
  39. '''F9函数'''
  40. def F9(X):
  41. dim=X.shape[0]
  42. Results=np.sum(X**2-10*np.cos(2*np.pi*X))+10*dim
  43. return Results
  44. '''F10函数'''
  45. def F10(X):
  46. dim=X.shape[0]
  47. Results=-20*np.exp(-0.2*np.sqrt(np.sum(X**2)/dim))-np.exp(np.sum(np.cos(2*np.pi*X))/dim)+20+np.exp(1)
  48. return Results
  49. '''F11函数'''
  50. def F11(X):
  51. dim=X.shape[0]
  52. Temp=np.arange(1,dim+1,+1)
  53. Results=np.sum(X**2)/4000-np.prod(np.cos(X/np.sqrt(Temp)))+1
  54. return Results
  55. '''F12函数'''
  56. def Ufun(x,a,k,m):
  57. Results=k*((x-a)**m)*(x>a)+k*((-x-a)**m)*(x<-a)
  58. return Results
  59. def F12(X):
  60. dim=X.shape[0]
  61. Results=(np.pi/dim)*(10*((np.sin(np.pi*(1+(X[0]+1)/4)))**2)+\
  62. np.sum((((X[0:dim-1]+1)/4)**2)*(1+10*((np.sin(np.pi*(1+X[1:dim]+1)/4)))**2)+((X[dim-1]+1)/4)**2))+\
  63. np.sum(Ufun(X,10,100,4))
  64. return Results
  65. '''F13函数'''
  66. def Ufun(x,a,k,m):
  67. Results=k*((x-a)**m)*(x>a)+k*((-x-a)**m)*(x<-a)
  68. return Results
  69. def F13(X):
  70. dim=X.shape[0]
  71. Results=0.1*((np.sin(3*np.pi*X[0]))**2+np.sum((X[0:dim-1]-1)**2*(1+(np.sin(3*np.pi*X[1:dim]))**2))+\
  72. ((X[dim-1]-1)**2)*(1+(np.sin(2*np.pi*X[dim-1]))**2))+np.sum(Ufun(X,5,100,4))
  73. return Results
  74. '''F14函数'''
  75. def F14(X):
  76. aS=np.array([[-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32,-32,-16,0,16,32],\
  77. [-32,-32,-32,-32,-32,-16,-16,-16,-16,-16,0,0,0,0,0,16,16,16,16,16,32,32,32,32,32]])
  78. bS=np.zeros(25)
  79. for i in range(25):
  80. bS[i]=np.sum((X-aS[:,i])**6)
  81. Temp=np.arange(1,26,1)
  82. Results=(1/500+np.sum(1/(Temp+bS)))**(-1)
  83. return Results
  84. '''F15函数'''
  85. def F15(X):
  86. aK=np.array([0.1957,0.1947,0.1735,0.16,0.0844,0.0627,0.0456,0.0342,0.0323,0.0235,0.0246])
  87. bK=np.array([0.25,0.5,1,2,4,6,8,10,12,14,16])
  88. bK=1/bK
  89. Results=np.sum((aK-((X[0]*(bK**2+X[1]*bK))/(bK**2+X[2]*bK+X[3])))**2)
  90. return Results
  91. '''F16函数'''
  92. def F16(X):
  93. Results=4*(X[0]**2)-2.1*(X[0]**4)+(X[0]**6)/3+X[0]*X[1]-4*(X[1]**2)+4*(X[1]**4)
  94. return Results
  95. '''F17函数'''
  96. def F17(X):
  97. Results=(X[1]-(X[0]**2)*5.1/(4*(np.pi**2))+(5/np.pi)*X[0]-6)**2+10*(1-1/(8*np.pi))*np.cos(X[0])+10
  98. return Results
  99. '''F18函数'''
  100. def F18(X):
  101. Results=(1+(X[0]+X[1]+1)**2*(19-14*X[0]+3*(X[0]**2)-14*X[1]+6*X[0]*X[1]+3*X[1]**2))*\
  102. (30+(2*X[0]-3*X[1])**2*(18-32*X[0]+12*(X[0]**2)+48*X[1]-36*X[0]*X[1]+27*(X[1]**2)))
  103. return Results
  104. '''F19函数'''
  105. def F19(X):
  106. aH=np.array([[3,10,30],[0.1,10,35],[3,10,30],[0.1,10,35]])
  107. cH=np.array([1,1.2,3,3.2])
  108. pH=np.array([[0.3689,0.117,0.2673],[0.4699,0.4387,0.747],[0.1091,0.8732,0.5547],[0.03815,0.5743,0.8828]])
  109. Results=0
  110. for i in range(4):
  111. Results=Results-cH[i]*np.exp(-(np.sum(aH[i,:]*((X-pH[i,:]))**2)))
  112. return Results
  113. '''F20函数'''
  114. def F20(X):
  115. aH=np.array([[10,3,17,3.5,1.7,8],[0.05,10,17,0.1,8,14],[3,3.5,1.7,10,17,8],[17,8,0.05,10,0.1,14]])
  116. cH=np.array([1,1.2,3,3.2])
  117. pH=np.array([[0.1312,0.1696,0.5569,0.0124,0.8283,0.5886],[0.2329,0.4135,0.8307,0.3736,0.1004,0.9991],\
  118. [0.2348,0.1415,0.3522,0.2883,0.3047,0.6650],[0.4047,0.8828,0.8732,0.5743,0.1091,0.0381]])
  119. Results=0
  120. for i in range(4):
  121. Results=Results-cH[i]*np.exp(-(np.sum(aH[i,:]*((X-pH[i,:]))**2)))
  122. return Results
  123. '''F21函数'''
  124. def F21(X):
  125. aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],\
  126. [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
  127. cSH=np.array([0.1,0.2,0.2,0.4,0.4,0.6,0.3,0.7,0.5,0.5])
  128. Results=0
  129. for i in range(5):
  130. Results=Results-(np.dot((X-aSH[i,:]),(X-aSH[i,:]).T)+cSH[i])**(-1)
  131. return Results
  132. '''F22函数'''
  133. def F22(X):
  134. aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],\
  135. [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
  136. cSH=np.array([0.1,0.2,0.2,0.4,0.4,0.6,0.3,0.7,0.5,0.5])
  137. Results=0
  138. for i in range(7):
  139. Results=Results-(np.dot((X-aSH[i,:]),(X-aSH[i,:]).T)+cSH[i])**(-1)
  140. return Results
  141. '''F23函数'''
  142. def F23(X):
  143. aSH=np.array([[4,4,4,4],[1,1,1,1],[8,8,8,8],[6,6,6,6],[3,7,3,7],\
  144. [2,9,2,9],[5,5,3,3],[8,1,8,1],[6,2,6,2],[7,3.6,7,3.6]])
  145. cSH=np.array([0.1,0.2,0.2,0.4,0.4,0.6,0.3,0.7,0.5,0.5])
  146. Results=0
  147. for i in range(10):
  148. Results=Results-(np.dot((X-aSH[i,:]),(X-aSH[i,:]).T)+cSH[i])**(-1)
  149. return Results

把他们的参数设置都用字典装起来

  1. Funobject = {'F1': F1,'F2': F2,'F3': F3,'F4': F4,'F5': F5,'F6': F6,'F7': F7,'F8': F8,'F9': F9,'F10': F10,
  2. 'F11': F11,'F12': F12,'F13': F13,'F14': F14,'F15': F15,'F16': F16,'F17': F17,
  3. 'F18': F18,'F19': F19,'F20': F20,'F21': F21,'F22': F22,'F23': F23}
  4. Funobject.keys()
  5. #维度,搜索区间下界,搜索区间上界,最优值
  6. Fundim={'F1': [30,-100,100],'F2': [30,-10,10],'F3': [30,-100,100],'F4': [30,-10,10],'F5': [30,-30,30],
  7. 'F6': [30,-100,100],'F7': [30,-1.28,1.28],'F8': [30,-500,500],'F9':[30,-5.12,5.12],'F10': [30,-32,32],
  8. 'F11': [30,-600,600],'F12': [30,-50,50],'F13': [30,-50,50],'F14': [2,-65,65],'F15':[4,-5,5],'F16': [2,-5,5],
  9. 'F17':[2,-5,5],'F18': [2,-2,2],'F19': [3,0,1],'F20': [6,0,1],'F21':[4,0,10],'F22': [4,0,10],'F23': [4,0,10]}

 Fundim字典里面装的是对应这个函数的 ,维度,搜索区间下界,搜索区间上界。这样写好方便我们去遍历测试所有的函数。


黏菌优化算法

终于到了算法的主代码阶段了:

  1. import random, math, copy
  2. ''' 种群初始化函数 '''
  3. def initial(pop, dim, ub, lb):
  4. X = np.zeros([pop, dim])
  5. for i in range(pop):
  6. for j in range(dim):
  7. X[i, j] = random.random()*(ub[j] - lb[j]) + lb[j]
  8. return X,lb,ub
  9. '''边界检查函数'''
  10. def BorderCheck(X,ub,lb,pop,dim):
  11. for i in range(pop):
  12. for j in range(dim):
  13. if X[i,j]>ub[j]:
  14. X[i,j] = ub[j]
  15. elif X[i,j]<lb[j]:
  16. X[i,j] = lb[j]
  17. return X
  18. '''计算适应度函数'''
  19. def CaculateFitness(X,fun):
  20. pop = X.shape[0]
  21. fitness = np.zeros([pop, 1])
  22. for i in range(pop):
  23. fitness[i] = fun(X[i, :])
  24. return fitness
  25. '''适应度排序'''
  26. def SortFitness(Fit):
  27. fitness = np.sort(Fit, axis=0)
  28. index = np.argsort(Fit, axis=0)
  29. return fitness,index
  30. '''根据适应度对位置进行排序'''
  31. def SortPosition(X,index):
  32. Xnew = np.zeros(X.shape)
  33. for i in range(X.shape[0]):
  34. Xnew[i,:] = X[index[i],:]
  35. return Xnew
  36. '''黏菌优化算法'''
  37. def SMA(pop,dim,lb,ub,MaxIter,fun):
  38. z = 0.03 #位置更新参数
  39. X,lb,ub = initial(pop, dim, ub, lb) #初始化种群
  40. fitness = CaculateFitness(X,fun) #计算适应度值
  41. fitness,sortIndex = SortFitness(fitness) #对适应度值排序
  42. X = SortPosition(X,sortIndex) #种群排序
  43. GbestScore = copy.copy(fitness[0])
  44. GbestPositon = copy.copy(X[0,:])
  45. Curve = np.zeros([MaxIter,1])
  46. W = np.zeros([pop,dim]) #权重W矩阵
  47. for t in range(MaxIter):
  48. worstFitness = fitness[-1]
  49. bestFitness = fitness[0]
  50. S=bestFitness-worstFitness+ 10E-8 #当前最优适应度于最差适应度的差值,10E-8为极小值,避免分母为0;
  51. for i in range(pop):
  52. if i<pop/2: #适应度排前一半的W计算
  53. W[i,:]= 1+np.random.random([1,dim])*np.log10((bestFitness-fitness[i])/(S)+1)
  54. else:#适应度排后一半的W计算
  55. W[i,:]= 1-np.random.random([1,dim])*np.log10((bestFitness-fitness[i])/(S)+1)
  56. #惯性因子a,b
  57. tt = -(t/MaxIter)+1
  58. if tt!=-1 and tt!=1:
  59. a = math.atanh(tt)
  60. else:
  61. a = 1
  62. b = 1-t/MaxIter
  63. #位置更新
  64. for i in range(pop):
  65. if np.random.random()<z:
  66. X[i,:] = (ub.T-lb.T)*np.random.random([1,dim])+lb.T
  67. else:
  68. p = np.tanh(abs(fitness[i]-GbestScore))
  69. vb = 2*a*np.random.random([1,dim])-a
  70. vc = 2*b*np.random.random([1,dim])-b
  71. for j in range(dim):
  72. r = np.random.random()
  73. A = np.random.randint(pop)
  74. B = np.random.randint(pop)
  75. if r<p:
  76. X[i,j] = GbestPositon[j] + vb[0,j]*(W[i,j]*X[A,j]-X[B,j])
  77. else:
  78. X[i,j] = vc[0,j]*X[i,j]
  79. X = BorderCheck(X,ub,lb,pop,dim) #边界检测
  80. fitness = CaculateFitness(X,fun) #计算适应度值
  81. fitness,sortIndex = SortFitness(fitness) #对适应度值排序
  82. X = SortPosition(X,sortIndex) #种群排序
  83. if(fitness[0]<=GbestScore): #更新全局最优
  84. GbestScore = copy.copy(fitness[0])
  85. GbestPositon = copy.copy(X[0,:])
  86. Curve[t] = GbestScore
  87. return GbestScore,GbestPositon,Curve

其实优化算法差不多都是这个流程,边界函数,适应度函数排序,然后寻优过程等等。


简单使用

我们选择F1来测试,先看看F1函数三维的情况:

  1. '''F1绘图函数'''
  2. from mpl_toolkits.mplot3d import Axes3D
  3. def F1Plot():
  4. fig = plt.figure(1) #定义figure
  5. ax = Axes3D(fig) #将figure变为3d
  6. x1=np.arange(-100,100,2) #定义x1,范围为[-100,100],间隔为2
  7. x2=np.arange(-100,100,2) #定义x2,范围为[-100,100],间隔为2
  8. X1,X2=np.meshgrid(x1,x2) #生成网格
  9. nSize = x1.shape[0]
  10. Z=np.zeros([nSize,nSize])
  11. for i in range(nSize):
  12. for j in range(nSize):
  13. X=[X1[i,j],X2[i,j]] #构造F1输入
  14. X=np.array(X) #将格式由list转换为array
  15. Z[i,j]=F1(X) #计算F1的值
  16. #绘制3D曲面
  17. # rstride:行之间的跨度 cstride:列之间的跨度
  18. # rstride:行之间的跨度 cstride:列之间的跨度
  19. # cmap参数可以控制三维曲面的颜色组合
  20. ax.plot_surface(X1, X2, Z, rstride = 1, cstride = 1, cmap = plt.get_cmap('rainbow'))
  21. ax.contour(X1, X2, Z, zdir='z', offset=0)#绘制等高线
  22. ax.set_xlabel('X1')#x轴说明
  23. ax.set_ylabel('X2')#y轴说明
  24. ax.set_zlabel('Z')#z轴说明
  25. ax.set_title('F1_space')
  26. plt.show()
  27. F1Plot()

然后我们使用优化算法来寻优,自定义好所有的参数:

  1. #设置参数
  2. pop = 30 #种群数量
  3. MaxIter = 200#最大迭代次数
  4. dim = 30 #维度
  5. lb = -100*np.ones([dim, 1]) #下边界
  6. ub = 100*np.ones([dim, 1])#上边界
  7. #选择适应度函数
  8. fobj = F1
  9. #原始算法
  10. GbestScore,GbestPositon,Curve = SMA(pop,dim,lb,ub,MaxIter,fobj)
  11. #改进算法
  12. print('------原始算法结果--------------')
  13. print('最优适应度值:',GbestScore)
  14. print('最优解:',GbestPositon)

其实f1测试函数简单来说就是y等于x的平方,但是我们这里由于用了30个x,所以它是一个30维的,但是毫无疑问大家都知道它的最小值是零。所以可以看到这些结果基本上也都是等于零,是符合最优的情况的。

自己使用解决实际问题的时候只需要替换fobj这个目标函数的参数就可以了。

这个函数就如同上面所有的自定义的测试函数一样,你只需要定义输入的x,经过1系列实际问题的计算逻辑,返回的适应度值就可以。


绘制适应度曲线

  1. #绘制适应度曲线
  2. plt.figure(figsize=(6,2.7),dpi=128)
  3. plt.semilogy(Curve,'b-',linewidth=2)
  4. plt.xlabel('Iteration',fontsize='medium')
  5. plt.ylabel("Fitness",fontsize='medium')
  6. plt.grid()
  7. plt.title('SMA',fontsize='large')
  8. plt.legend(['SMA'], loc='upper right')
  9. plt.show()

注意,我这里是对数轴,所以它看起来会没有很收敛,但实际上他在10轮左右就已经达到了10的-7次方,已经是接近于零的一个最小值了。

其实看到这里差不多就可以去把这个优化算法的函数拿去使用了,演示结束了,但是由于我们这里还需要对它的性能做一些测试,我们会把它在所有的测试函数上都跑一遍,这个时间可能是有点久的。


所有函数都测试一下

准备存储评价结果的数据框

  1. functions = list(Funobject.keys())
  2. algorithms = list(OPT_algorithms.keys())
  3. columns = ['Mean', 'Std', 'Best', 'Worth']
  4. index = pd.MultiIndex.from_product([functions, algorithms], names=['function_name', 'Algorithm_name'])
  5. df_eval = pd.DataFrame(index=index, columns=columns)
  6. df_eval.head()

 

索引和列名称都建好了,现在就是一个个跑,把值放进去就行了。

准备存储迭代图的数据框

  1. df_Curve=pd.DataFrame(columns=index)
  2. df_Curve

 

 自定义训练函数

  1. #定义训练函数
  2. def train_fun(fobj_name=None,opt_algo_name=None, pop=30,MaxIter=200,Iter=30,show_fit=False):
  3. fundim=Fundim[fobj_name] ; fobj=Funobject[fobj_name]
  4. dim=fundim[0]
  5. lb = fundim[1]*np.ones([dim, 1]) ; ub = fundim[2]*np.ones([dim, 1])
  6. opt_algo=OPT_algorithms[opt_algo_name]
  7. GbestScore_one=np.zeros([Iter])
  8. GbestPositon_one=np.zeros([Iter,dim])
  9. Curve_one=np.zeros([Iter,MaxIter])
  10. for i in range(Iter):
  11. GbestScore_one[i],GbestPositon_one[i,:],Curve_oneT =opt_algo(pop,dim,lb,ub,MaxIter,fobj)
  12. Curve_one[i,:]=Curve_oneT.T
  13. oneal_Mean=np.mean(GbestScore_one) #计算平均适应度值
  14. oneal_Std=np.std(GbestScore_one)#计算标准差
  15. oneal_Best=np.min(GbestScore_one)#计算最优值
  16. oneal_Worst=np.max(GbestScore_one)#计算最差值
  17. oneal_MeanCurve=Curve_one.mean(axis=0) #求平均适应度曲线
  18. #储存结果
  19. df_eval.loc[(fobj_name, opt_algo_name), :] = [oneal_Mean,oneal_Std, oneal_Best,oneal_Worst]
  20. df_Curve.loc[:,(fobj_name,opt_algo_name)]=oneal_MeanCurve
  21. #df_Curve[df_Curve.columns[(fobj_name,opt_algo_name)]] = oneal_MeanCurve
  22. if show_fit:
  23. print(f'{fobj_name}函数的{opt_algo_name}算法的平均适应度值是{oneal_Mean},标准差{oneal_Std},最优值{oneal_Best},最差值{oneal_Worst}')

训练测试

  1. #设置参数
  2. pop = 30#种群数量
  3. MaxIter = 100 #代次数
  4. Iter = 30 #运行次数

计算,遍历所有的测试函数 

  1. #所有函数,所有算法全部一次性计算
  2. for fobj_name in list(Funobject.keys()):
  3. for opt_algo_name in OPT_algorithms.keys():
  4. try:
  5. train_fun(fobj_name=fobj_name,opt_algo_name=opt_algo_name, pop=pop,MaxIter=MaxIter,Iter=Iter)
  6. print(f'{fobj_name}{opt_algo_name}算法完成')
  7. except Exception as e: # 使用 except 来捕获错误
  8. print(f'{fobj_name}{opt_algo_name}算法报错了:{e}') # 打印错误信息

查看计算出来的评价指标

df_eval

 

由于这里大部分的测试函数最优值都是零,我们可以看到。SMa在很多函数上都还是接近于收敛的,说明它的效果还是不错的。


画出迭代图

  1. colors = ['darkorange', 'limegreen', 'lightpink', 'deeppink', 'red', 'cornflowerblue', 'grey']
  2. markers = ['^', 'D', 'o', '*', 'X', 'p', 's']
  3. def plot_log_line(df_plot, fobj_name, step=10, save=False):
  4. plt.figure(figsize=(6, 3), dpi=128)
  5. for column, color, marker in zip(df_plot.columns, colors, markers):
  6. plt.semilogy(df_plot.index[::step], df_plot[column][::step].to_numpy(),
  7. color=color, marker=marker, label=column, markersize=4, alpha=0.7)
  8. plt.xlabel('Iterations')
  9. plt.ylabel('f')
  10. plt.legend(loc='best', fontsize=8)
  11. if save:
  12. plt.savefig(f'./图片/{fobj_name}不同迭代图.png', bbox_inches='tight')
  13. plt.show()
  14. # 使用示例
  15. # plot_log_line(your_dataframe, 'example_plot')

 

这里可以打印它在每一个测试函数上的迭代图,可以自己具体仔细观察。


后面还有更多的优化算法,等我有空都写完。其实文章最核心的还是优化算法的函数那一块儿,别的代码都是用来测试它的性能的。

当然需要本次案例的全部代码文件的还是可以参考:黏菌优化算法

创作不易,看官觉得写得还不错的话点个关注和赞吧,本人会持续更新python数据分析领域的代码文章~(需要定制类似的代码可私信)

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号