实验4 模糊搜索算法预测薄冰厚度

162 阅读4分钟

传送门(所有的实验都使用python实现)

实验1 BP神经网络实验

实验2 som网实验

实验3 hopfield实现八皇后问题

实验4 模糊搜索算法预测薄冰厚度

实验5 遗传算法求解tsp问题

实验6 蚁群算法求解tsp问题

实验7 粒子群优化算法求解tsp问题

实验8 分布估计算法求解背包问题

实验9 模拟退火算法求解背包问题

实验10 禁忌搜索算法求解tsp问题

 

一、实验目的

理解并使用模糊搜索算法

二、实验内容

实现基于模糊逻辑的覆冰厚度预测

三、实验环境

使用Python3.0 在 eclipse进行编辑

四、实验步骤

1、输入介绍:

选取各个时刻点的环境温度(environmental tem-perature, ET)、环境湿(environmentalhumidity ,EH)、环境风速(environmental windspeed, EW) 导线温度(conductor temperature, CT)。4 个覆冰影响因素作为覆冰厚度预测模型的输入变量 ,模型的输出为各覆冰厚度单位值。

2、反模糊化:

五个模糊子集

NB(Negative Big 很低/小)、NS(Negative Small 较低/小)、O(Zero 中等)、PS(Positive Small 较高/大)以及 PB(Positive Big 很高/大)

分别反模糊化成具体数值代表厚度0.2 0.4 0.6 0.8 1

 

3、隶属度函数计算

根据论文中的隶属度函数图形得出的函数表达式如下

 

4、覆冰单位厚度计算:

(1)总表达式

因为没有实际的模糊规则表,最后的输出值G(K)为薄冰的单位厚度。

单位厚度 G=1/4(ET )+1/4(EH )+1/4(EW )+1/4(CT )

ET 为环境温度隶属的强度,EH 为环境湿度隶属的强度 ; EW 为环境风速隶属的强度;CT为导线的温度

(2)ET,EH,EW CT计算

对于温度(ET)隶属的强度计算,由输入的温度值x,由隶属度函数计算出五个模糊子集HB,NS,O,PS,PB的隶属度,再分别乘以反模糊值,最后取均值。

具体表达式如下:

强度值ET = 0.2*HB*0.2+0.4*NS*0.2+0.6*O*0.2+0.8*PS*0.2+1.0*PB*0.2;

EH,EW,CT的计算方式与之相同。

5、运行截图:

   

五、总结

    计算某个条件的隶属度时,如果存在多个条件符合,我采用了取均值的方法,在实际的数据测试中,我发现误差较大。采取“去小留大”,也许可以使得实验结果更准确。

python源码

#coding:gbk
global HB,NS,O,PS,PB; #反模糊化分别代表厚度0.2 0.4 0.6 0.8 1
NS=O=PS=PB=HB = 0.0; 
def calc(a,x,b):       #隶属度计算函数
    return a*x+b;
def ET(x):         #温度隶属度计算
    ma = 0.0;
    if(x<-20 or x>-10.0):
        HB=0
    else:
        HB=calc(0.1,x,1.0);
    ma += 0.2*HB*0.2;
    if(x<-20 or x>0):
        NS=0
    else:
        if (x>=-20 and x <= -10):
            NS=calc(0.1,x,2.0);
        else:
            NS=calc(-0.1,x,0);
    ma += 0.4*NS*0.2;
    if(x<-10 or x>10):
        O=0
    else:
        if (x>=-10 and x <= 0):
            O=calc(0.1,x,1);
        else:
            O=calc(-0.1,x,1.0);
    ma += 0.6*O*0.2;
    if(x<0 or x>20):
        PS=0
    else:
        if (x>=0 and x <= 10):
            PS=calc(0.1,x,0);
        else:
            PS=calc(-0.1,x,2.0);
    ma += 0.8*PS*0.2;
    if(x<10or x>20):
        PB=0
    else:
        PB=calc(0.1,x,-1.0);
    ma += 1*PB*0.2;
    return ma
