人工智能基础 | Python实现 洗衣机模糊推理系统

运行环境


Pycharm + Anaconda3

已知一组污泥和油脂两个参数的模糊集合,以及对应的洗涤时间推理的结果。

现再给出一组污泥和油脂的模糊集合,进行模糊推理,推出洗涤时间的模糊集合

最后进行模糊决策,选择洗涤时间的档次,采用最大隶属度加权平均法 两种方法

文章目录

  • 运行环境
  • 1. 模糊控制规则
  • 2. 模糊规则控制矩阵
  • 3. 模糊关系
  • 4. 模糊推理
  • 5.模糊决策
    • 5.1 最大隶属度法
    • 5.2 加权平均法
  • 6. 最终代码

1. 模糊控制规则


“污泥/油脂越多,洗涤时间越长”;
“污泥/油脂适中,洗涤时间适中”;
“污泥/油脂越少,洗涤时间越短”。

测试样例:
污泥 = [0,0.83,0.6]
油脂 = [0, 0.71, 0.7]

污泥和油脂都分为三个档次1、2、3 分别表示程度低、中、高
洗涤时间则分为五个档次,1、2、3、4、5分别表示时间很短、较短、中等、较高、很高

现给出控制的模糊集合污泥[0, 0.5, 1] , 油脂[0, 0.5, 1] , 洗涤时间[0, 0.25, 0.5, 0.75, 1]

其中的值表示隶属度,而对应的元素则省略。

程序运行逻辑图
人工智能基础 | Python实现 洗衣机模糊推理系统_第1张图片

2. 模糊规则控制矩阵


该矩阵是通过对污泥和油脂两个模糊集合进行模糊合成的结果,采用的是取大运算(V)。
实现代码

def getRuleMatrix(a, b, r, c):
    data = np.zeros(shape=(r, c), dtype=float)
    for i in range(len(a)):
        for j in range(len(b)):
                data[i][j] = max(a[i], b[j])
    return data
A = getRuleMatrix([0, 0.5, 1], [0, 0.5, 1], 3, 3)

结果
[[0. 0.5 1. ]
[0.5 0.5 1. ]
[1. 1. 1. ]]

3. 模糊关系


规则控制矩阵和洗涤时间的模糊关系,表示的是污泥和油脂进行模糊合成后的模糊集合洗涤时间再次进行模糊合成的结果

需要注意的是,再次运算是[3 x 3] 的矩阵与 [1 x 5] 矩阵的计算,这里采用降维将[3 x 3] 转化为[9 x 1] 这样就可以和[1 x 5]矩阵进行模糊合成,最后生成一个[9 x 5] 的模糊关系矩阵。而且这次运算是Λ取小。
实现代码

def getRelation(A, B):
    A = [y for x in A for y in x]
    data = np.zeros(shape=(len(A), len(B)), dtype=float)
    for i in range(len(A)):
        for j in range(len(B)):
                data[i][j] = min(A[i], B[j])
    return data
B = getRelation(A, [0, 0.25, 0.5, 0.75, 1])

结果
[[0. 0. 0. 0. 0. ]
[0. 0.25 0.5 0.5 0.5 ]
[0. 0.25 0.5 0.75 1. ]
[0. 0.25 0.5 0.5 0.5 ]
[0. 0.25 0.5 0.5 0.5 ]
[0. 0.25 0.5 0.75 1. ]
[0. 0.25 0.5 0.75 1. ]
[0. 0.25 0.5 0.75 1. ]
[0. 0.25 0.5 0.75 1. ]]

4. 模糊推理


所谓模糊推理就是根据第二组的 污泥 和 油脂的模糊集合进行两次模糊合成。

第一次,污泥和油脂之间进行模糊合成,生成[3 x 3] 的矩阵,这里降维到 [1 x 9] 。

第二次,用第一次的模糊关系矩阵与之前[9 x 5] 的模糊关系矩阵进行 模糊推理(先Λ后V)

最后得到一个 [1 x 5] 的矩阵, 比如[ a, b, c, d, e] ,其中的值表示对于每个洗涤时间的隶属度大小

比如若 e = 0.8 , 则说明洗涤时间很快的可能性较大。

模糊推理实现代码

def getResult(A, B):
    A = [y for x in A for y in x]
    data = [-1 for _ in range(len(B[0]))]
    for j in range(len(B[0])):
        for i in range(len(A)):
            data[j] = max(data[j], min (A[i], B[i][j]))
    return data

sludge = [float(x) for x in input('输入污泥指数:').split(" ")]
grease = [float(x) for x in input('输入油脂指数: ').split(" ")]

AA = getRuleMatrix(sludge, grease, 3, 3)
BB = getResult(AA, B)

结果
AA
[[0. 0.71 0.7 ]
[0.83 0.83 0.83]
[0.6 0.71 0.7 ]]
BB
[0.0, 0.25, 0.5, 0.75, 0.83]

5.模糊决策


根据最后洗涤时间的模糊集合进行模糊决策。

5.1 最大隶属度法


选择隶属度最大的元素,基于之前的代码,BB列表,表示最终的洗涤时间模糊集合,其中的值表示隶属度
[0, 0.25, 0.5, 0.75, 0.83] 分别对应五种洗涤时间的程度、很短1、短2、中等3、快4、很快5。
很明显 0.83 是最大的隶属度,故结果就是5。
实现代码

[i+1 for i in range(len(BB)) if BB[i] == max(BB)][0]

5.2 加权平均法


仍然以[0, 0.25, 0.5, 0.75, 0.83] 为例,计算过程为 ( 0 * 1 + 0.25 * 2 + 0.5 * 3 + 0.75 * 4 + 0.83 * 5) / (0 +0.25+0.5+0.75+0.83)

最终的结果可能带小数,则采用四舍五入的方式。
实现代码

int(sum([(i+1) * BB[i] for i in range(len(BB))]) / sum(BB) + 0.5)

6. 最终代码


import numpy as np
def getRuleMatrix(a, b, r, c):
    data = np.zeros(shape=(r, c), dtype=float)
    for i in range(len(a)):
        for j in range(len(b)):
                data[i][j] = max(a[i], b[j])
    return data
def getRelation(A, B):
    A = [y for x in A for y in x]
    data = np.zeros(shape=(len(A), len(B)), dtype=float)
    for i in range(len(A)):
        for j in range(len(B)):
                data[i][j] = min(A[i], B[j])
    return data
A = getRuleMatrix([0, 0.5, 1], [0, 0.5, 1], 3, 3)
B = getRelation(A, [0, 0.25, 0.5, 0.75, 1])

def getResult(A, B):
    A = [y for x in A for y in x]
    data = [-1 for _ in range(len(B[0]))]
    for j in range(len(B[0])):
        for i in range(len(A)):
            data[j] = max(data[j], min (A[i], B[i][j]))
    return data

sludge = [float(x) for x in input('输入污泥指数:').split(" ")]
grease = [float(x) for x in input('输入油脂指数: ').split(" ")]

AA = getRuleMatrix(sludge, grease, 3, 3)
BB = getResult(AA, B)

print('最大隶属度法:' , [i+1 for i in range(len(BB)) if BB[i] == max(BB)][0])
print('加权平均法:', int(sum([(i+1) * BB[i] for i in range(len(BB))]) / sum(BB) + 0.5))

你可能感兴趣的:(python,人工智能,pycharm)