围绕工作队列和一个截止日期,构建一个原创的殖民地模拟游戏。在虚构的 Tern Ridge Relay 站,两名船员需要修理风暴百叶窗、更换空气滤芯并将一个货箱搬运至储藏室。只有一名船员能够修理百叶窗。如果一名船员先执行了风险较低的任务,即使所有任务最终都能完成,该站点仍可能错过截止日期。
使用三个固定的时间步长来揭示这一选择。一份清晰可读的日程表会告诉你每名船员做了什么、哪项任务不得不等待,以及修理工作是否按时完成。
从单一共享瓶颈开始

Ludeon Studios 将 RimWorld 描述为一款科幻殖民地模拟游戏,玩家在其中管理殖民者及其需求。该工作室自己的教程资料也提到了可配置的工作优先级。对于原创原型,可以借鉴竞争工作的广泛概念,并精确定义你的船员如何领取任务。
在 Tern Ridge Relay,Mira 和 Sol 初始状态为空闲。只有 Mira 可以执行 Repair 或 Filter。两者都可以执行 Haul。当 tick one 开始时,所有任务均可用。Shutter 必须在 tick two 结束前修复完毕。站点初始拥有 5 Air(一个抽象的游戏计数器),并在每个 tick 结束时消耗 1 Air。
让调度规则可见
| 任务 | 符合条件的船员 | 持续时间 | 完成效果 |
|---|---|---|---|
| 修复舱门 | 米拉 | 2 回合 | 百叶窗已关闭。截止时间为第 2 个 tick 结束。 |
| 更换过滤器 | 米拉 | 1 个 tick | 添加 2 空气。 |
| 搬运板条箱 | Mira 或 Sol | 1 个 tick | 标记板条箱已送达。 |

在每个 tick,保留带有已分配人员的有效任务。将待处理任务按数值优先级升序排序,若优先级相同,则按任务 ID 字母顺序排序。按 Mira、Sol 的顺序选取第一个空闲且符合条件的工人。如果某个任务没有空闲且符合条件的工人,记录原因并继续扫描。一个等待中的任务永远不应阻止符合条件的工人去执行另一个任务。
在一个 tick 结束时,将所有有效任务推进一步。应用完成效果,扣除空气成本,然后检查任何截止日期。在第 2 个 tick 完成的任务视为准时。在第 3 个 tick 完成的任务无法消除第 2 个 tick 已错过的截止日期。
从重置状态重放两个时间表
从等级修复 1、过滤 2 和搬运 3 开始。然后重置,并将过滤的等级更改为 0。此小型调度器接受 0 作为高于 1 的等级。在两次运行中保持相同的工人资格、任务时长和初始空气量。
| 帧 | 基线分配 | 基线空气 | 优先过滤 | 变体空气 |
|---|---|---|---|---|
| 1 | Mira 修复,Sol 搬运 | 4 | Mira 过滤,Sol 搬运 | 6 |
| 2 | Mira 按时完成修复。Sol 空闲。 | 3 | Mira 开始修复。Sol 空闲。错过截止日期。 | 5 |
| 3 | Mira 完成过滤。Sol 空闲。 | 4 | Mira 延迟完成修复。Sol 空闲。 | 4 |

两个时间表都在 4 空气时结束。基线方案保护了截止日期,而变体方案则错过了它。要诊断错过原因,请查看任务开始刻度和对 Mira 的首次分配。将截止日期结果与当前任务状态分开,以便逾期完成仍然可见。
向 AI 提供调度器和验收跟踪记录
首先要求单步控制。每次推进一个刻度,便于将日志与测试数据匹配。
构建一个名为 Tern Ridge Relay 的原创浏览器殖民地模拟游戏。
按顺序使用两名船员:Mira 和 Sol。开始时两人均空闲,空气值为 5。
在刻度 1 时,提供三个任务:维修(等级 1,仅限 Mira,2 个刻度,截止于刻度 2 结束)、过滤(等级 2,仅限 Mira,1 个刻度,增加 2 空气)和搬运(等级 3,任一船员均可,1 个刻度,标记箱子已送达)。
保持活动任务状态,每个任务占用一名工人直至完成。每名工人最多持有一个任务。
待处理任务按等级升序排序,然后按任务 ID 字母顺序排序。选择第一个空闲且符合条件的工人。跳过不可用的任务并继续扫描。
在刻度结束时推进工作,应用完成效果,减去 1 空气,然后检查截止日期。
分别跟踪完成刻度和截止日期结果。当任务逾期完成时,保留错过的截止日期状态。
显示步骤按钮、任务等级、船员分配、资格条件和按时间顺序排列的日志。允许在运行前将过滤等级设为 0。
在 3 个刻度后停止。重置将恢复基础等级、空气值、两名船员和所有待处理任务。
基线方案每个刻度后的空气值:4, 3, 4。维修在刻度 2 完成。
仅将过滤等级更改为 0 时:空气值 6, 5, 4。维修错过刻度 2 并在刻度 3 完成。
使用原创的中继站视觉效果和可通过键盘访问的控制项。
仔细检查第一个基准 tick。尽管 Filter 之前已被扫描,Sol 仍必须执行 Haul。如果 Sol 保持空闲,请检查处理不合格任务的规则。如果基准在第二个 tick 完成 Repair 后仍错过截止日期,请检查完成效果是否在截止日期检查之前应用。
使用首次构建指南将测试用例适配到其他场景。在 SEELE AI Game Maker 中构建 Tern Ridge Relay 调度器,并在添加事件或新任务之前重放这两个调度方案。
常见问题
我应该从多少名工人和多少个任务开始?
从两名工人和三个任务开始,其中包括两个需要同一名工人的任务。这样可以测试真正的瓶颈和并行分配。在这个例子中,Sol 可以搬运箱子,而 Mira 处理排名最高的专家任务。
如果一名工人无法接受排名最高的任务怎么办?
评估是否有空闲人员具备该任务的资格。如果没有,继续扫描并记录跳过原因。灵活的团队成员仍可以接手其他符合条件的任务,这可以防止待办列表导致整个站点空闲。
为什么要分别记录完成状态和截止日期状态?
任务可能在到期 tick 之后完成。其完成状态可能为 true,而截止日期结果仍为未达成。保留这两个值及其 tick 编号,以便玩家理解迟到的维修,即使完成的站点看起来完全相同。
我应该如何测试任务优先级的变化?
重置站点,仅更改一个排名,并重复确切的 tick 序列。比较谁开始每个任务、何时完成以及哪些截止日期发生变化。还要检查最终的 Air 值,但使用完整调度方案来解释以相同数量结束的情况。