def EH(x):               #湿度隶属度计算
    ma = 0;
    if(x<0 or x>25):
        HB=0
    else:
        HB=calc(-0.04,x,1.0);
    ma += 0.2*HB*0.2;
    if(x<0 or x>50):
        NS=0
    else:
        if (x>=0 and x <= 25):
            NS=calc(0.04,x,0.0);
        else:
            NS=calc(-0.04,x,2.0);
    ma += 0.4*NS*0.2;
    if(x<25 or x>75):
        O=0
    else:
        if (x>=25 and x <= 50):
            O=calc(0.04,x,-1);
        else:
            O=calc(-0.04,x,3.0);
    ma += 0.6*O*0.2;
    if(x<50 or x>100):
        PS=0
    else:
        if (x>=50and x <= 75):
            PS=calc(0.04,x,-2.0);
        else:
            PS=calc(-0.04,x,4.0);
    ma += 0.8*PS*0.2;
    if(x<75 or x>100):
        PB=0
    else:
        PB=calc(0.04,x,-3.0);
    ma = 1*PB*0.2;
    return ma
def EW(x):       #环境风扇隶属度计算
    ma = 0;
    if(x<0 or x>5):
        HB=0
    else:
        HB=calc(-0.2,x,1.0);
    ma += 0.2*HB*0.2;
    if(x<0 or x>10):
        NS=0
    else:
        if (x>=0 and x <= 5):
            NS=calc(0.2,x,0.0);
        else:
            NS=calc(-0.2,x,2.0);
    ma += 0.4*NS*0.2;
    if(x<5 or x>15):
        O=0
    else:
        if (x>=5 and x <= 10):
            O=calc(0.2,x,-1);
        else:
            O=calc(-0.2,x,3.0);
    ma += 0.6*O*0.2;
    if(x<10 or x>20):
        PS=0
    else:
        if (x>=10and x <= 15):
            PS=calc(0.2,x,-2.0);
        else:
            PS=calc(-0.2,x,4.0);
    ma += 0.8*PS*0.2;
    if(x<15 or x>20):
        PB=0
    else:
        PB=calc(0.2,x,-3.0);
    ma += 1*PB*0.2;
    return ma    
def CT(x):         #导线温度隶属度计算
    ma = 0.0;
    if(x<-20 or x>-10.0):
        HB=0
    else:
        HB=calc(0.1,x,1.0);
    ma += 0.2*HB*0.2;
    if(x<-20 or x>0):
        NS=0
    else:
        if (x>=-20 and x <= -10):
            NS=calc(0.1,x,2.0);
        else:
            NS=calc(-0.1,x,0);
    ma += 0.4*NS*0.2;
    if(x<-10 or x>10):
        O=0
    else:
        if (x>=-10 and x <= 0):
            O=calc(0.1,x,1);
        else:
            O=calc(-0.1,x,1.0);
    ma += 0.6*O*0.2;
    if(x<0 or x>20):
        PS=0
    else:
        if (x>=0 and x <= 10):
            PS=calc(0.1,x,0);
        else:
            PS=calc(-0.1,x,2.0);
    ma += 0.8*PS*0.2;
    if(x<10or x>20):
        PB=0
    else:
        PB=calc(0.1,x,-1.0);
    ma += 1*PB*0.2;
    return ma
print("输入温度 范围-20 ~20    ")  
x=input()
a = float (x);
print("输入湿度 范围0 ~100    ")  
x=input()
b = float (x);
print("输入风速  范围0 ~20   ")  
x=input()
c = float (x);
print("输入导线温度 范围-20 ~20    ")  
x=input()
d = float (x);
#print(a,"+",b,"+",c);
ans = round(1.0/4*ET(a)+1.0/4*EH(b)+1.0/4*EW(c)+1.0/4*EW(c)+1.0/4*ET(d),3)#取均值输出强度
print("覆冰厚度为",ans,"单位");
        

本文已参与「新人创作礼」活动,一起开启掘金创作之路