井字棋Minimax算法逻辑问题:类型错误排查求助
问题分析与解决
错误TypeError: '<' not supported between instances of 'tuple' and 'float'的根源是:max_value和min_value函数的返回值逻辑错误。这两个函数本该返回当前状态下的最优效用值用于递归比较,但你现在让它们返回了new_action(坐标元组),导致递归时用元组和浮点数(v的初始值)进行大小比较,触发类型错误。
修正后的代码
def minimax(state): def max_value(state): if terminal(state): return (utility(state), None) # 终端状态返回(效用值, 无动作) v = float('-inf') best_action = None for action in actions(state): # 递归获取子状态的最优效用值 child_val, _ = min_value(result(state, action)) if child_val > v: v = child_val best_action = action return (v, best_action) # 返回(最优效用值, 对应动作) def min_value(state): if terminal(state): return (utility(state), None) v = float('inf') best_action = None for action in actions(state): child_val, _ = max_value(result(state, action)) if child_val < v: v = child_val best_action = action return (v, best_action) if terminal(state): return None # 根据当前玩家调用对应函数,提取最优动作返回 if player(state) == X: _, best_action = max_value(state) else: _, best_action = min_value(state) return best_action
关键修改说明
- 让
max_value和min_value返回**(效用值, 动作)**的元组,既满足递归时的效用值比较需求,又能记录当前状态的最优动作。 - 递归调用时,只提取子状态的效用值参与大小比较,避免元组和浮点数的类型冲突。
- 外层
minimax函数最终只返回最优动作,符合AI调用时需要获取落子坐标的需求。
内容的提问来源于stack exchange,提问作者user13860384
相关产品推荐
相关产品推荐

