博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python搭建模糊控制系统(scikit-fuzzy模块)
阅读量:2577 次
发布时间:2019-05-11

本文共 2483 字,大约阅读时间需要 8 分钟。

在上学的时候最早接触的智能控制算法就是模糊控制系统了,开始是使用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,修改:依据网友给出的意见,修改规则设置代码和输出。(对此给予感谢)

转载地址:http://pszfd.baihongyu.com/

你可能感兴趣的文章
强烈推荐 20 个免费和开源数据可视化工具
查看>>
“失败”的北漂十年,我真的尽力了。。。
查看>>
为什么使用 MD5 存储密码非常危险
查看>>
美团点评实时数仓实践
查看>>
Guava学习之Lists
查看>>
安装JUDDI服务器以及发布WSDL:第二部分,发布WSDL
查看>>
一文彻底搞懂令人疑惑的Java和JDK的版本命名!
查看>>
listview学习之simpleadapter详细介绍
查看>>
【Unity3D】 灯光学习
查看>>
Python3《机器学习实战》学习笔记(三):决策树实战篇之为自己配个隐形眼镜
查看>>
学生成绩信息管理c++
查看>>
Qt网络编程———TCP(1)
查看>>
java 构造方法中super()和this()
查看>>
Python安装lightFM时出现 error: Microsoft Visual C++ 14.0 or greater is required.报错的解决方法
查看>>
华为HCIA-datacom 学习笔记汇总目录
查看>>
第4章 Python 数字图像处理(DIP) - 频率域滤波1 - 傅里叶级数和变换简史
查看>>
v-if和v-show的区别
查看>>
Linux下创建用户,分组,配置jdk, tomcat
查看>>
Mysql 连接报错 Can't connect to MySQL server on “127.0.0.1” (61)
查看>>
HikariCP、MySQL Configuration 性能优化
查看>>