模糊推理是一种基于行为的仿生推理方法, 主要用来解决带有模糊现象的复杂推理问题。由于模糊现象的普遍存在, 模糊推理系统被广泛的应用。模糊推理系统主要由模糊化、模糊规则库、模糊推理方法以及去模糊化组成, 其基本流程如图 1 所示。
■ 图 1 模糊推理流程图
传统的模糊推理是一种基于规则的控制, 它通过语言表达的模糊性控制规则实现对难以精确描述系统的控制, 在设计中不需要建立被控对象的精确数学模型。T-S 模糊推理模型是将正常的模糊推理规则及其推理转换成一种数学表达形式。T-S 模型本质上是将全局非线性系统通过模糊划分建立多个简单的线性关系, 对多个模型的输出再进行模糊推理和判决, 可以表示复杂的非线性关系。
01、T-S 模型的模糊推理过程
T-S 模糊模型基本思想是用线性状态空间模型作为后件表达每条语句对应所表证的局部动态特征, 则全局的模糊模型就由这些线性模型通过隶属度函数综合而成, 全局模型是一个非线性模型, 利用模糊逻辑系统的非线性映射能力, 就可以逼近一个复杂的非线性系统,而且能够对定义在一个致密集上的非线性系统做到任意精度上的一致逼近。
❶多输入多规则模糊推理系统的工作原理:
① 通过模糊化模块将输入的精确量进行模糊化处理, 转换成给定论域上的模糊集合。
② 激活规则库中对应的模糊规则。
③ 选用合适的模糊推理方法, 根据模糊事实推理出结果。
④ 对模糊结果进行去模糊化处理。
❷模糊化的原则及方法:
原则 1 : 在精确值处模糊集合的隶属度最大。
原则 2: 当输入有干扰时, 模糊化的结果具有一定的抗干扰能力。
原则 3 : 模糊化运算应尽可能简单。
各约束的隶属函数为(本实验采用)
当隶属度函数为 f(x) 时, 模糊化隶属度函数准则(本实验采用) :
❸模糊规则库(本实验采用) :
IF 科研经费低 AND 人数高 AND 作品数低 AND 获奖数低 THEN 评价差
IF 科研经费高 AND 人数低 AND 作品数低 AND 获奖数高 THEN 评价高
IF 科研经费中 AND 人数中 AND 作品数中 AND 获奖数中 THEN 评价中
IF 科研经费高 AND 人数高 AND 作品数低 AND 获奖数低 THEN 评价差
对于评价的等级高中差分别用 3 、2、1 表示。约束等级划分标准:
❹去模糊化的原则与方法:
原则 1 : 所得到的精确值, 能够直观地表达该模糊集合。
原则 2: 去模糊化运算要足够简单, 保证模糊推理系统实时使用。
原则 3 : 模糊集合的微小变化不会使精确值发生大幅变化。
采用最小法和乘积法进行去模糊化处理(本实验采用) 。
02、T-S 模型的模糊推理实验
具体实现及主要代码如下:
import math
W={}
MIN={}
MUL={}
jf=0
rs=0
zp=0
hj=0
pj={}
class T_S:
def fun1(m):#科研经费隶属度函数
if m<=5:
return 0
if m>5 and m<=20:
return ((m-5)/15)*((m-5)/15)
if m>20:
return 1
def fun2(m):#人数隶属度函数
if m<=5:
return 0
if m>5 and m<=10:
return ((m-5)/5)*((m-5)/5)
if m>10:
return 1
def fun3(m):#作品数隶属度函数
if m<=10:
return 0
if m>10 and m<=30:
return ((m-10)/20)*((m-10)/20)
if m>30:
return 1
def fun4(m):#获奖数隶属度函数
if m<=5:
return 0
if m>5 and m<=15:
return ((m-5)/10)*((m-5)/10)
if m>15:
return 1
def rule1(self):
W[0]=math.sqrt(1-T_S.fun1(jf))
W[1] = math.sqrt(T_S.fun2(rs))
W[2] = math.sqrt(1 - T_S.fun3(zp))
W[3] = math.sqrt(1 - T_S.fun4(hj))
pj[0]=1
for i in range(4):
if(W[i]<0.0000000001):
W[i]=0
minTemp=999#取小法
for i in range(4):
if(W[i]!=999):
minTemp=min(minTemp,W[i])
MIN[0]=minTemp
mulTemp=1#乘积法
for i in range(4):
if(W[i]!=999):
mulTemp=mulTemp*W[i]
MUL[0]=mulTemp
def rule2(self):
W[0] = math.sqrt(T_S.fun1(jf))
W[1] = math.sqrt(1-T_S.fun2(rs))
W[2] = math.sqrt(1-T_S.fun3(zp))
W[3] = math.sqrt(T_S.fun4(hj))
pj[1]=3
for i in range(4):
if(W[i]<0.0000000001):
W[i]=0
minTemp=999#取小法
for i in range(4):
if(W[i]!=999):
minTemp=min(minTemp,W[i])
MIN[1]=minTemp
mulTemp=1
for i in range(4):
if(W[i]!=999):
mulTemp=mulTemp*W[i]
MUL[1]=mulTemp
def rule3(self):
W[0] = min(T_S.fun1(jf),1-T_S.fun1(jf))
W[1] = min(T_S.fun2(rs),1-T_S.fun2(rs))
W[2] = min(T_S.fun3(zp),1-T_S.fun3(zp))
W[3] = min(T_S.fun4(hj),1-T_S.fun4(hj))
pj[2]=2
for i in range(4):
if(W[i]<0.0000000001):
W[i]=0
minTemp=999#取小法
for i in range(4):
if(W[i]!=999):
minTemp=min(minTemp,W[i])
MIN[2]=minTemp
mulTemp=1
for i in range(4):
if(W[i]!=999):
mulTemp=mulTemp*W[i]
MUL[2]=mulTemp
def rule4(self):
W[0] = math.sqrt(T_S.fun1(jf))
W[1] = math.sqrt(T_S.fun2(rs))
W[2] = math.sqrt(1-T_S.fun3(zp))
W[3] = math.sqrt(1-T_S.fun4(hj))
pj[3]=1
for i in range(4):
if(W[i]<0.0000000001):
W[i]=0
minTemp=999#取小法
for i in range(4):
if(W[i]!=999):
minTemp=min(minTemp,W[i])
MIN[3]=minTemp
mulTemp=1
for i in range(4):
if(W[i]!=999):
mulTemp=mulTemp*W[i]
MUL[3]=mulTemp
if __name__ == '__main__':
jf=int(input("经费:"))
rs=int(input("人数:"))
zp=int(input("作品:"))
hj=int(input("获奖:"))
T_S.rule1("")
T_S.rule2("")
T_S.rule3("")
T_S.rule4("")
MINEVA=0
MULEVA=0
min_sum1 = min_sum2 = mul_sum1 = mul_sum2 = 0
for i in range(4):
min_sum1+=MIN[i]*pj[i]
min_sum2+=MIN[i]
mul_sum1+=MUL[i]*pj[i]
mul_sum2+=MUL[i]
MINEVA=min_sum1/(min_sum2+0.000000001)
MULEVA=mul_sum1/(mul_sum2+0.000000001)
print("取小法评价:"+str(MINEVA))
print("乘积法评价:" +str(MULEVA))
if(MINEVA>=0 and MINEVA<=1.5):
print("评价差")
elif (MINEVA>1.5 and MINEVA<=2.5):
print("评价中")
elif (MINEVA>2.5):
print("评价高")
复制代码
实验结果如图 2 所示。
■ 图 2 实验结果
评论