传送门(所有的实验都使用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,"单位");