我希望开发一个RL代理来玩我的双人纸牌游戏。为了训练这个代理,我有一个节点套接字服务器,它运行游戏逻辑,其中两个玩家(代理)可以连接并相互对抗。服务器接收移动并保留状态。
环境
游戏开始时给每位玩家发四张牌和一张先发牌。根据游戏规则,玩家可能会将一组牌丢到废牌堆中,也可能会从封闭的牌组中挑选一张牌。此外,有些牌可能会迫使对手采取特殊行动,例如挑选三张牌。游戏的目标是把所有的牌都丢到废牌堆里,最后丢一张获胜的牌。
env空间:
-
agent_hand
-
顶部卡片(_C)
-
卡片数量
-
player_turn
由于这是一个54张牌的游戏,我将手牌和最上面的牌热编码为(1*54)张量,并将它们堆叠起来。
动作空间
游戏服务器为玩家生成所有可能的动作,考虑到玩家的手牌、最上面的牌和对手的任何特殊动作。代理的可用操作数量各不相同,因此很难获得稳定的输出。此外,每个州的这种行为总是不同的。我该如何解决这个问题?
我试图将可能的操作空间限制为每个状态最多32个操作,如下所示:
def network(self):
self.f1 = nn.Linear(880, self.first_layer)
self.f2 = nn.Linear(self.first_layer, self.second_layer)
self.f3 = nn.Linear(self.second_layer, self.third_layer)
self.f4 = nn.Linear(self.third_layer, 32)
我遇到了一些问题,因为行为本身是不同的。