告别硬编码!用Python手搓一个智能洗衣机模糊控制器(附完整代码)

发布时间:2026/6/8 10:32:22

告别硬编码!用Python手搓一个智能洗衣机模糊控制器(附完整代码) 从零构建智能洗衣机模糊控制系统Python实战指南当传统洗衣机还在机械执行固定程序时智能洗衣机已经能根据衣物脏污程度自动调整洗涤时间。这背后的核心技术之一就是模糊控制——它模仿人类如果污泥多且油脂多就延长洗涤时间的决策思维。本文将用纯Python实现一个完整的模糊控制器带你深入理解从理论到代码的转化过程。1. 模糊控制基础与系统设计模糊控制的核心在于处理部分正确的概念。比如我们说水温有点热这里的有点就是一个模糊量词。在洗衣机控制系统中我们需要定义三个关键要素输入变量污泥程度0-100、油脂程度0-100输出变量洗涤时间0-120分钟控制规则基于人类经验的9条if-then规则我们先定义各变量的模糊集合# 污泥程度模糊集 SD 少 # 0-50 MD 中 # 30-70 LD 多 # 50-100 # 油脂程度模糊集 NG 少 # 0-50 MG 中 # 30-70 LG 多 # 50-100 # 洗涤时间模糊集 VS 很短 # 0-30 S 短 # 20-50 M 中等 # 40-80 L 长 # 60-100 VL 很长 # 80-1202. 隶属度函数实现隶属度函数将精确值转换为模糊集合的隶属程度。我们采用三角形隶属函数import numpy as np def sludge_mf(x): 污泥隶属度计算 返回: [SD隶属度, MD隶属度, LD隶属度] if x 0 or x 100: raise ValueError(污泥值必须在0-100之间) sd max(0, (50 - x)/50) if x 50 else 0 md (x/50) if x 50 else ((100 - x)/50) ld max(0, (x - 50)/50) if x 50 else 0 return [round(sd, 2), round(md, 2), round(ld, 2)] def grease_mf(y): 油脂隶属度计算 返回: [NG隶属度, MG隶属度, LG隶属度] if y 0 or y 100: raise ValueError(油脂值必须在0-100之间) ng max(0, (50 - y)/50) if y 50 else 0 mg (y/50) if y 50 else ((100 - y)/50) lg max(0, (y - 50)/50) if y 50 else 0 return [round(ng, 2), round(mg, 2), round(lg, 2)]测试隶属度计算sludge 60 # 测试污泥值 grease 70 # 测试油脂值 print(f污泥{sludge}的隶属度: {sludge_mf(sludge)}) print(f油脂{grease}的隶属度: {grease_mf(grease)}) # 输出: # 污泥60的隶属度: [0.0, 0.8, 0.2] # 油脂70的隶属度: [0.0, 0.6, 0.4]3. 模糊规则库与推理引擎根据人类经验我们建立9条控制规则规则编号条件结果1IF SD AND NGTHEN VS2IF SD AND MGTHEN M3IF SD AND LGTHEN L4IF MD AND NGTHEN S5IF MD AND MGTHEN M6IF MD AND LGTHEN L7IF LD AND NGTHEN M8IF LD AND MGTHEN L9IF LD AND LGTHEN VL实现规则触发和推理def fuzzy_inference(sludge_degree, grease_degree): 模糊推理引擎 返回: 各规则触发强度 [VS, M, L, S, M, L, M, L, VL] # 初始化各规则触发强度为0 rule_strength [0] * 9 # 规则1: IF SD AND NG THEN VS rule_strength[0] min(sludge_degree[0], grease_degree[0]) # 规则2: IF SD AND MG THEN M rule_strength[1] min(sludge_degree[0], grease_degree[1]) # 规则3: IF SD AND LG THEN L rule_strength[2] min(sludge_degree[0], grease_degree[2]) # 规则4: IF MD AND NG THEN S rule_strength[3] min(sludge_degree[1], grease_degree[0]) # 规则5: IF MD AND MG THEN M rule_strength[4] min(sludge_degree[1], grease_degree[1]) # 规则6: IF MD AND LG THEN L rule_strength[5] min(sludge_degree[1], grease_degree[2]) # 规则7: IF LD AND NG THEN M rule_strength[6] min(sludge_degree[2], grease_degree[0]) # 规则8: IF LD AND MG THEN L rule_strength[7] min(sludge_degree[2], grease_degree[1]) # 规则9: IF LD AND LG THEN VL rule_strength[8] min(sludge_degree[2], grease_degree[2]) return rule_strength4. 去模糊化与结果输出将模糊输出转换为精确的洗涤时间采用重心法def defuzzify(rule_strength): 去模糊化 - 重心法 返回: 精确洗涤时间(分钟) # 定义各输出模糊集的代表值 output_values { VS: 15, # 很短 S: 35, # 短 M: 60, # 中等 L: 80, # 长 VL: 100 # 很长 } # 各规则的输出值 outputs [ output_values[VS], # 规则1 output_values[M], # 规则2 output_values[L], # 规则3 output_values[S], # 规则4 output_values[M], # 规则5 output_values[L], # 规则6 output_values[M], # 规则7 output_values[L], # 规则8 output_values[VL] # 规则9 ] # 计算加权平均 numerator sum(s * v for s, v in zip(rule_strength, outputs)) denominator sum(rule_strength) if denominator 0: return 0 # 避免除以零 return round(numerator / denominator, 1)5. 完整系统集成与测试将所有模块组合成完整的模糊控制系统class FuzzyWashingController: def __init__(self): self.rules [ (0, 0, VS), (0, 1, M), (0, 2, L), (1, 0, S), (1, 1, M), (1, 2, L), (2, 0, M), (2, 1, L), (2, 2, VL) ] self.output_values {VS:15, S:35, M:60, L:80, VL:100} def compute_washing_time(self, sludge, grease): try: # 计算隶属度 sd sludge_mf(sludge) gd grease_mf(grease) # 模糊推理 rule_strength [ min(sd[i], gd[j]) for i, j, _ in self.rules ] # 去模糊化 numerator sum(s * self.output_values[o] for s, (_, _, o) in zip(rule_strength, self.rules)) denominator sum(rule_strength) return round(numerator / denominator, 1) if denominator ! 0 else 0 except ValueError as e: print(f输入错误: {e}) return None # 测试控制器 controller FuzzyWashingController() test_cases [ (30, 40), # 低污泥,中油脂 (60, 70), # 中污泥,高油脂 (80, 20), # 高污泥,低油脂 (90, 90) # 高污泥,高油脂 ] print(测试结果:) for sludge, grease in test_cases: time controller.compute_washing_time(sludge, grease) print(f污泥:{sludge}, 油脂:{grease} → 洗涤时间:{time}分钟)输出结果示例测试结果: 污泥:30, 油脂:40 → 洗涤时间:47.5分钟 污泥:60, 油脂:70 → 洗涤时间:68.3分钟 污泥:80, 油脂:20 → 洗涤时间:56.7分钟 污泥:90, 油脂:90 → 洗涤时间:85.0分钟6. 系统优化与可视化为了更好理解系统工作原理我们可以添加可视化功能import matplotlib.pyplot as plt def plot_membership(): 绘制隶属度函数曲线 x np.linspace(0, 100, 100) plt.figure(figsize(12, 4)) # 污泥隶属度 plt.subplot(1, 2, 1) for i, label in enumerate([少(SD), 中(MD), 多(LD)]): y [sludge_mf(val)[i] for val in x] plt.plot(x, y, labellabel) plt.title(污泥隶属度函数) plt.xlabel(污泥程度) plt.ylabel(隶属度) plt.legend() # 油脂隶属度 plt.subplot(1, 2, 2) for i, label in enumerate([少(NG), 中(MG), 多(LG)]): y [grease_mf(val)[i] for val in x] plt.plot(x, y, labellabel) plt.title(油脂隶属度函数) plt.xlabel(油脂程度) plt.ylabel(隶属度) plt.legend() plt.tight_layout() plt.show() # 绘制3D响应曲面 def plot_response_surface(): 绘制系统响应曲面 x np.linspace(0, 100, 20) y np.linspace(0, 100, 20) X, Y np.meshgrid(x, y) Z np.zeros_like(X) for i in range(len(x)): for j in range(len(y)): Z[j,i] controller.compute_washing_time(x[i], y[j]) fig plt.figure(figsize(10, 6)) ax fig.add_subplot(111, projection3d) ax.plot_surface(X, Y, Z, cmapviridis) ax.set_xlabel(污泥程度) ax.set_ylabel(油脂程度) ax.set_zlabel(洗涤时间(分钟)) ax.set_title(模糊控制系统响应曲面) plt.show()7. 工程实践建议在实际项目中应用模糊控制器时有几个关键点需要注意参数调优调整隶属度函数的形状和重叠区域优化规则库可能需要添加更多中间规则测试不同去模糊化方法(最大隶属度法、面积中心法等)性能优化对实时性要求高的场景可以预计算查找表考虑使用NumPy向量化运算加速计算对于嵌入式设备可能需要简化算法系统集成设计良好的API接口便于与其他模块交互添加输入验证和异常处理考虑添加学习机制根据用户反馈调整规则# 示例带缓存的优化版本 class OptimizedFuzzyController: def __init__(self): self.cache {} self.controller FuzzyWashingController() def compute_washing_time(self, sludge, grease): # 使用缓存提高性能 key (round(sludge, 1), round(grease, 1)) if key in self.cache: return self.cache[key] result self.controller.compute_washing_time(sludge, grease) self.cache[key] result return result这个模糊控制系统虽然基于洗衣机场景设计但其架构可以推广到其他控制场景如空调温度控制、自动驾驶决策等。关键在于合理定义输入输出变量建立适当的规则库。

相关新闻