You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:03