☰
ruflo-arena 实战指南:用竞争规则学(Ruliology)为 Ruflo 程序策略构建竞技场、锦标赛与自适应共同进化
2026/10/14 13:58:39 网站建设 项目流程

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)是全部竞争的基础:

  1. 用mulberry32(derive(seed, 1))与mulberry32(derive(seed, 2))分别为 A、B 生成互不相关的独立随机流(derive以不同 salt 派生流种子);
  2. 循环rounds回合:双方各自act()出牌 →game.payoff结算 → 累计分数 → 双方observe()观察对手动作并转移状态;
  3. 返回累计分、场均分与(可选)逐回合历史。

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):

  1. 以randomFSM随机生成一个 2 态(可配startStates)初始程序;
  2. 适应度 =mean-vs-field:对阵容每个对手跑rounds回合取场均收益的平均(fitnessVsField);
  3. 每代对当前最优做一次mutate,fitness >= 当前则接受(keep-if-fitter),否则丢弃;
  4. 输出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/rungame/a/b/rounds/seed/history/persistpd/tit-for-tat/always-defect/ 200 / 1 / false / truerounds 正整数 ≤ 100_000
tournament/rungame/rounds/seed/includeSelf/persistpd/ 200 / 1 / true / truerounds ≤ 100_000
evolve/rungame/generations/seed/rounds/startStates/persistpd/ 300 / 42 / 100 / 2 / truegenerations ≤ 50_000;startStates 1–32
coevolve/rungame/generations/seed/rounds/startStates/persistpd/ 400 / 7 / 100 / 2 / true同上
run/getrunId—必填
run/listlimit20正整数 ≤ 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询