|
下面是我对蛇优化算法的理解及代码展示,勿喷,勿喷,勿喷!!!
如果有不正确的地方欢迎在评论区指出
蛇优化算法是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__==&#34;__main__&#34;:
main() |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|