该错误是由于`KuhnMunkres`类未定义`history`属性导致的
该错误是由于KuhnMunkres
类未定义history
属性导致的。以下是具体分析及解决方案:
错误原因分析
- 属性缺失
代码中试图访问km.history
,但KuhnMunkres
类未在初始化或算法执行过程中定义该属性,因此触发AttributeError
。 - 动画实现逻辑不完整
用户希望通过FuncAnimation
生成算法执行过程的动画,这需要预先记录算法每一步的状态(如顶标、匹配结果等),但当前实现未包含状态记录功能。
解决方案
1. 在类中初始化history
属性
修改KuhnMunkres
类的构造函数,添加history
属性用于存储算法执行历史:
class KuhnMunkres:
def __init__(self, cost_matrix):
self.cost = np.array(cost_matrix)
self.n = len(cost_matrix)
self.labels_x = np.max(cost_matrix, axis=1).astype(np.float64)
self.labels_y = np.zeros(self.n, dtype=np.float64)
self.match_y = -np.ones(self.n, dtype=int)
self.history = [] # 新增:记录算法执行历史
2. 在算法关键步骤中记录状态
在算法迭代过程中(如调整顶标或更新匹配时),将当前状态保存到history
中:
def run(self):
while not self._all_matched():
# 记录当前匹配状态
self.history.append({
"labels_x": self.labels_x.copy(),
"labels_y": self.labels_y.copy(),
"match_y": self.match_y.copy()
})
# 执行算法逻辑(调整顶标、寻找增广路径等)
# ...
return self.match_y
3. 调整动画生成代码
确保FuncAnimation
的参数与history
数据匹配:
def update(frame):
# 从history中提取第frame帧的数据
state = km.history[frame]
# 更新绘图(例如绘制当前顶标和匹配边)
# ...
anim = FuncAnimation(fig, update, frames=len(km.history), init_func=init, blit=True, interval=1000)
验证修改后的代码
- 检查属性存在性
运行print(hasattr(km, 'history'))
应返回True
。 - 测试动画生成
确保history
中至少包含一次状态记录,否则len(km.history)
会为0,导致动画无帧可渲染。
扩展建议
- 优化历史记录粒度
根据动画需求,可选择在每次顶标更新、匹配调整或特定迭代次数时记录状态。 - 数据序列化
若需保存历史记录供后续分析,可将history
中的字典转换为JSON或NumPy数组格式。 - 性能权衡
高频记录可能增加内存占用,可通过稀疏采样(如每隔10次迭代记录一次)平衡性能与细节展示。
通过上述修改,可解决AttributeError
并实现算法执行过程的可视化。若需进一步调试,可打印km.history
内容验证数据完整性。
由小艺AI生成<xiaoyi.huawei.com>