ruflo-arena 实战指南:用竞争规则学(Ruliology)为 Ruflo 程序策略构建竞技场、锦标赛与自适应共同进化
【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo
ruflo-arena 是 Ruflo 生态中首个可执行的"竞争规则学"(competitive ruliology)插件,实现了 Ruflo ADR-147/148/150 的落地切片:把策略视为程序(读取对手历史的确定性有限状态机),让它们在收益博弈下同场竞技,通过锦标赛产出 Wolfram 式"竞争矩阵"(competitive array),再用爬山进化与共同进化(co-evolution)在经验上发现优胜者。读完本文,你将掌握该插件的安装运行、CLI 与 MCP 工具调用、策略/博弈/进化机制,以及如何用种子复现与持久化每一场"程序对程序"的竞争。
为什么"程序 vs 程序"需要真实地跑一场
传统博弈论倾向用数学推导求解最优策略;而 Wolfram 的"规则学"立场是:由于计算不可约性(computational irreducibility),程序的竞争结果无法被简单预测或化简,必须真正运行这场竞争才能知道谁赢。ruflo-arena 把这一立场工程化:
- 策略是程序——确定性有限状态机(deterministic FSM),其输出仅取决于当前状态,状态转移取决于对手上一回合动作(Moore 机语义);
- 程序在收益博弈(payoff game)下两两对阵;
- 锦标赛产出竞争矩阵(mean-payoff 矩阵)与 mean-vs-field 排名;
- 爬山进化与共同进化在搜索空间里经验性地发现获胜者。
该插件定位为"执行引擎 + 本地数据占位",展示层(ADR-149/150 仪表盘)与数据智能层(RuVector ADR-196/197/198)由其他模块承接。核心事实与契约见 ADR-0001: ruflo-arena plugin contract。
安装与测试
插件依赖极轻——运行时只有zod一个依赖(用于 MCP 边界输入校验),要求 Node >= 20(见 package.json):
cd plugins/ruflo-arena npm install # light — runtime dep is just zod npm run build # tsc -> dist/ npm test # vitest (engine + MCP tools + persistence) npm run lint # eslint (typescript-eslint)仓库已内置完整测试套件:tests/games-arena.test.ts、tests/tournament.test.ts、tests/evolution.test.ts、tests/mcp-tools.test.ts,覆盖博弈收益表、确定性复现、锦标赛支配性、进化收敛与 MCP 工具面。npm run demo可直接以源码模式(--experimental-strip-types)运行演示。
架构总览
源码结构(见 src/index.ts 的导出面)层次分明:
src/ domain/ types (+ Zod schemas) · games · strategies (FSM programs, library, mutation) engine/ rng · arena (match) · tournament (competitive array) · evolution (hill-climb, co-evolution) persistence/ RunStore (File + InMemory) + AgentDB record builder report/ competitive-array tables · ASCII heatmaps · fitness sparklines mcp-tools/ arenaTools: MCPTool[] (the 6 tools above) index.ts export surface + default { tools } cli.ts human-facing CLI- domain:类型与 Zod 输入 schema、收益博弈定义、策略库(FSM 程序工厂 + 变异算子);
- engine:可播种 PRNG、单场对阵、锦标赛、爬山进化与共同进化;
- persistence:
FileRunStore/InMemoryRunStore与 AgentDB 记录构造器; - report:竞争矩阵表格、ASCII 热力图、适应度 sparkline,纯文本渲染保证零 UI 依赖即可观测;
- mcp-tools:6 个 MCP 工具;cli.ts:人类友好的命令行入口。
策略即程序:FSM 与闭包策略
核心思想是"策略 = 读取历史的简单程序"。类型定义在 src/domain/types.ts:
FsmStrategy:确定性 Moore 机。每个状态输出一个动作(action),并根据对手动作(next映射)转移到下一状态;FnStrategy:闭包策略,例如用播种 RNG 的random,由init/act/update三元组驱动;AgentInstance:策略的可运行实例,Moore 语义为"出牌看状态、转移看对手"(见 src/domain/strategies.ts 的instantiate,未知动作保持原状态不转移)。
内置经典策略库均为 FSM 工厂,可针对任意动作集参数化:
| 策略 | 机制 |
|---|---|
tit-for-tat/copy-opponent | 复制对手上一动作(copyOpponent) |
always-cooperate/always-defect | 恒定动作(单状态 FSM,constant) |
grim | 一直合作,对手一旦背叛则永远背叛(2 态) |
pavlov | 赢则保持、输则切换(Win-Stay-Lose-Shift,2 态) |
alternate | 动作循环交替 |
random | 均匀随机(闭包策略,走种子化 RNG) |
suspicious-anti-tft | 反复制(antiCopy,先背叛型 TFT 变体) |
PD 下经典阵容(classicRoster)即上述 8 个;非 PD 博弈则退化为"恒定×2 + 复制 + 反复制 + 交替 + 随机"6 个。findStrategy支持前缀匹配策略名。
可进化的 FSM:随机基因组与变异算子
ADR-148 的进化能力建立在两个原语上(src/domain/strategies.ts):
randomFSM:按动作集与状态数随机生成 FSM(动作、转移、起始状态全部随机);mutate:对 FSM 做一次随机结构编辑,五种算子随机选择:flipAction:翻转某状态输出动作;rewire:重连某状态在某动作上的转移目标;moveStart:移动起始状态;addState:新增状态并保证新状态可达(把旧状态的一条转移指过去);removeState:删除状态并重映射全部转移与起始状态(当状态数 ≤ 1 时强制改为addState)。
这正是"程序空间"上的局部搜索:每个个体都是一个可运行程序,变异即程序改写。
收益博弈:PD 与零和 match-or-not
博弈即收益矩阵(src/domain/games.ts):
- Iterated Prisoner's Dilemma(
pd/prisoners-dilemma):经典 R=3、T=5、S=0、P=1 参数,动作集{C, D},非零和; - Match-or-not(
mon/match-or-not):动作一致时 A 得 1 分、B 得 -1,不一致则相反,零和; GAMES注册表支持别名(pd↔prisoners-dilemma、mon↔match-or-not),getGame对未知博弈直接报错并列出已知项。
makeGame用"a|b"字符串查表返回[pA, pB],缺失组合抛错。测试 tests/games-arena.test.ts 验证了 PD 四格收益与零和性质(任意两动作收益之和为 0)。
单场对阵:arena/run 的底层实现
runMatch(src/engine/arena.ts)是全部竞争的基础:
- 用
mulberry32(derive(seed, 1))与mulberry32(derive(seed, 2))分别为 A、B 生成互不相关的独立随机流(derive以不同 salt 派生流种子); - 循环
rounds回合:双方各自act()出牌 →game.payoff结算 → 累计分数 → 双方observe()观察对手动作并转移状态; - 返回累计分、场均分与(可选)逐回合历史。
meanPayoff则取 A 对 B 的场均收益,供锦标赛与进化复用。确定性来自 mulberry32(src/engine/rng.ts):同种子同流,测试断言"同种子两次运行的历史完全一致",这是 Wolfram 强调的"竞争可重跑"前提。
锦标赛:Wolfram 竞争矩阵与 mean-vs-field 排名
runTournament(src/engine/tournament.ts)对阵容做循环赛:
matrix[i][j]= 策略 i 对策略 j 的场均收益,构成mean-payoff 矩阵(竞争矩阵);meanVsField[i]= 策略 i 对阵全场的平均收益(includeSelf=false时跳过对角线,对角留 0,由调用方按该标志解读);ranking按 mean-vs-field 降序排序。
测试 tests/tournament.test.ts 验证了:矩阵为方形且与阵容等长、排名严格降序、同种子完全复现,以及一个经典事实——PD 中 always-defect 对任意对手场均不低于对方(pairwise-unbeatable 支配性)。
README 给出了一次典型 PD 排名(mean-vs-field):grim ≈ 2.99、always-defect ≈ 2.76、tit-for-tat ≈ 2.50、…、always-cooperate ≈ 1.88——可见"以牙还牙"类策略在"全场平均"口径下反超单纯的 always-defect,这正是竞争矩阵的价值所在。
进化与共同进化:经验发现获胜者
爬山进化(evolve/run)
evolveVsField(src/engine/evolution.ts):
- 以
randomFSM随机生成一个 2 态(可配startStates)初始程序; - 适应度 =mean-vs-field:对阵容每个对手跑
rounds回合取场均收益的平均(fitnessVsField); - 每代对当前最优做一次
mutate,fitness >= 当前则接受(keep-if-fitter),否则丢弃; - 输出
best(进化后的程序)、bestFitness、curve(每代适应度、是否被接受、状态数)。
README 的示例轨迹:进化从随机 FSM(约 2.78)爬升到约 3.00,呈现 Wolfram 强调的平台期→突破(plateau→breakthrough)适应度曲线特征。
共同进化(coevolve/run)
coevolve(src/engine/evolution.ts)实现军备竞赛:
- A、B 各持一个随机 FSM,奇数代变异 A(接受当且仅当 A 的收益 ≥ 基线),偶数代变异 B(接受当且仅当A 的收益 ≤ 基线,即 B 在最小化 A 的收益——双方对抗);
- 缓存当前 A vs B 的基线收益,每代只跑一次候选对阵(同种子数值上等价,但每代省约 2/3 的对阵次数);
- 返回双方最终程序与
curve(每代payoffA轨迹)。
MCP 层对超长曲线用单次扫描求 min/max 区间,规避Math.min(...spread)在 V8 下约 1.6 万参数的参数上限(见 src/mcp-tools/index.ts)。
CLI 实战
编译后通过dist/cli.js或 binruflo-arena调用(入口见 src/cli.ts):
node dist/cli.js demo # 锦标赛 + 进化 + 共同进化 + 零和博弈演示 node dist/cli.js tournament --game pd --rounds 200 --seed 1 node dist/cli.js arena --a tit-for-tat --b always-defect node dist/cli.js evolve --game pd --generations 300 --seed 42 node dist/cli.js coevolve --game pd --generations 400 --seed 7各子命令与 MCP 工具一一对应(arena→arena/run、tournament→tournament/run、evolve→evolve/run、coevolve→coevolve/run):
tournament输出竞争矩阵表格 + ASCII 热力图 + 排名表(competitiveArrayTable/heatmap/rankingTable,见 src/report/render.ts);evolve输出起始/最终适应度、接受变异数、适应度 sparkline 与进化后程序的describeFSM描述;coevolve输出 A 收益随世代的 sparkline 与区间。
完整子命令解析见 commands/arena.md,其中还展示了以$ARGUMENTS驱动的命令→MCP 工具映射约定。
MCP 工具:ruflo-arena/mcp-tools
插件导出 6 个 MCP 工具(createArenaTools工厂可注入RunStore;默认arenaTools使用FileRunStore,见 src/mcp-tools/index.ts):
| Tool | 用途 |
|---|---|
arena/run | 两个指定策略之间的一次确定性对阵 |
tournament/run | 循环赛 → 竞争矩阵 + mean-vs-field 排名 |
evolve/run | 对固定阵容爬山进化 FSM;返回程序 + 适应度曲线 |
coevolve/run | 共同进化(军备竞赛)轨迹 |
run/get | 按 runId 取回持久化运行记录 |
run/list | 列出近期运行记录(新在前,limit默认 20,上限 1000) |
所有工具返回 Ruflo 统一信封{ success, result | error },并在边界用 Zod 校验输入;数值输入被coerce(MCP/CLI 字符串自动转数字)。Zod schema 定义在 src/domain/types.ts,关键参数与默认值:
| 工具 | 参数 | 默认值 | 约束 |
|---|---|---|---|
arena/run | game/a/b/rounds/seed/history/persist | pd/tit-for-tat/always-defect/ 200 / 1 / false / true | rounds 正整数 ≤ 100_000 |
tournament/run | game/rounds/seed/includeSelf/persist | pd/ 200 / 1 / true / true | rounds ≤ 100_000 |
evolve/run | game/generations/seed/rounds/startStates/persist | pd/ 300 / 42 / 100 / 2 / true | generations ≤ 50_000;startStates 1–32 |
coevolve/run | game/generations/seed/rounds/startStates/persist | pd/ 400 / 7 / 100 / 2 / true | 同上 |
run/get | runId | — | 必填 |
run/list | limit | 20 | 正整数 ≤ 1000 |
evolve/run与coevolve/run的默认种子分别为 42 与 7,README/CLI 与 schema 三者保持一致。
持久化:精确重放与 AgentDB 语义检索
每次运行都是可复现工件(ADR-147;RuVector ADR-197 的本地占位):
FileRunStore把完整工件写入.ruflo/arena/<runId>.json(runId 形如<kind>-<uuid8>,见 src/persistence/run-store.ts),支持 bit-for-bit 重放;InMemoryRunStore供测试/临时场景(createArenaTools(new InMemoryRunStore()));RunRecord记录runId/kind/game/seed/createdAt/summary/artifact,其中seed是复现的关键。
按 Ruflo 约定,AgentDB 持久化在命令/代理层完成:每个工具结果携带agentdb载荷,交由mcp__plugin_ruflo-core_ruflo__memory_store落库:
mcp__plugin_ruflo-core_ruflo__memory_store({ namespace: result.agentdb.namespace, // "arena" key: result.agentdb.key, // 即 runId value: result.agentdb.value, // JSON 摘要(kind, game, seed, ranking/fitness …) tags: result.agentdb.tags // ["ruliology","competition", kind, game] })agentdbRecord把kind/game/seed提升为顶层字段(便于 RuVector ADR-197 索引器免解析过滤),value保留完整摘要供语义检索。此后即可用mcp__plugin_ruflo-core_ruflo__memory_search({ namespace: "arena", query: "tournaments where grim dominated" })这类查询回溯历史竞争。注意:v1 中agentdb.value摘要 schema 未版本化,ADR 提醒在 RuVector 集成契约(ADR-152 ↔ ADR-200)落地前应避免跨仓库依赖。
范围界定:v1 做什么、不做什么
v1 刻意保持"仅 Ruflo 内、不动核心":
- 包含:简单程序 + 随机策略、PD + 零和博弈、锦标赛、爬山进化与共同进化、文件/AgentDB 持久化、MCP 工具 + CLI;
- 不包含(另作跟踪):LLM 代理策略与蒸馏(ADR-151)、执行沙箱/资源治理(ADR-153)、仪表盘 UI(ADR-149/154)、完整 RuVector 数据/智能层(ADR-196–198、ADR-200)。
一个值得注意的边界:v1 的 FSM 必然停机(无非停机程序问题),而"不可信/进化出的程序"沙箱化在 ADR-153 中跟踪——若你计划把进化产物接入真实执行环境,应先补齐该治理项。
结语:从竞争矩阵到自进化 swarm
ruflo-arena 用约 10 个源码文件的体量,完整落地了"策略即程序、竞争须实跑、结果可重放、历史可检索"的竞争规则学闭环:arena单挑 →tournament竞争矩阵 →evolve对固定阵容爬山 →coevolve军备竞赛,四条递进能力全部可通过 CLI 与 MCP 工具调用并持久化。对于希望把"程序间竞争"引入 swarm 编排、策略选择或自动化探索的开发者,这个插件既是一个可复现的实验场,也为 RuVector 数据层与仪表盘预留了清晰的接缝。建议从node dist/cli.js demo开始,观察 PD 竞争矩阵中 grim 的领先与进化曲线的平台期突破,再以固定种子复现、改参数、接入 AgentDB 检索,逐步深入。
【免费下载链接】ruflo🌊 The original agent meta-harness. Deploy intelligent multi-player swarms, coordinate autonomous workflows, and build conversational AI systems. Features adaptive memory, self-learning intelligence, RAG integration, and native Claude Code / Codex / Hermes and many more Integrated项目地址: https://gitcode.com/GitHub_Trending/cl/ruflo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考