果蝇优化算法:优化ZScore模型 python实现

Posted Lucoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了果蝇优化算法:优化ZScore模型 python实现相关的知识,希望对你有一定的参考价值。

果蝇优化算法:优化ZScore模型 python实现

数据集:

0.016 0.177 0.4208 1.038 0.022 0
1.0957 0.19 0.2224 0.816 0.933 1
0.2543 0.206 0.5264 0.4 0.015 1
1.2257 0.224 0.3272 1.05 1.049 1
0.3872 0.228 0.2256 0.98 0.998 1
1.6066 0.231 0.2832 1.054 1.009 1
1.1594 0.252 0.3344 0.946 0.987 0
0.3424 0.26 0.3408 0.196 0.126 1
0.8604 0.261 0.2616 0.994 0.996 0
0.5107 0.264 0.2352 0.888 0.004 1
0.8981 0.271 0.1536 0.688 0.857 1
0.0878 0.275 0.2072 0.732 0.908 1
0.2384 0.297 0.2336 0.036 0.099 0
0.8591 0.308 0.4208 0.132 1.031 1
0.5861 0.309 0.1656 0.836 0.896 1
0.6329 0.311 -0.24 -0.134 0.611 0
0.6173 0.311 0.1256 0.714 0.848 0
0.7811 0.326 0.2896 0.834 0.909 1
0.3937 0.329 0.2552 0.024 0.493 0
0.1211 0.055 0.3744 1.142 1.077 1

代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties


#######果蝇算法######
##初始化果蝇参数
popsize = 20        #果蝇种群规模
maxgen = 100        #果蝇最大迭代次数
R = 1               #果蝇飞行半径
D = 5              #优化变量个数

# 读取数据的函数
TXY = np.loadtxt('e:\\\\TXY.txt')
# 计算这个TXY举证的行数还有列数
row= np.shape(TXY)[0]            
col=np.shape(TXY)[1]

# 将函数来进行分块,然后来进行之后的操作
set = row/5
row1 = row - set

# tr和t1来得到最优z-score系数
tr = TXY[0:row,:col-1]
t1 = TXY[0:row,col-1]

t_value = TXY[:,col-1]

# te和t2来检查优化效果
te = TXY[int(row1):,:col-1]
t2 = TXY[0:int(row1),col-1]

# 计算这个距离的容量
Dist = np.zeros([popsize,D])
# 味道浓度判定值
S = np.zeros([popsize,D])
# 优化参数的结果存放值
bestS = np.zeros([1,D])
# 味道气味值
Smell = np.zeros([popsize,1])

#果蝇种群里面的每一个果蝇需要存放的一个坐标位置,有五个种群,进行5个参数来进行优化参数的作用
X = np.zeros([popsize,D])
Y = np.zeros([popsize,D])

# 每次迭代之后,保存的结果
fitness = np.zeros([maxgen,1])

# 需要计算的保存的最有果蝇的位置
XBest = np.zeros([maxgen,D])
YBest = np.zeros([maxgen,D])

#赋予果蝇群体初始位置,五个种群的位置
num=0
for i in range(row):
    res = TXY[i,0]*1.2+1.4*TXY[i,1]+3.3*TXY[i,2]+0.6*TXY[i,3]+1.0*TXY[i,4]
    if res>2.675:
        if int(t_value[i])==1:
            num+=1
    else:
        if int(t_value[i])==0:
            num+=1
pre = num/row
now=0

