用Python的scikit-fuzzy库,5分钟搞定一个智能洗衣机模糊控制器

张开发
2026/5/4 22:39:48 15 分钟阅读

分享文章

用Python的scikit-fuzzy库,5分钟搞定一个智能洗衣机模糊控制器
用Python的scikit-fuzzy库快速构建智能洗衣机模糊控制器洗衣机作为现代家庭必备电器其智能化程度直接影响用户体验和能源效率。传统洗衣机采用固定程序控制无法根据衣物脏污程度动态调整洗涤时间而模糊控制技术正是解决这一痛点的完美方案。1. 环境准备与库安装在开始构建模糊控制器前需要确保Python环境已正确配置。推荐使用Python 3.8或更高版本以获得最佳的库兼容性。pip install scikit-fuzzy numpy matplotlib这三个核心库各司其职scikit-fuzzy提供模糊逻辑控制的完整工具链numpy处理数值计算和数组操作matplotlib可视化隶属函数和推理结果提示如果使用Jupyter Notebook进行开发可以添加%matplotlib inline魔法命令直接在单元格内显示图表。安装完成后通过以下代码验证库版本import skfuzzy as fuzz import numpy as np print(fscikit-fuzzy版本: {fuzz.__version__}) print(fnumpy版本: {np.__version__})2. 定义输入输出变量及隶属函数模糊控制的核心是建立输入输出的模糊集合。对于洗衣机场景我们需要定义两个输入变量污泥和油脂和一个输出变量洗涤时间。# 创建输入输出变量的取值范围 sludge ctrl.Antecedent(np.arange(0, 101, 1), sludge) # 污泥指数0-100 grease ctrl.Antecedent(np.arange(0, 101, 1), grease) # 油脂指数0-100 washing_time ctrl.Consequent(np.arange(0, 121, 1), washing_time) # 洗涤时间0-120分钟接下来定义各变量的隶属函数采用三角形隶属函数trimf实现# 污泥隶属函数 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]) # 很长可以通过以下代码可视化这些隶属函数sludge.view() grease.view() washing_time.view() plt.show()3. 构建模糊控制规则库规则库是将专家经验转化为可执行逻辑的关键。根据洗衣机控制经验我们建立9条核心规则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[L]) # 污泥多且油脂中→时间长 rule8 ctrl.Rule(sludge[LD] grease[LG], washing_time[VL]) # 污泥多且油脂多→时间很长这些规则反映了污泥越多油脂越多洗涤时间越长的基本控制逻辑。规则中的表示逻辑与操作scikit-fuzzy会自动处理模糊逻辑运算。4. 创建控制系统并测试将规则整合到控制系统中即可进行模糊推理washing_ctrl ctrl.ControlSystem([rule1, rule2, rule3, rule4, rule5, rule6, rule7, rule8]) washing ctrl.ControlSystemSimulation(washing_ctrl) # 设置输入值污泥70油脂60 washing.input[sludge] 70 washing.input[grease] 60 # 执行模糊推理 washing.compute() # 输出结果 print(f推荐洗涤时间: {washing.output[washing_time]:.2f}分钟) washing_time.view(simwashing) plt.show()对于污泥70、油脂60的输入系统可能输出约78分钟的洗涤时间。这个结果是通过以下步骤得到的模糊化将精确输入转换为隶属度污泥70 → MD(0.6), LD(0.4)油脂60 → MG(0.8), LG(0.2)规则评估激活相关规则并计算输出强度规则5(MDMG→M): min(0.6,0.8)0.6规则6(MDLG→L): min(0.6,0.2)0.2规则7(LDMG→L): min(0.4,0.8)0.4规则8(LDLG→VL): min(0.4,0.2)0.2聚合与去模糊化采用质心法计算最终输出5. 高级应用与优化技巧基础系统搭建完成后可以通过以下方法提升控制效果5.1 规则权重调整# 为重要规则设置权重 rule5 ctrl.Rule(sludge[MD] grease[MG], washing_time[M], weight0.8)5.2 隶属函数优化将三角形隶属函数改为梯形或高斯型可能获得更平滑的控制效果washing_time[M] fuzz.gaussmf(washing_time.universe, 60, 15)5.3 实时控制集成将模糊控制器与传感器数据流集成实现动态调整while True: sludge_level read_sludge_sensor() grease_level read_grease_sensor() washing.input[sludge] sludge_level washing.input[grease] grease_level washing.compute() set_washing_time(washing.output[washing_time]) time.sleep(10) # 每10秒更新一次5.4 性能评估指标建立评估体系量化控制效果指标计算公式优化目标洗净率(初始污渍-残余污渍)/初始污渍最大化能耗功率×时间最小化衣物磨损基于转速和时间的综合评估最小化通过调整隶属函数和规则可以在这些指标间取得平衡。例如测试发现# 测试不同输入组合的输出 test_cases [ (30, 40), # 轻度污渍 (60, 70), # 中度污渍 (90, 85) # 重度污渍 ] for s, g in test_cases: washing.input[sludge] s washing.input[grease] g washing.compute() print(f输入({s},{g}) → 输出:{washing.output[washing_time]:.1f}分钟)

更多文章