Python模糊控制库使用(基本操作与仿真结果3D显示)

模糊控制库安装

模糊控制库github:链接: Github.
python pip安装:pip install scikit-fuzzy

示例

1.选择输入输出模糊集
2.定义输入输出隶属度函数(不同的隶属度函数,会导致不同的控制特性)
3.建立模糊控制表
4.建立模糊控制规则
5.模糊推理
6.反模糊化
7.输出结果绘制结果3D图
例子:输入为服务(service)和质量(quality)两个参数,输出为得到的小费(tip)

定义模糊控制变量

1.定义模糊控制变量,质量和服务的取值范围为[0,10],小费范围为[0,25]

x_qual = np.arange(0, 11, 1)
x_serv = np.arange(0, 11, 1)
x_tip  = np.arange(0, 26, 1)
quality = ctrl.Antecedent(x_qual, 'quality')
service = ctrl.Antecedent(x_serv, 'service')
tip = ctrl.Consequent(x_tip, 'tip')

模糊隶属函数

2.生成模糊隶属函数,这里是三角形隶属度函数,可以自己定义隶属度范围,也可以用automf函数自动生成

#定义质量差时的三角隶属度函数横坐标
quality['L'] = fuzz.trimf(x_qual, [0, 0, 5])  
quality['M'] = fuzz.trimf(x_qual, [0, 5, 10])
quality['H'] = fuzz.trimf(x_qual, [5, 10, 10])
#若使用automf自动生成代码为 
##names = ['L', 'M', 'H']
##quality.automf(names=names)  #自动分配
#定义服务差时的三角隶属度函数横坐标
service['L'] = fuzz.trimf(x_serv, [0, 0, 5]) 
service['M'] = fuzz.trimf(x_serv, [0, 5, 10])
service['H'] = fuzz.trimf(x_serv, [5, 10, 10])
#定义小费的三角隶属度函数横坐标
tip['L'] = fuzz.trimf(x_tip, [0, 0, 13]) 
tip['M'] = fuzz.trimf(x_tip, [0, 13, 25])
tip['H'] = fuzz.trimf(x_tip, [13, 25, 25])
#解模糊方法采用质心法
tip.defuzzify_method='centroid'
#可视化这些输入输出和隶属函数
# quality.automf(3) #自动分配几种程度NS ZO PS
#service.automf(3)
#quality.view()
# service.view()
# plt.show()

质量隶属度函数
服务隶属度函数

模糊规则

3.制定模糊规则,即服务,质量和小费的关系
规则表

rule1=ctrl.Rule(antecedent=((quality['L'] & service['L'])|(quality['L'] & service['M'])|(quality['M'] & service['L'])),consequent=tip['L'],label='Low')
rule2=ctrl.Rule(antecedent=((quality['M']&service['M'])|(quality['L']&service['H'])|(quality['H']&service['L'])),consequent=tip['M'],label='Medium')
rule3=ctrl.Rule(antecedent=((quality['M']&service['H'])|(quality['H']&service['M'])|(quality['H']&service['H'])),consequent=tip['H'],label='High')
#rule2.view() 	#这个图我没看懂,有哪位看懂了可以告知一下

激活模糊控制器

4.激活模糊控制器,输入质量值6.5,服务值为9.8时,输出小费的值,并绘制结果

tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])
tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
tipping.input['quality'] = 6.5
tipping.input['service'] = 9.8
tipping.compute()
print (tipping.output['tip'])
tip.view(sim=tipping)
plt.show()

结果

3D可视化结果

模糊控制库也可输出类似于MATLAB的3D结果图,代码如下:
逐间隔输入控制参数,输出结果并绘制在3D图中

upsampled = np.linspace(0, 11, 21)	      #这里的范围不能错,测试参数步距
x, y= np.meshgrid(upsampled, upsampled)
z = np.zeros_like(x)
##tipping.input['angle'] = 0
##tipping.input['distance'] = 0
##tipping.compute()
##print (tipping.output['out'])
#out.view(sim=tipping)
pp=[]
for i in range(0,21):
    for j in range(0,21):
        tipping.input['quality']=x[i, j]
        tipping.input['service'] = y[i, j]
        tipping.compute()
        z[i, j] = tipping.output['tip']
        pp.append(z[i,j])
