# -*- coding: utf-8 -*-
# 上記の一行がないと、コメント分の和文も全部エラーになる
# シンプルファジィ推論プログラム ver0.0 2015年12月15日
# メンバーシップ関数は、前件部、後件部ともに3つに固定した単純なもの
# 推論方式は、単純なmin-max重心法のみ
class condition_MF:
center = 0
width = 100
PV ="LESS"
def __init__(self, center, width, PV):
self.center = center
self.width = width
self.PV = PV
# x,yは、メンバーシップ関数上の座標を示す
def func(self, x):
if (self.PV == "LESS"):
if (x <= self.center - self.width):
y = 1.0
elif (x <= self.center):
y = - 1.0 / self.width * (x - self.center)
else:
y = 0.0
elif (self.PV == "ZERO"):
if (x <= self.center - self.width):
y = 0.0
elif (x <= self.center):
y = 1.0 / self.width * (x - self.center) + 1.0
elif (x <= self.center + self.width):
y = -1.0 / self.width * (x - self.center) + 1.0
else:
y = 0.0
elif (self.PV == "MORE"):
if (x <= self.center):
y = 0.0
elif (x <= self.center + self.width):
y = 1.0 / self.width * (x - self.center)
else:
y = 1.0
return y
class action_MF:
center = 0 # 値はダミー
width = 100 # 値はダミー
PV ="ZERO" # 値はダミー
y = 0.0 # 最大値で更新されていく
x = 0.0 # 値はダミー
def __init__(self, center, width, PV):
self.center = center
self.width = width
self.PV = PV
if (self.PV == "LESS"):
self.x = self.center - self.width
elif (self.PV == "ZERO"):
self.x = self.center
elif (self.PV == "MORE"):
self.x = self.center + self.width
else:
print "error"
# yを最大値で更新していく
def func_Max(self,b):
self.y = max(b, self.y)
# X座標を返す
def func_X(self):
return self.x
# (最大値で更新された、最後の)Y座標を返す
def func_Y(self):
return self.y
temp_High = condition_MF(20.0, 10.0, "MORE") # 温度が高い
temp_Middle = condition_MF(20.0, 10.0, "ZERO") #温度が普通
temp_Low = condition_MF(20.0, 10.0, "LESS")# 温度が低い
humi_High = condition_MF(50.0, 20.0, "MORE") # 湿度が高い
humi_Middle = condition_MF(50.0, 20.0, "ZERO") #湿度が普通
humi_Low = condition_MF(50.0, 20.0, "LESS")# 湿度が低い
switch_High = action_MF(0.0, 1.0, "MORE") # エアコンの温度設定を上げる("+1"にする)
switch_Middle = action_MF(0.0, 1.0, "ZERO")# エアコンの温度設定に何もしない("0"にする)
switch_Low = action_MF(0.0, 1.0, "LESS") # エアコンの温度設定を下げる("-1"にする)
# 入力値(温度27度、湿度57%)
t = 35.0
h = 80.0
# (1)「もし、温度が高くて、湿度が高ければ、エアコンの温度設定を下げる」
a1 = min(temp_High.func(t),humi_High.func(h))
print a1
switch_Low.func_Max(a1)
print "Low"
print switch_Low.func_Y()
# (2)「もし、温度が普通で、湿度が高ければ、何もしない」
a2 = min(temp_Middle.func(t),humi_High.func(h))
switch_Middle.func_Max(a2)
print "Middle"
print switch_Middle.func_Y()
# (3)「もし、温度が高くて、湿度が普通なら、エアコンの温度設定を下げる」
a3 = min(temp_High.func(t),humi_Middle.func(h))
switch_Low.func_Max(a3)
print "Low"
print switch_Low.func_Y()
# (4)「もし、温度が低くて、湿度が低ければ、エアコンの温度設定を上げる」
a4 = min(temp_Middle.func(t),humi_Low.func(h))
switch_High.func_Max(a4)
print "High"
print switch_High.func_Y()
# (5)(追加)もし温度が普通で、湿度が普通なら、何もしない
a5 = min(temp_Middle.func(t),humi_Middle.func(h))
switch_Middle.func_Max(a5)
print "Middle"
print switch_Middle.func_Y()
# 重心値を求める
# (ルールが推論空間を網羅していないと、ゼロ割が発生することがあるので注意)
reasoning = (switch_High.func_X() * switch_High.func_Y() + switch_Middle.func_X() *
switch_Middle.func_Y() + switch_Low.func_X() * switch_Low.func_Y())
/ (switch_High.func_Y() + switch_Middle.func_Y() + switch_Low.func_Y())
print "\n reasoning"
print reasoning