Python搭建模糊控制系统(scikit-fuzzy模块)

在上学的时候最早接触的智能控制算法就是模糊控制系统了,开始是使用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])
x_oil['M']=fuzz.trimf(x_oil_range,[1,5,10])
x_oil['P']=fuzz.trimf(x_oil_range,[5,10,10])
y_powder['N']=fuzz.trimf(y_powder_range,[1,1,5])
y_powder['M']=fuzz.trimf(y_powder_range,[1,5,10])
y_powder['P']=fuzz.trimf(y_powder_range,[5,10,10])

 

# 设定输出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网友给出的意见,修改规则设置代码和输出。(对此给予感谢)

你可能感兴趣的:(Python,机器学习,python,scikit-fuzzy,模糊控制,skfuzzy)