|
| 1 | +# 公开接口 |
| 2 | + |
| 3 | +PVE 算法**只能**通过标准 Gymnasium 接口与环境交互。不得直接访问内部对象。 |
| 4 | + |
| 5 | +## 环境初始化 |
| 6 | + |
| 7 | +```python |
| 8 | +from GameLogic import GameEnvironment, GameConfig |
| 9 | + |
| 10 | +# 内置难度 |
| 11 | +env = GameEnvironment(cfg=GameConfig.easy()) |
| 12 | +env = GameEnvironment(cfg=GameConfig.medium()) |
| 13 | +env = GameEnvironment(cfg=GameConfig.hard()) |
| 14 | + |
| 15 | +# 自定义配置 |
| 16 | +env = GameEnvironment(cfg=GameConfig.from_dict({ |
| 17 | + "map_width": 8, "map_height": 8, |
| 18 | + "num_markets": 4, "initial_money": 100.0, |
| 19 | +})) |
| 20 | +``` |
| 21 | + |
| 22 | +## 接口方法 |
| 23 | + |
| 24 | +### `reset()` |
| 25 | + |
| 26 | +```python |
| 27 | +obs, info = env.reset(seed=0) |
| 28 | +``` |
| 29 | + |
| 30 | +重置环境,返回初始观测和 info。 |
| 31 | + |
| 32 | +### `step()` |
| 33 | + |
| 34 | +```python |
| 35 | +obs, reward, terminated, truncated, info = env.step(action) |
| 36 | +# action: int, 0-7 |
| 37 | +# obs: np.ndarray, shape (32,), dtype float32 |
| 38 | +# reward: float |
| 39 | +# terminated: bool (money < 0,破产) |
| 40 | +# truncated: bool (步数耗尽,正常结束) |
| 41 | +# info: dict |
| 42 | +``` |
| 43 | + |
| 44 | +### `action_masks()` |
| 45 | + |
| 46 | +```python |
| 47 | +mask = env.action_masks() # np.ndarray[bool], shape (8,) |
| 48 | +``` |
| 49 | + |
| 50 | +返回当前有效的动作掩码。 |
| 51 | + |
| 52 | +## 观测向量(32 维 float32) |
| 53 | + |
| 54 | +| 索引 | 含义 | 归一化 | |
| 55 | +|:----:|------|--------| |
| 56 | +| 0–1 | 单位位置 (x, y) | / (H, W) | |
| 57 | +| 2 | 单位 HP | / max_hp | |
| 58 | +| 3 | 原材料背包占比 | raw_inv / capacity | |
| 59 | +| 4 | 成品背包占比 | prod_inv / capacity | |
| 60 | +| 5 | busy 倒计时 | / 10,截断到 1 | |
| 61 | +| 6 | 现金 | log10(money+1) / 5 | |
| 62 | +| 7 | 算力 | / 100,截断到 2 | |
| 63 | +| 8 | 游戏进度 | time / max_time | |
| 64 | +| 9 | 价格相位 sin | sin(2π·t / period) | |
| 65 | +| 10 | 价格相位 cos | cos(2π·t / period) | |
| 66 | +| 11 | 工厂原料库存 | / storage_cap | |
| 67 | +| 12 | 工厂成品库存 | / storage_cap | |
| 68 | +| 13 | 生产队列长度 | / 10,截断到 1 | |
| 69 | +| 14–16 | 资源点 0 | 相对位置 (dx/H, dy/W) + 库存比 | |
| 70 | +| 17–19 | 资源点 1 | 同上 | |
| 71 | +| 20–22 | 算力中心 0 | 相对位置 (dx/H, dy/W) + is_open | |
| 72 | +| 23–25 | 算力中心 1 | 同上 | |
| 73 | +| 26–28 | 市场 0 | 相对位置 (dx/H, dy/W) + best_price | |
| 74 | +| 29–31 | 市场 1 | 同上 | |
| 75 | + |
| 76 | +> 如果实体数量不足(如只有 2 个市场),多余索引保持 0。 |
| 77 | +
|
| 78 | +## 禁止访问的对象 |
| 79 | + |
| 80 | +以下为内部实现,选手算法**不得依赖**: |
| 81 | + |
| 82 | +- `env.unit`(Unit 内部字段) |
| 83 | +- `env.factory`(Factory 内部字段) |
| 84 | +- `env.board`(Board / 地图内部字段) |
| 85 | +- `env.markets`(Market 列表) |
| 86 | +- `env.money`、`env.compute`、`env.score`(通过 `info` 获取) |
| 87 | +- 任何以下划线开头的方法或属性 |
| 88 | + |
| 89 | +> 评测机只会暴露 `reset`、`step`、`action_masks` 三个公开接口。 |
| 90 | +
|
| 91 | +## 编写规则型策略 |
| 92 | + |
| 93 | +如果不需要 RL 训练,可以直接读取 `info` 字典做规则决策: |
| 94 | + |
| 95 | +```python |
| 96 | +obs, info = env.reset() |
| 97 | +while True: |
| 98 | + # 规则策略基于 info 做决策 |
| 99 | + if info["money"] > 50: |
| 100 | + action = 5 # BUY |
| 101 | + else: |
| 102 | + action = 7 # HARVEST |
| 103 | + obs, reward, terminated, truncated, info = env.step(action) |
| 104 | + if terminated or truncated: |
| 105 | + break |
| 106 | +``` |
0 commit comments