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

强化学习实现四人卡牌游戏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手牌各花色数量、已打出卡牌等信息。

状态相关问题

  1. 为使game.get_player_clubs_count()的输出与卡牌元组长度(7)统一,我给结果补充了6个0,这种做法是否合理?有无其他替代策略?
  2. 卡牌被打出后玩家手牌会移除该卡牌,导致状态行形状变化,我通过补充(-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选择动作,存在以下疑问:

  1. 模型预测输出是否与状态形状对应?例如状态前13项为Agent手牌,预测输出前13项是否对应这些手牌的动作评分?
  2. 是否需要将非合法动作对应的预测值设为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:58