APSchmidt 发表于 2022-9-14 08:23

python:蛇优化算法

下面是我对蛇优化算法的理解及代码展示,勿喷,勿喷,勿喷!!!
如果有不正确的地方欢迎在评论区指出
蛇优化算法是2022年新出的一种智能算法,该算法是模仿蛇的行为得到的优化算法。其是一种群体优化算法。在这个算法中蛇存在三个行为:寻找食物,战斗,交配。
如果食物充足,温度较高,那么蛇就只会关注于食物。
如果存在食物,温度较低,那么蛇就会发生战斗和交配行为。其中战斗发生在同种性别的蛇之间,交配发生在异性蛇之间。这两种状态是以一定的概率发生的。
以下是程序框图:(对框图字母做出一些解释)
r:是一个0~1的随机数
q :代表为异性群体的比重(为0~1之间的数)
x_{rend}:是雄雌性蛇中最优秀的个体的位置
x_{min} , x_{max}:是雄雌性蛇群中生活的范围的最小值和最大值
A_{m}=e^{-\frac{f_{rand}}{f_i}} ( f_{rand} 是最大适应度, f_i 是当前适应度)
FM=e^{-\frac{f_{bast}}{f_i}}( f_{bast} 是最大适应度值)
M_{f}=e^{-\frac{f_{im}}{f_{if}}}(下标f为雄性蛇群,下标m为雌性蛇群)
M_{m}=e^{-\frac{f_{if}}{f_{im}}}

本文的Python程序是求解函数的最高点位置



蛇优化算法程序框图

#python工具库的导入
import numpy as np
import numpy.random as rand
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

#初始参数的导入,这些参数是可以改变的
T=100
c1=0.5;c2=0.5
q=0.5
food=1;war=2;mating=3

#画图基本参数的设置
fig = plt.figure(figsize=(10, 5))
plt.rcParams["font.family"]="FangSong"    #设置成可以显示中文
plt.title("蛇优化算法的搜索展示")
plt.xlabel("X轴")
plt.ylabel("Y轴")
plt.ion()    #打开交互模式


#适应度计算
def fitness(a):
    a=a*np.sin(a*10)+np.cos(a*2)*a+10
    return a

#根据适应度站队
def line(b):
    b=b.T.T
    return b

#变换
def conversion(k,man,woman):
    man=line(man)
    woman=line(woman)
    if k==1:    #寻找食物的变化
      kid1 = man + c2 * np.exp(-man / man) * rand.uniform(-5, 5, (2, 15))
      kid2 = woman + c2 * np.exp(-woman / woman) * rand.uniform(-5, 5, (2, 15))
    if k==2:   #战斗的变化
      kid1 = man+c2*np.exp(-man/man)*rand.uniform(-1,1,(2,15))*(man-man)
      kid2 = woman+c2*np.exp(-woman/woman)*rand.uniform(-1,1,(2,15))*(woman-woman)
    if k==3:    #交配的变化
      kid1 = man+c2*np.exp(-woman/man) * rand.uniform(-1,1,(2,15))*(q*woman-man)
      kid2 = woman+c2*np.exp(-man/woman)*rand.uniform(-1,1,(2,15))*(q*man-woman)
    kid1=np.clip(kid1,0,5,out=None)
    kid2=np.clip(kid2,0,5,out=None)
    kid1=fitness(kid1)
    kid2=fitness(kid2)
    man=np.hstack((man,kid1))
    woman=np.hstack((woman,kid2))
    man=line(man)
    woman=line(woman)
    man=man[:,0:15]
    woman=woman[:,0:15]
    return man,woman

#设置主函数,主循环
def main():
    man = rand.uniform(0, 5, (2, 15))
    woman = rand.uniform(0, 5, (2, 15))
    man=fitness(man)
    woman=fitness(woman)
    for t in range(T):
      #画图的交互
      plt.cla()      #清空后画布
      s = np.arange(0, 5, 0.01)
      h = np.sin(10 * s) * s + np.cos(2 * s) * s + 10
      plt.plot(s, h, 'r--')
      if 'sca' in globals(): sca.remove()
      sca = plt.scatter(man, man, s=100, lw=0, c='red', alpha=0.5)
      plt.pause(0.001)      #停留时间

      print(t," 雄性蛇的适应度",man,"雌性蛇的适应度",woman)
      #主循环
      temp=np.exp(-t/T)
      Q=c1*np.exp((t-T)/T)
      if Q<0.25:
            man,woman=conversion(food,man,woman)
            continue
      else:
            if temp>0.6:
                man,woman=conversion(food,man,woman)
                continue
            else:
                k=rand.rand()
                if k<0.6:
                  man,woman=conversion(war,man,woman)
                else:
                  man,woman=conversion(mating,man,woman)

    print(man[:,0])
    print(woman[:,0])
    plt.ioff()   #关闭交互模式
    plt.show()   #展示图片

if __name__=="__main__":
    main()
页: [1]
查看完整版本: python:蛇优化算法