在上学的时候最早接触的智能控制算法就是模糊控制系统了,开始是使用MATLAB来进行软件实现的。工作后由于公司的版权意识,而且MATLAB原版很贵┑( ̄Д  ̄)┍,这条路就作罢了。后来接触Python,发现功能很强大,但在百度搜索中文资料的时候,很少有关于Python的模糊控制实现,但在搜索模糊控制模块的时候发现了scikit-fuzzy模块,它可以实现模糊控制系统。
安装包:pip install scikit-fuzzy
引用包:import skfuzzy as fuzz
其他使用的包引用如下:
import numpy as np
import skfuzzy.control as ctrl
以洗衣机洗衣粉投放量控制为例,令污渍stain和油渍oil为输入变量,洗衣粉powder为输出。假定输入和输出范围均为1~10。步骤如下:
步骤1.引用相关模块并设置各个变量范围:
import numpy as np import skfuzzy as fuzz import skfuzzy.control as ctrl
x_stain_range=np.arange(1,11,1,np.float32) x_oil_range=np.arange(1,11,1,np.float32) y_powder_range=np.arange(1,11,1,np.float32) |
步骤2.定义输入输出模糊集和其隶属度函数(使用三角函数),同时定义输出解模糊规则。模糊集如下:
污渍(小)=N,污渍(中)=M,污渍(大)=P
油渍(小)=N,油渍(中)=M,油渍(大)=P
洗衣粉(小)=N,洗衣粉(中)=M,洗衣粉(大)=P
代码:
# 创建模糊控制变量 x_stain=ctrl.Antecedent(x_stain_range, 'stain') x_oil=ctrl.Antecedent(x_oil_range, 'oil') y_powder=ctrl.Consequent(y_powder_range, 'powder')
# 定义模糊集和其隶属度函数 x_stain['N']=fuzz.trimf(x_stain_range,[1,1,5]) x_stain['M']=fuzz.trimf(x_stain_range,[1,5,10]) x_stain['P']=fuzz.trimf(x_stain_range,[5,10,10]) x_oil['N']=fuzz.trimf(x_oil_range,[1,1,5])
# 设定输出powder的解模糊方法——质心解模糊方式 y_powder.defuzzify_method='centroid' |
步骤3.建立模糊控制规则,并初始化控制系统和运行环境。规则如下表所示:
| 污渍stain | |||
N | M | P | ||
油渍 oil | N | N | N | M |
M | M | M | M | |
P | M | P | P |
代码:
# 输出为N的规则 rule0 = ctrl.Rule(antecedent=((x_stain['N'] & x_oil['N']) | (x_stain['M'] & x_oil['N']) ), consequent=y_powder['N'], label='rule N') # 输出为M的规则 rule1 = ctrl.Rule(antecedent=((x_stain['P'] & x_oil['N']) | (x_stain['N'] & x_oil['M']) | (x_stain['M'] & x_oil['M']) | (x_stain['P'] & x_oil['M']) | (x_stain['N'] & x_oil['P']) ), consequent=y_powder['M'], label='rule M') # 输出为P的规则 rule2 = ctrl.Rule(antecedent=((x_stain['M'] & x_oil['P']) | (x_stain['P'] & x_oil['P']) ), consequent=y_powder['P'], label='rule P') # 系统和运行环境初始化 system = ctrl.ControlSystem(rules=[rule0, rule1, rule2]) sim = ctrl.ControlSystemSimulation(system) |
步骤4.系统建立完成后,通过输入变量值来查看系统的输出
令输入污渍为4,油渍为7
代码:
sim.input['stain'] = 4 sim.input['oil'] = 7 sim.compute() # 运行系统 output_powder = sim.output['powder']
# 打印输出结果 print(output_powder) |
输出结果: 5.750558217558256 |
将上方所有代码合并即可运行。
参考:
https://pythonhosted.org/scikit-fuzzy/overview.html (可能因为是境外服务器的原因,有时会上不去)
https://github.com/scikit-fuzzy/scikit-fuzzy
202005261118,修改:依据weixin_46829907网友给出的意见,修改规则设置代码和输出。(对此给予感谢)