自定义开局

总览

我们考虑到游戏中主要会分为前期发育和后期进攻两种情形,因此,为了让针对不同场景的智能体学习更为方便,我们提供了自定义开局的功能。通过此功能,用户可以自由设定游戏开局时的场景,包括该场景中存在的各种球的数量、位置和大小。我们希望这可以让用户更关注一些代理任务的设计。

自定义

用户可以通过设置传入给 server 的初始化 config 来实现自定义开局游戏场景。通过 custom_init 字段的相关内容可以分别设置食物球、荆棘球、孢子球和玩家的分身球的相关细节。

对于食物球、荆棘球、孢子球,我们开放了位置和半径的设置接口,对于玩家的分身球,除了位置和半径以外,用户还需要指定该球所属的玩家名称和队伍名称。注意,玩家名称和队伍名称的命名需要符合游戏的习惯,例如,在某局由 4 个队伍,每个队伍 3 名玩家组成的游戏中,如果要进行自定义开局设计,则玩家的名称的取值范围是从 0 到 11 的 str 类型,队伍名称的取值范围则是从 0 到 3 的 str 类型。如果相关的玩家没有被设置,他将会随机以最小半径出生在地图中。

另外,在设置好开局之后,游戏将会继续按照配置表中的参数进行迭代。例如,如果玩家设定的开局只有 100 个 食物球(远低于我们在配置表中所设置的食物球初始化数量),那么开局之后食物球数量将会按照规则增加。

重载对局

我们有时候会碰到以下的情况:

  • 当你打出一盘很漂亮的对局的时候,也许你会想从这盘对局的中间继续探索其他的解决方案

  • 当你的智能体在某盘对局中表现有些不对劲,也许你会想回到这盘对局的某个时间点让智能体探索更多的方向

这个时候可以使用我们提供的接口来重载对局以达到上述目标!在传入 server 的初始化 config 中,有几个字断需要设置:

  1. save_bin=False, # 是否要保存当局的信息
  2. load_bin=False, # 是否在开局时加载某个对局的信息
  3. load_bin_path='', # 在开局时加载某个对局的信息的文件路径
  4. load_bin_frame_num = 'all', # 可以是int(代表加载到第几个动作帧),也可以是'all'(代表全部加载)

如上所示。要使用重载对局的功能,我们需要在第一局设置 save_binTrue,这样第一局的信息将会保存在用户提供的 save_path 下,以 .pkl 为文件后缀。因此这一局结束之后,我们可以假设得到了名称为 /path/to/d11355d8-4c4e-11ec-8503-b49691521104.pkl 的信息文件。假设我们在第二局想要加载第一局的前300个动作帧,那么可以进行如下设置:

  1. load_bin=True,
  2. load_bin_path='/path/to/d11355d8-4c4e-11ec-8503-b49691521104.pkl',
  3. load_bin_frame_num = 300,

那么在用户调用 server.reset() 的时候,我们会加载第一局文件信息中的前300帧,并将游戏停在300帧结束的位置。此时用户可以在此基础上继续 step 或者 obs

跳跃到某一帧

在使用重载对局的方法的时候,不可避免地需要多次step。如果局数不断累加,step的次数也会越来越多,初始化所花费的时间也会越来越长。因此,我们提供了快速跳跃到某一帧的方法以避免上述问题。为了描述方便,我们把问题做如下定义:我们在第一局中的第300次step之后根据数据反馈出这一帧有些问题,于是我们想要在这一帧做一个冻结,使得该帧可以复现。

为了解决这个问题,首先,我们在第301次step的时候,传入 save_frame_full_path 参数并将值设为文件保存路径(必须是文件路径,包含文件名称)。如下所示。

  1. server.step(actions=actions, save_frame_full_path='./frame_test.pkl')

然后这次step结束之后,我们可以找到对应保存的文件,即这一帧内所有单位的信息。为了复现该帧,我们在传入 server 的初始化 config 中,新增了一个字段:

  1. jump_to_frame_file = '',

该字段需要我们刚才得到的保存的文件的路径(包括文件名称)。如果设为 '',则意味着不进行跳跃。否则,将会把 server 的初始状态设置为对应帧的状态。

注解

启用本参数之后,另外设置的自定义功能将会被覆盖。