实验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张图片

实验4 模糊搜索算法预测薄冰厚度_第2张图片

实验4 模糊搜索算法预测薄冰厚度_第3张图片

实验4 模糊搜索算法预测薄冰厚度_第4张图片

实验4 模糊搜索算法预测薄冰厚度_第5张图片

实验4 模糊搜索算法预测薄冰厚度_第6张图片

  实验4 模糊搜索算法预测薄冰厚度_第7张图片

实验4 模糊搜索算法预测薄冰厚度_第8张图片

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、运行截图:

    实验4 模糊搜索算法预测薄冰厚度_第9张图片

五、总结

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

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,"单位");
        

你可能感兴趣的:(计算智能实验&python)