print('max:',max(pp))
print('min:',min(pp))

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  
fig = plt.figure(figsize=(8, 8))    #定义画布大小
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis',linewidth=0.4, antialiased=True)
#cset = ax.contourf(x, y, z, zdir='z', offset=-2.5, cmap='viridis', alpha=0.5)
#cset = ax.contourf(x, y, z, zdir='x', offset=3, cmap='viridis', alpha=0.5)
#cset = ax.contourf(x, y, z, zdir='y', offset=3, cmap='viridis', alpha=0.5)
ax.view_init(30, 200)				#设置观察角度
plt.show()

下图为输出仿真结果3D图
在这里插入图片描述

完整代码

import numpy as np
import skfuzzy as fuzz
import matplotlib.pyplot as plt
from skfuzzy import control as ctrl
import math
#  质量和服务范围为[0,10]
#  小费范围为[0,25]
x_qual = np.arange(0, 11, 1)
x_serv = np.arange(0, 11, 1)
x_tip  = np.arange(0, 26, 1)
# 定义模糊控制变量
quality = ctrl.Antecedent(x_qual, 'quality')
service = ctrl.Antecedent(x_serv, 'service')
tip = ctrl.Consequent(x_tip, 'tip')
# 生成模糊隶属函数
quality['L'] = fuzz.trimf(x_qual, [0, 0, 5])  #定义质量差时的三角隶属度函数横坐标
quality['M'] = fuzz.trimf(x_qual, [0, 5, 10])
quality['H'] = fuzz.trimf(x_qual, [5, 10, 10])
service['L'] = fuzz.trimf(x_serv, [0, 0, 5])  #定义服务差时的三角隶属度函数横坐标
service['M'] = fuzz.trimf(x_serv, [0, 5, 10])
service['H'] = fuzz.trimf(x_serv, [5, 10, 10])
tip['L'] = fuzz.trimf(x_tip, [0, 0, 13])      #定义小费的三角隶属度函数横坐标
tip['M'] = fuzz.trimf(x_tip, [0, 13, 25])
tip['H'] = fuzz.trimf(x_tip, [13, 25, 25])

tip.defuzzify_method='centroid'
#可视化这些输入输出和隶属函数
# quality.automf(3)
#service.automf(3)#三种程度
#quality.view()
# service.view()
# plt.show()
#规则
rule1=ctrl.Rule(antecedent=((quality['L'] & service['L'])|(quality['L'] & service['M'])|(quality['M'] & service['L'])),consequent=tip['L'],label='Low')
rule2=ctrl.Rule(antecedent=((quality['M']&service['M'])|(quality['L']&service['H'])|(quality['H']&service['L'])),consequent=tip['M'],label='Medium')
rule3=ctrl.Rule(antecedent=((quality['M']&service['H'])|(quality['H']&service['M'])|(quality['H']&service['H'])),consequent=tip['H'],label='High')

rule2.view()
tipping_ctrl = ctrl.ControlSystem([rule1, rule2, rule3])
tipping = ctrl.ControlSystemSimulation(tipping_ctrl)
# 测试输出
# tipping.input['quality'] = 6.5
# tipping.input['service'] = 9.8
# tipping.compute()
# print (tipping.output['tip'])
# tip.view(sim=tipping)
# plt.show()

# 仿真结果3D图输出,使用下列代码时请注释掉上面的测试输出
upsampled = np.linspace(0, 11, 21)#这里的范围不能错
x, y= np.meshgrid(upsampled, upsampled)
z = np.zeros_like(x)
##tipping.input['angle'] = 0
##tipping.input['distance'] = 0
##tipping.compute()
##print (tipping.output['out'])
#out.view(sim=tipping)
pp=[]
for i in range(0,21):
    for j in range(0,21):

        tipping.input['quality']=x[i, j]
        tipping.input['service'] = y[i, j]
        tipping.compute()
        z[i, j] = tipping.output['tip']
        pp.append(z[i,j])
print('max:',max(pp))
print('min:',min(pp))

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D  
fig = plt.figure(figsize=(8, 8))   #定义画布大小
ax = fig.add_subplot(111, projection='3d')
surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='viridis',linewidth=0.4, antialiased=True)
#cset = ax.contourf(x, y, z, zdir='z', offset=-2.5, cmap='viridis', alpha=0.5)
#cset = ax.contourf(x, y, z, zdir='x', offset=3, cmap='viridis', alpha=0.5)
#cset = ax.contourf(x, y, z, zdir='y', offset=3, cmap='viridis', alpha=0.5)
ax.view_init(30, 200)#设置观察角度
plt.show()

附上模糊控制库网站,有更详细说明和例子:
链接: 模糊控制网站.

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RambOoO_l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值