1. 星际争霸2游戏本体安装

想在Windows 10上玩转多智能体强化学习,首先得把"战场"搭建好——这就是星际争霸2游戏本体的安装。很多新手容易在这里栽跟头,特别是当你想把游戏安装到非系统盘时。

我建议直接去暴雪官网下载游戏客户端。虽然需要注册账号,但这是最稳妥的方式。下载器大概80MB左右,但完整游戏需要约30GB空间。如果你的C盘空间充足,直接默认安装最省事。但像我这样习惯把大型软件装在其他盘的用户,就需要特别注意路径问题。

安装完成后,有个关键步骤经常被忽略:设置系统环境变量SC2PATH。这个变量就像是给SMAC平台指路的地图,必须准确指向你的星际争霸2安装目录。具体操作是:

  1. 右键"此电脑"选择"属性"
  2. 点击"高级系统设置"
  3. 在"高级"选项卡点击"环境变量"
  4. 在系统变量中新建一个变量名为SC2PATH,值为你的安装路径(比如E:\StarCraft II)

注意:路径中不要包含中文或特殊字符,否则后续运行可能会报错。

验证安装是否成功有个小技巧:直接运行游戏目录下的Versions文件夹中的SC2_x64.exe。如果能正常启动游戏,说明基础安装没问题。

2. Python环境配置

2.1 创建虚拟环境

强烈建议使用Anaconda来管理Python环境,它能有效避免不同项目间的依赖冲突。我习惯为每个项目创建独立环境,这里我们创建一个名为sc2的虚拟环境:

conda create -n sc2 python=3.7
conda activate sc2

选择Python 3.7版本是因为SMAC对较新的Python版本支持不够完善,这是经过多次测试后的稳妥选择。创建环境后,建议先升级pip:

python -m pip install --upgrade pip

2.2 PyTorch安装

PyTorch是SMAC的核心依赖之一,版本选择很关键。根据我的实测,PyTorch 1.4.0是最稳定的选择。安装命令取决于你的硬件配置:

对于有NVIDIA显卡的用户:

conda install pytorch==1.4.0 torchvision==0.5.0 cudatoolkit=10.1 -c pytorch

仅使用CPU的情况:

conda install pytorch==1.4.0 torchvision==0.5.0 cpuonly -c pytorch

安装完成后,运行以下命令验证CUDA是否可用:

python -c "import torch; print(torch.cuda.is_available())"

如果输出True,说明GPU加速已启用。我在GTX 1060和RTX 2080上都测试过,虽然性能差异明显,但都能正常运行。

3. 关键依赖库安装

3.1 Torch-Geometric及其依赖

SMAC使用了一些图神经网络相关的库,因此需要安装torch-geometric。但直接pip安装往往会失败,需要先安装四个前置库:

  1. 访问PyTorch Geometric的官方whl文件页面
  2. 下载与PyTorch 1.4.0和CUDA 10.1兼容的版本
  3. 按顺序安装:
pip install torch_scatter-2.0.3+cu101-cp37-cp37m-win_amd64.whl
pip install torch_sparse-0.5.1+cu101-cp37-cp37m-win_amd64.whl
pip install torch_cluster-1.5.2+cu101-cp37-cp37m-win_amd64.whl
pip install torch_spline_conv-1.2.0+cu101-cp37-cp37m-win_amd64.whl

最后安装torch-geometric本体:

pip install torch-geometric

验证安装:

python -c "import torch_geometric; print(torch_geometric.__version__)"

3.2 其他必要库

SMAC还需要一些辅助库,建议一并安装:

pip install numpy matplotlib seaborn pygame pysc2

特别是pysc2,它是DeepMind开发的星际争霸2学习环境,虽然SMAC有自己的接口,但某些功能会依赖它。

4. SMAC平台安装与配置

4.1 安装SMAC

官方推荐两种安装方式,我都尝试过:

直接从GitHub安装:

pip install git+https://github.com/oxwhirl/smac.git

或者先克隆仓库再安装(推荐这种方式,方便后续调试):

git clone https://github.com/oxwhirl/smac.git
cd smac
pip install -e .

第二种方式会在开发模式下安装,允许你直接修改源代码并立即生效,对想要深入研究SMAC工作原理的用户特别有用。

4.2 地图文件配置

SMAC需要使用特定的星际争霸2地图文件,这些不是游戏自带的。你需要:

  1. 从SMAC提供的链接下载地图包(约200MB)
  2. 解压后得到SMAC_Maps文件夹
  3. 将这个文件夹复制到星际争霸2安装目录下的Maps文件夹中

如果安装目录下没有Maps文件夹(常见情况),需要手动创建。完整路径应该类似于:

E:\StarCraft II\Maps\SMAC_Maps

验证地图是否安装成功:

python -m smac.bin.map_list

