找回密码
 立即注册
查看: 283|回复: 0

python:蛇优化算法

[复制链接]
发表于 2022-9-14 08:23 | 显示全部楼层 |阅读模式
下面是我对蛇优化算法的理解及代码展示,勿喷,勿喷,勿喷!!!
如果有不正确的地方欢迎在评论区指出
蛇优化算法是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[1,:]=a[0,:]*np.sin(a[0,:]*10)+np.cos(a[0,:]*2)*a[0,:]+10
    return a

#根据适应度站队
def line(b):
    b=b.T[np.lexsort(-b)].T
    return b

#变换
def conversion(k,man,woman):
    man=line(man)
    woman=line(woman)
    if k==1:    #寻找食物的变化
        kid1 = man[0, 0] + c2 * np.exp(-man[1, 0] / man[1, :]) * rand.uniform(-5, 5, (2, 15))
        kid2 = woman[0, 0] + c2 * np.exp(-woman[1, 0] / woman[1, :]) * rand.uniform(-5, 5, (2, 15))
    if k==2:   #战斗的变化
        kid1 = man[0,:]+c2*np.exp(-man[1,0]/man[1,:])*rand.uniform(-1,1,(2,15))*(man[0, 0]-man[0,:])
        kid2 = woman[0,:]+c2*np.exp(-woman[1,0]/woman[1,:])*rand.uniform(-1,1,(2,15))*(woman[0,0]-woman[0,:])
    if k==3:    #交配的变化
        kid1 = man[0,:]+c2*np.exp(-woman[1,0]/man[1,:]) * rand.uniform(-1,1,(2,15))*(q*woman[0,:]-man[0,:])
        kid2 = woman[0,:]+c2*np.exp(-man[1,0]/woman[1,:])*rand.uniform(-1,1,(2,15))*(q*man[0,:]-woman[0,:])
    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[0,:], man[1,:], s=100, lw=0, c='red', alpha=0.5)
        plt.pause(0.001)      #停留时间

        print(t," 雄性蛇的适应度",man[1,0],"  雌性蛇的适应度",woman[1,0])
        #主循环
        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()

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-11-24 11:58 , Processed in 0.143422 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表