强化学习实现四人卡牌游戏Agent的技术疑问咨询
四人卡牌游戏RL Agent实现思路与疑问
花色编码
因各花色权重相同,采用独热编码:
diamonds = (1,0,0,0) spades = (0,1,0,0) hearts = (0,0,1,0) clubs = (0,0,0,1)
卡牌编码
游戏共52张牌,分4种花色。由于卡牌强度由点数决定,未采用独热编码,而是编码为7元组:
- 第1位:卡牌是否在Agent手牌中
- 第2位:卡牌是否已打出
- 第3-6位:卡牌花色(对应上述独热编码)
- 第7位:卡牌点数
示例:
cards = [ (1,0,1,0,0,0,12), ... ]
状态与网络结构
使用的网络结构为Linear_QNet(7, 1024, 1),状态包含Agent及其他玩家的卡牌、Agent手牌各花色数量、已打出卡牌等信息。
状态相关问题
- 为使
game.get_player_clubs_count()的输出与卡牌元组长度(7)统一,我给结果补充了6个0,这种做法是否合理?有无其他替代策略? - 卡牌被打出后玩家手牌会移除该卡牌,导致状态行形状变化,我通过补充
(-1,-1,-1,-1,-1,-1,-1)使状态长度固定为54以适配张量,这种处理是否可行?相关代码:
state = [ *player_1_cards, # 初始状态为13个元组 *(*player_2_cards, # 初始状态为13个元组 *player_3_cards, # 初始状态为13个元组 *player_4_cards), # 初始状态为13个元组 (game.get_player_clubs_count(self.current_player),0,0,0,0,0,0), (game.get_player_diamonds_count(self.current_player),0,0,0,0,0,0), (game.get_player_hearts_count(self.current_player),0,0,0,0,0,0), (game.get_player_spades_count(self.current_player),0,0,0,0,0,0), *game.get_played_cards() ] # 为后续张量使用标准化状态形状 state = list(state).copy() for i in range(54): if len(state) < 54: state.append(( -1, -1, -1, -1, -1, -1, -1)) return np.array(state, dtype=int)
预测相关问题
最终动作需为合法动作,当前通过截取预测结果前len(legal_moves)个元素取argmax选择动作,存在以下疑问:
- 模型预测输出是否与状态形状对应?例如状态前13项为Agent手牌,预测输出前13项是否对应这些手牌的动作评分?
- 是否需要将非合法动作对应的预测值设为
float(-inf)以确保选择合法动作?相关代码:
legal_moves, is_legal_move = game._get_legal_move_bin(game.current_collection_type, self.current_player) _state = np.array(state) state0 = torch.tensor(_state, dtype=torch.float) prediction = self.model(state0) move = torch.argmax(prediction[:len(legal_moves)]).item() final_move = legal_moves[move]
内容的提问来源于stack exchange,提问作者Kefah.b
相关产品推荐
相关产品推荐

