【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

04-27 1324阅读 0评论

实验二: 洗衣机模糊推理系统实验

实验目的

理解模糊逻辑推理的原理及特点,熟练应用模糊推理。

实验内容

设计洗衣机洗涤时间的模糊控制。

实验要求

已知人的操作经验为:

  • “污泥越多,油脂越多,洗涤时间越长”;
  • “污泥适中,油脂适中,洗涤时间适中”;
  • “污泥越少,油脂越少,洗涤时间越短”。

    模糊控制规则如表1所示:

    xyz
    SDNGVS
    SDMGM
    SDLGL
    MDNGS
    MDMGM
    MDLGL
    LDNGM
    LDMGL
    LDLGVL

    其中:

    • SD(污泥少)、MD(污泥中)、LD(污泥多)、NG(油脂少)、MG(油脂中)、LG(油脂多)、VS(洗涤时间很短)、S(洗涤时间短)、M(洗涤时间中等)、L(洗涤时间长)、VL(洗涤时间很长)。

      1. 污泥隶属函数

      # 污泥隶属函数
      sludge['SD'] = fuzz.trimf(sludge.universe, [0, 0, 50])
      sludge['MD'] = fuzz.trimf(sludge.universe, [0, 50, 100])
      sludge['LD'] = fuzz.trimf(sludge.universe, [50, 100, 100])
      

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      2. 油脂隶属函数

      # 油脂隶属函数
      grease['NG'] = fuzz.trimf(grease.universe, [0, 0, 50])
      grease['MG'] = fuzz.trimf(grease.universe, [0, 50, 100])
      grease['LG'] = fuzz.trimf(grease.universe, [50, 100, 100])
      

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      3. 洗涤时间隶属度函数

      # 洗涤时间隶属度函数
      washing_time['VS'] = fuzz.trimf(washing_time.universe, [0, 0, 30])
      washing_time['S'] = fuzz.trimf(washing_time.universe, [0, 30, 60])
      washing_time['M'] = fuzz.trimf(washing_time.universe, [30, 60, 90])
      washing_time['L'] = fuzz.trimf(washing_time.universe, [60, 90, 120])
      washing_time['VL'] = fuzz.trimf(washing_time.universe, [90, 120, 120])
      

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      import numpy as np
      import skfuzzy as fuzz
      from skfuzzy import control as ctrl
      import matplotlib.pyplot as plt
      # 创建输入变量和输出变量
      sludge = ctrl.Antecedent(np.arange(0, 101, 1), 'sludge')
      grease = ctrl.Antecedent(np.arange(0, 101, 1), 'grease')
      washing_time = ctrl.Consequent(np.arange(0, 121, 1), 'washing_time')
      # 定义隶属函数
      sludge['SD'] = fuzz.trimf(sludge.universe, [0, 0, 50])
      sludge['MD'] = fuzz.trimf(sludge.universe, [0, 50, 100])
      sludge['LD'] = fuzz.trimf(sludge.universe, [50, 100, 100])
      grease['NG'] = fuzz.trimf(grease.universe, [0, 0, 50])
      grease['MG'] = fuzz.trimf(grease.universe, [0, 50, 100])
      grease['LG'] = fuzz.trimf(grease.universe, [50, 100, 100])
      washing_time['VS'] = fuzz.trimf(washing_time.universe, [0, 0, 30])
      washing_time['S'] = fuzz.trimf(washing_time.universe, [0, 30, 60])
      washing_time['M'] = fuzz.trimf(washing_time.universe, [30, 60, 90])
      washing_time['L'] = fuzz.trimf(washing_time.universe, [60, 90, 120])
      washing_time['VL'] = fuzz.trimf(washing_time.universe, [90, 120, 120])
      # 定义模糊控制规则
      rule1 = ctrl.Rule(sludge['SD'] & grease['NG'], washing_time['VS'])
      rule2 = ctrl.Rule(sludge['SD'] & grease['MG'], washing_time['M'])
      rule3 = ctrl.Rule(sludge['SD'] & grease['LG'], washing_time['L'])
      rule4 = ctrl.Rule(sludge['MD'] & grease['NG'], washing_time['S'])
      rule5 = ctrl.Rule(sludge['MD'] & grease['MG'], washing_time['M'])
      rule6 = ctrl.Rule(sludge['MD'] & grease['LG'], washing_time['L'])
      rule7 = ctrl.Rule(sludge['LD'] & grease['MG'], washing_time['M'])
      rule8 = ctrl.Rule(sludge['LD'] & grease['LG'], washing_time['L'])
      rule9 = ctrl.Rule(sludge['LD'] & grease['LG'], washing_time['VL'])
      # 创建控制系统
      washing_ctrl = ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8, rule9])
      washing = ctrl.ControlSystemSimulation(washing_ctrl)
      # 输入污泥和油脂值
      washing.input['sludge'] = 70
      washing.input['grease'] = 60
      # 进行模糊推理
      washing.compute()
      # 获取洗涤时间的输出
      washing_time.view(sim=washing)
      # 打印输出洗涤时间
      print("洗涤时间:", washing.output['washing_time'])
      # 绘制隶属度函数
      sludge.view()
      grease.view()
      washing_time.view()
      plt.show()
      

      4. 模糊控制规则表

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      注:SD(污泥少)、MD(污泥中)、LD(污泥多)、NG(油脂少)、MG(油脂中)、LG(油脂多)、VS(洗涤时间很短)、S(洗涤时间短)、M(洗涤时间中等)、L(洗涤时间长)、VL(洗涤时间很长)。

      推论结果立体图

      【人工智能】实验二: 洗衣机模糊推理系统实验与基础知识

      import numpy as np
      import skfuzzy as fuzz
      import matplotlib
      matplotlib.use('TkAgg')
      import matplotlib.pyplot as plt
      from skfuzzy import control as ctrl
      #定义输入输出的取值范围
      #  污泥和油脂范围为[0,100]
      #  洗涤时间范围为[0,120]
      x_stain = np.arange(0, 101, 1)
      x_oil = np.arange(0, 101, 1)
      x_time = np.arange(0, 121, 1)
      # 定义模糊控制变量
      stain = ctrl.Antecedent(x_stain, 'stain')
      oil = ctrl.Antecedent(x_oil, 'oil')
      time = ctrl.Consequent(x_time, 'time')
      # 生成模糊隶属函数
      #函数中的三元变量,第一个代表折线的起点,第二是最大值,第三是终点
      stain['SD'] = fuzz.trimf(x_stain, [0, 0, 50])  #定义污渍的三角隶属度函数横坐标
      stain['MD'] = fuzz.trimf(x_stain, [0, 50, 100])
      stain['LD'] = fuzz.trimf(x_stain, [50, 100, 100])
      oil['NG'] = fuzz.trimf(x_oil, [0, 0, 50]) #定义油污的三角隶属度函数横坐标
      oil['MG'] = fuzz.trimf(x_oil, [0, 50, 100])
      oil['LG'] = fuzz.trimf(x_oil, [50, 100, 100])
      time['VS'] = fuzz.trimf(x_time, [0, 0, 20]) #定义洗涤时间的三角隶属度函数横坐标
      time['S'] = fuzz.trimf(x_time, [0, 20, 50])
      time['M'] = fuzz.trimf(x_time, [20, 50, 80])
      time['L'] = fuzz.trimf(x_time, [50, 80, 120])
      time['VL'] = fuzz.trimf(x_time, [80, 120, 120])
      #采用解模糊方法——质心解模糊方式
      time.defuzzify_method='centroid'
      #规则
      rule1=ctrl.Rule(antecedent=((stain['SD'] & oil['NG'])),consequent=time['VS'],label='time=VS')
      rule2=ctrl.Rule(antecedent=((stain['SD'] & oil['MG'])|(stain['MD'] & oil['MG'])|(stain['LD'] & oil['NG'])),consequent=time['M'],label='time=M')
      rule3=ctrl.Rule(antecedent=((stain['SD'] & oil['LG'])|(stain['MD'] & oil['LG'])|(stain['LD'] & oil['MG'])),consequent=time['L'],label='time=L')
      rule4=ctrl.Rule(antecedent=((stain['MD'] & oil['NG'])),consequent=time['S'],label='time=S')
      rule5=ctrl.Rule(antecedent=((stain['LD'] & oil['LG'])),consequent=time['VL'],label='time=VL')
      # 系统和运行环境初始化
      rule=[rule1, rule2, rule3,rule4,rule5]
      time_ctrl = ctrl.ControlSystem(rule)
      wash_time = ctrl.ControlSystemSimulation(time_ctrl)
      #规则中带一些奇怪的规则,处理后输出
      for i in range(len(rule)):
          print("rule",i,end=":")
          for item in str(rule[i]):
              if(item!='\n'):
                  print(item,end="")
              else:
                  break
          print('\t')
      #画图
      stain.view()
      oil.view()
      time.view()
      #time.view()
      plt.show()
      #绘制3D图
      upsampled=np.linspace(0,101,21)#步距参数
      x,y=np.meshgrid(upsampled,upsampled)
      z=np.zeros_like(x)
      pp=[]
      for i in range(0,21):
          for j in range(0,21):
              wash_time.input['stain']=x[i,j]
              wash_time.input['oil']=y[i,j]
              wash_time.compute()
              z[i,j]=wash_time.output['time']
              pp.append(z[i,j])
      print('max:',max(pp))
      print('min:',min(pp))
      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.1,antialiased=True)
      ax.view_init(30,250)#观察角度
      plt.title('3D results')
      ax.set_xlabel('stain')
      ax.set_ylabel('oil')
      ax.set_zlabel('time')
      plt.show()
      

      (2)假定当前传感器测得的信息为x0(污泥)=60,y0(油脂)=70,采用模糊决策,给出模糊推理结果,并观察模糊推理的动态仿真环境,给出其动态仿真环境图。

      import numpy as np
      import matplotlib.pyplot as plt
      from matplotlib.animation import FuncAnimation
      # 导入NumPy库用于数学运算
      import numpy as np
      # 在Sludge函数和Grease函数中添加输入值检查
      def Sludge(a):
          sludge = [0, 0, 0]  # 默认隶属度为0,依次对应SD, MD, LD
          if a  100:
              a = 100
          if 0 'VS': '很短', 'S': '短', 'M': '中等', 'L': '长', 'VL': '很长'}
          print("模糊推理系统预测洗涤时间:{}{},预计洗涤时间:{}".format(time_sign,flag[time_sign], time_pre))
      

免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,1324人围观)

还没有评论,来说两句吧...

目录[+]