这个命令会列出所有可用的SMAC地图,如果输出为空,说明地图文件放置位置可能有误。

5. 测试运行与常见问题排查

5.1 基础测试

运行一个简单的随机智能体测试:

python -m smac.examples.random_agents --map=3m

如果一切正常,你应该能看到星际争霸2游戏界面弹出,并且有3个marine单位在随机移动。

5.2 路径问题解决

最常见的错误是路径相关的FileNotFoundError。如果星际争霸2没有安装在默认位置,SMAC可能无法自动找到游戏文件。解决方法有几种:

  1. 确保SC2PATH环境变量设置正确
  2. 在代码中显式指定游戏路径:
from smac.env import StarCraft2Env
env = StarCraft2Env(map_name="3m", sc2_path="E:/StarCraft II")
  1. 或者在SMAC的配置文件中修改默认路径

5.3 版本兼容性问题

如果遇到奇怪的报错,很可能是版本不匹配。建议严格按照以下版本组合:

  • Python 3.7.x
  • PyTorch 1.4.0
  • CUDA 10.1(如果使用GPU)
  • SMAC最新master分支

我在实际项目中遇到过torch-geometric与PyTorch版本不匹配导致的段错误,重新安装指定版本后解决。

6. 进阶配置与优化

6.1 多进程训练配置

SMAC支持多进程训练以加速实验,但需要额外配置:

from smac.env import StarCraft2Env
env = StarCraft2Env(
    map_name="3m",
    seed=123,
    replay_dir="replays",
    reward_only_positive=False,
    reward_scale_rate=200,
    observe_ally_actions=True,
    obs_all_health=True,
    obs_own_health=True,
    obs_last_action=True,
    obs_pathing_grid=True,
    obs_terrain_height=True,
    obs_instead_of_state=False,
    state_last_action=True,
    state_timestep_number=True,
    state_agent_id=True,
    use_reward_normalization=True,
    use_state_normalization=True,
    use_agent_normalization=True,
    window_size_x=1920,
    window_size_y=1200,
    heuristic_ai=False,
    heuristic_rest=False,
    debug=False,
    concurrency=True,  # 启用多进程
    concurrency_context="spawn",  # Windows必须使用spawn
    num_concurrent_envs=4  # 并发环境数
)

6.2 渲染优化

默认渲染可能会很卡,可以通过调整分辨率改善:

env = StarCraft2Env(
    window_size_x=800,
    window_size_y=600,
    render=Render.human  # 或者Render.none完全关闭渲染
)

对于纯训练不需要可视化的情况,建议完全关闭渲染以提升性能。

7. 实际项目中的经验分享

在真实的多智能体强化学习项目中,SMAC环境配置只是第一步。根据我的实战经验,还有几个关键点需要注意:

首先是观测空间的处理。SMAC的原始观测非常庞大,包含单位信息、地图信息等。我通常会自定义观测包装器来提取关键特征:

from smac.env import StarCraft2Env
from gym import spaces
import numpy as np

class CustomObsWrapper(gym.Wrapper):
    def __init__(self, env):
        super().__init__(env)
        # 自定义观测空间
        self.observation_space = spaces.Dict({
            "agent_features": spaces.Box(low=-np.inf, high=np.inf, shape=(n_agents, feature_dim)),
            "global_state": spaces.Box(low=-np.inf, high=np.inf, shape=(state_dim,))
        })
    
    def get_obs(self):
        raw_obs = self.env.get_obs()
        # 处理原始观测...
        return processed_obs

env = StarCraft2Env(map_name="3m")
wrapped_env = CustomObsWrapper(env)

其次是奖励设计。SMAC默认的奖励信号可能不适合你的特定任务。可以通过继承StarCraft2Env类来修改奖励计算方式:

class CustomRewardEnv(StarCraft2Env):
    def _get_reward(self):
        original_reward = super()._get_reward()
        # 添加自定义奖励计算
        custom_reward = calculate_custom_reward()
        return original_reward + custom_reward

最后是并行化训练的技巧。当使用多个SMAC环境并行收集数据时,要注意Windows下的多进程限制。建议使用ray库来管理并行训练:

import ray
from smac.env import StarCraft2Env

ray.init()

@ray.remote
class ParallelEnv:
    def __init__(self, map_name):
        self.env = StarCraft2Env(map_name=map_name)
    
    def step(self, actions):
        return self.env.step(actions)
    
    def reset(self):
        return self.env.reset()

# 创建多个并行环境
envs = [ParallelEnv.remote("3m") for _ in range(4)]

这些技巧都是在实际项目中经过验证的,希望能帮你避开我踩过的那些坑。记住,配置环境只是开始,真正的挑战在于如何设计有效的多智能体学习算法来攻克SMAC中的各种战斗场景。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