# 由于随机化的原因,收敛不到这个寻优的效果,然后现在是直接找到超过的,那么代表这个可以了
while True:
    #初始化种群的位置
    X_axis = np.random.rand(1,D)
    Y_axis = np.random.rand(1,D)
    #果蝇寻优开始,利用嗅觉寻找食物
    for i in range(popsize):
        X[i,:] = X_axis + R*(2*np.random.rand(1,D)-1)
        Y[i,:] = Y_axis + R*(2*np.random.rand(1,D)-1)
        #计算距离Dist
        Dist[i,:] = np.sqrt(X[i,:]**2+Y[i,:]**2)
        #计算味道浓度的倒数作为味道浓度判定值
        S[i,:] = 1/Dist[i,:]
        #带入味道浓度函数中求出味道浓度值
        yc = S[i,0] * tr[:,0] + S[i,1] * tr[:,1] + S[i,2]* tr[:,2] + S[i,3] * tr[:,3] +  S[i,4] * tr[:,4];
        yy = yc - t1;
        # 每5个果蝇飞行一次计算一次均方根误差
        g = 0
        for j in range(row):
            g = g + yy[j]**2;
        Smell[i] = (g/row)**0.5; #将每次的和原来数据的均方根误差,当作气味值
    #找出味道值最小的,即最接近预测结果的气味值,及其下标
    Smellbest,index = np.min(Smell),np.argmin(Smell)
    bestSmell = Smellbest
    #保留最佳味道浓度处的果蝇
    X_axis = X[int(index),:]
    Y_axis = Y[int(index),:]
    #果蝇种群进入迭代寻优
    for j in range(maxgen):
        for i in range(popsize):
            X[i,:] = X_axis + R*(2*np.random.rand(1,D)-1)
            Y[i,:] = Y_axis + R*(2*np.random.rand(1,D)-1)
            #计算距离Dist
            Dist[i,:] = np.sqrt(X[i,:]**2+Y[i,:]**2)
            #计算味道浓度的倒数作为味道浓度判定值
            S[i,:] = 1/Dist[i,:]
            #带入味道浓度函数中求出味道浓度值
            yc = S[i,0] * tr[:,0] + S[i,1] * tr[:,1] + S[i,2]* tr[:,2] + S[i,3] * tr[:,3] +  S[i,4] * tr[:,4];
            yy = yc - t1;
            g = 0
            for k in range(row):
                g = g + yy[k]**2;
            Smell[i] = (g/row)**0.5; 

        Smellbest,index = np.min(Smell),np.argmin(Smell)
        if Smellbest < bestSmell:
            bestSmell = Smellbest
            bestS = S[index]
            X_axis = X[int(index),:]
            Y_axis = Y[int(index),:]
        fitness[j] = bestSmell
        XBest[j] = X_axis
        YBest[j] = Y_axis
    #计算当前预测的一个过程,
    num=0
    for i in range(row):
        res = TXY[i,0]*bestS[0]+bestS[1]*TXY[i,1]+bestS[2]*TXY[i,2]+bestS[3]*TXY[i,3]+bestS[4]*TXY[i,4]
        if res>0.5:
            if int(t_value[i])==1:
                num+=1
        else:
            if int(t_value[i])==0:
                num+=1 
    now = num/row
    if now>pre:
        break;

print("最后迭代的趋近值RMSE:")
print(bestSmell)
print("优化之后的参数:")
print(bestS)

print('之前的预测正确率:')
print(pre)
print('之后的预测正确率:')
print(now)




font_set = FontProperties(fname=r"c:\\\\windows\\\\fonts\\\\simsun.ttc", size=15)
plt.figure(1)
plt.plot(range(maxgen),fitness)
plt.xlabel('迭代次数',fontproperties=font_set)
plt.ylabel('RMSE',fontproperties=font_set)

plt.figure(2)
plt.plot(XBest,YBest,'r*')
plt.xlabel(u'X_axis',fontproperties=font_set)
plt.ylabel(u'Y_axis',fontproperties=font_set)
plt.show()

 

以上是关于果蝇优化算法:优化ZScore模型 python实现的主要内容,如果未能解决你的问题,请参考以下文章

基于果蝇优化算法的无线传感器网络的覆盖优化

果蝇优化算法

优化覆盖基于matlab果蝇算法求解无线传感器覆盖优化问题含Matlab源码 2215期

路径规划基于果蝇优化算法实现机器人路径规划matlab源码

路径规划基于果蝇优化算法实现机器人路径规划matlab源码

MATLAB自适应果蝇优化算法整定PID控制器参数—— 一阶带时延的被控对象