一、实验目的
理解模糊逻辑推理的原理及特点,熟练应用模糊推理
二、实验内容
用python设计洗衣机洗涤时间的模糊控制
三、实验要求
已知人的操作经验是
污泥越多,油脂越多,洗涤时间越长
污泥适中,油脂适中,洗涤时间适中
污泥越少,油脂越少,洗涤时间越短
x | y | z |
SD | NG | VS |
SD | MG | M |
SD | LG | L |
MD | NG | S |
MD | MG | M |
MD | LG | L |
LD | NG | M |
LD | MG | L |
LD | LG | VL |
其中SD(污泥少)、MD(污泥中)、LD(污泥多)、NG油脂少、MG油脂中、LG油脂多、VS洗涤时间很短、S洗涤时间短、M洗涤时间中等、L洗涤时间长、VL洗涤时间很长
(1)假设污泥、油脂、洗涤时间的论域分别为[0,100] [0,100] [0,120],设计相应的模糊推理系统,给出输入、输出语言变量的隶属函数图,模糊控制规则表和推论结果立体图。
(2)假定当前传感器测得的信息为x0(污泥)=60,y0(油脂)=70,采用模糊决策,给出模糊推理结果,并观察模糊推理的动态仿真环境,给出其动态仿真环境图。
第一小题,代码如下
#需要先安装pip install scikit-fuzzy
#released in 2021.2
"""
==========================================
Fuzzy Control Systems: The washtimeping Problem
==========================================
The 'washtimeping problem' is commonly used to illustrate the power of fuzzy logic
principles to generate complex behavior from a compact, intuitive set of
expert rules.
If you're new to the world of fuzzy control systems, you might want
to check out the `Fuzzy Control Primer
<../userguide/fuzzy_control_primer.html>`_
before reading through this worked example.
The washtimeping Problem
-------------------
Let's create a fuzzy control system which models how you might choose to washtime
at a restaurant. When washtimeping, you consider the oil and stain,
rated between 0 and 10. You use this to leave a washtime of between 0 and 25%.
We would formulate this problem as:
* Antecedents (Inputs)
- `oil`
* How was the oil on a scale of 0 to 100?
* Fuzzy set (ie, fuzzy value range): poor (SD), acceptable(MD), amazing (LD)
- `stain`
* Universe: stain on a scale of 0 to 100?
* Fuzzy set: bad, decent, great
* Consequents (Outputs)
- `washtime`
* Universe: How much should we washtime, on a scale of 0 to 120
* Fuzzy set: low, medium, high
* Rules
- refer to P302
* Usage
- If I tell this controller that I rated:
* the oil as 10, and
* the stain as 10,
- it would recommend :
* a 29 washtime.
Creating the washtimeping Controller Using the skfuzzy control API
-------------------------------------------------------------
We can use the `skfuzzy` control system API to model this. First, let's
define fuzzy variables
"""
import numpy as np
import skfuzzy as fuzz
from skfuzzy import control as ctrl
import matplotlib.pyplot as plt
# New Antecedent/Consequent objects hold universe variables and membership
# functions
stain = ctrl.Antecedent(np.arange(0, 101, 1), 'stain')
oil = ctrl.Antecedent(np.arange(0, 101, 1), 'oil')
washtime = ctrl.Consequent(np.arange(0, 120, 1), 'washtime')
# Auto-membership function population is possible with .automf(3, 5, or 7)
stain.automf(3, variable_type='quant')
oil.automf(3, variable_type='quant')
# Custom membership functions can be built interactively with a familiar,
# Pythonic API
washtime['VS'] = fuzz.trimf(washtime.universe, [0, 0, 20])
washtime['S'] = fuzz.trimf(washtime.universe, [0, 20, 50])
washtime['M'] = fuzz.trimf(washtime.universe, [20, 50, 70])
washtime['L'] = fuzz.trimf(washtime.universe, [50, 70, 100])
washtime['VL'] = fuzz.trimf(washtime.universe, [70, 100, 120])
"""
To help understand what the membership looks like, use the ``view`` methods.
These return the matplotlib `Figure` and `Axis` objects. They are persistent
as written in Jupyter notebooks; other environments may require a `plt.show()`
command after each `.view()`.
"""
# You can see how these look with .view()
stain['average'].view()
plt.show()
oil.view()
plt.show()
washtime.view()
plt.show()
"""
.. image:: PLOT2RST.current_figure
Fuzzy rules
-----------
Now, to make these triangles useful, we define the *fuzzy relationship*
between input and output variables.
"""
# low = SD or NG;average = MD or MG;high=LD or LG
rule1 = ctrl.Rule(stain['low'] & oil['low'], washtime['VS'])
rule2 = ctrl.Rule(stain['low'] & oil['average'], washtime['M'])
rule3 = ctrl.Rule(stain['low'] & oil['high'], washtime['L'])
rule4 = ctrl.Rule(stain['average'] & oil['low'], washtime['S'])
rule5 = ctrl.Rule(stain['average'] & oil['average'], washtime['M'])
rule6 = ctrl.Rule(stain['average'] & oil['high'], washtime['L'])
rule7 = ctrl.Rule(stain['high'] & oil['low'], washtime['M'])
rule8 = ctrl.Rule(stain['high'] & oil['average'], washtime['L'])
rule9 = ctrl.Rule(stain['high'] & oil['high'], washtime['VL'])
"""
.. image:: PLOT2RST.current_figure
Control System Creation and Simulation
---------------------------------------
Now that we have our rules defined, we can simply create a control system
via:
"""
washtimeping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9])
"""
In order to simulate this control system, we will create a
``ControlSystemSimulation``. Think of this object representing our controller
applied to a specific set of circumstances. For washtimeping, this might be washtimeping
Sharon at the local brew-pub. We would create another
``ControlSystemSimulation`` when we're trying to apply our ``washtimeping_ctrl``
for Travis at the cafe because the inputs would be different.
"""
washtimeping = ctrl.ControlSystemSimulation(washtimeping_ctrl)
"""
We can now simulate our control system by simply specifying the inputs
and calling the ``compute`` method.
"""
# Pass inputs to the ControlSystem using Antecedent labels with Pythonic API
# Note: if you like passing many inputs all at once, use .inputs(dict_of_data)
washtimeping.input['stain'] = 2
washtimeping.input['oil'] = 2
# Crunch the numbers
washtimeping.compute()
"""
Once computed, we can view the result as well as visualize it.
"""
print(washtimeping.output['washtime'])
washtime.view(sim=washtimeping)
plt.show()
第二小题代码在第一小题基础上进行稍微改变
改为 washtimeping.input['stain'] = 60 就可以了
washtimeping.input['oil'] = 70
运行结果如下:
好了,就这些,大家如果觉得有帮助的话就太好了,我做实验的时候就没有 找到这些。