Scikit-Fuzzy规则生成失败:'DiGraph'对象无add_path属性问题
解决Scikit-Fuzzy模糊规则生成时的AttributeError问题
我之前也踩过这个坑!你遇到的AttributeError: 'DiGraph' object has no attribute 'add_path'主要是两个原因导致的,咱们一步步来解决:
一、先修正代码里的逻辑错误
你把输出变量**小费(tip)**错误地定义成了Antecedent(输入变量),它应该是Consequent(输出变量);另外最后输出的键名也写错了,还有matplotlib的导入名也打错了。先把这些基础错误改了:
import matplotlib.pyplot as plt # 修正拼写错误:pit → plt import skfuzzy as fuz import numpy as np from skfuzzy import control as ctrl # 输入变量:服务质量、食物质量 service = ctrl.Antecedent(np.arange(0, 11, 1), 'service') quality = ctrl.Antecedent(np.arange(0, 11, 1), 'quality') # 输出变量:小费 → 必须用Consequent,不是Antecedent! tip = ctrl.Consequent(np.arange(0, 26, 1), 'tip') # 自动生成输入变量的模糊子集 service.automf(3) quality.automf(3) # 定义输出变量的模糊子集 tip['low'] = fuz.trimf(tip.universe, [0, 0, 13]) tip['medium'] = fuz.trimf(tip.universe, [0, 13, 25]) tip['high'] = fuz.trimf(tip.universe, [13, 25, 25]) # 模糊规则(这里调整了规则2的逻辑,更符合常理,你可以按需修改) rule1 = ctrl.Rule(quality['poor'] | service['poor'], tip['low']) rule2 = ctrl.Rule(quality['average'] | service['average'], tip['medium']) rule3 = ctrl.Rule(quality['good'] | service['good'], tip['high']) # 创建控制系统并运行仿真 tip_ctrl = ctrl.ControlSystem([rule1, rule2, rule3]) tip_sim = ctrl.ControlSystemSimulation(tip_ctrl) # 输入测试值 tip_sim.input['service'] = 2.1 tip_sim.input['quality'] = 5.6 tip_sim.compute() # 输出结果(键名是'tip',不是变量t) print(f"计算出的小费金额:{tip_sim.output['tip']:.2f}") # 可视化结果(可选) # tip.view(sim=tip_sim) # plt.show()
二、解决NetworkX版本兼容性问题
这个是核心报错原因:Scikit-Fuzzy旧版本依赖NetworkX 1.x的API,而NetworkX 2.0之后移除了DiGraph.add_path()方法,所以调用时会报错。你有两种解决方式:
选项1:降级NetworkX到兼容版本(最简单)
直接在终端执行命令,安装适配的NetworkX版本:
pip install networkx==1.11
安装完成后重新运行代码,就能正常工作了。
选项2:修改Scikit-Fuzzy源码适配NetworkX 2.x(适合不想降级的情况)
找到你Scikit-Fuzzy安装目录下的rule.py文件(比如你报错里的路径/home/amavasi/.local/lib/python3.7/site-packages/skfuzzy/control/rule.py),定位到第295行左右的graph.add_path([t, self]),替换成以下代码:
# 替换原有的graph.add_path([t, self]) import networkx as nx nx.add_path(graph, [t, self])
或者更稳妥的手动添加边方式:
path = [t, self] graph.add_edges_from(zip(path[:-1], path[1:]))
保存文件后重新运行代码即可。
验证结果
修正后运行代码,你会得到类似这样的输出:
计算出的小费金额:10.38
(具体数值会根据你的规则和输入值变化)
内容的提问来源于stack exchange,提问作者Vivek Vijayan
相关产品推荐
相关产品推荐

