steps.js 3.76 KB
/**
 * Evolution Steps — Phase 2 自然选择循环的每一步
 *
 * 4 步循环: Evaluate → Select → Reproduce → BenchmarkEvolve
 * 所有判断由 Agent (LLM) 完成,无规则降级。
 */
const evolutionQueries = require('./queries').evolutionQueries;

// ═══════════════════════════════════════
// Step 1: Evaluate — Agent 驱动的能力测验
// ═══════════════════════════════════════

/**
 * 评估所有存活基因组:
 *   1. Arena 场景评估 (选择压力主来源)
 *   2. Benchmark 探针评估 (补充维度)
 *   3. 6 维适应度汇总
 */
async function stepEvaluate(runId, { log }) {
  const { evaluateRunInArena } = require('./arena/arena');
  const { evaluateRunWithBenchmarks } = require('./arena/benchmark-executor');
  const { evaluateRunFitness } = require('./operators/fitness-calculator');

  // 1. Arena 场景评估
  log('🏟️  Arena 场景评估...');
  const arenaResult = await evaluateRunInArena(runId);
  const arenaEvaluated = arenaResult.ranked?.length || 0;
  log(`  🏟️  ${arenaEvaluated} 个基因组完成 Arena`);

  // 2. Benchmark 探针评估
  log('🎯 Benchmark 探针评估...');
  const benchResults = await evaluateRunWithBenchmarks(runId);
  const benchPassed = benchResults.filter(r => r.passed).length;

  // 3. 6 维适应度汇总 → 写 overall_fitness
  log('🧮 适应度评估...');
  const fitnessResults = await evaluateRunFitness(runId);

  return {
    arenaEvaluated,
    arenaTopScore: arenaResult.ranked?.[0]?.overall || null,
    benchmarkPassed: benchPassed,
    benchmarkTotal: benchResults.length,
    fitnessEvaluated: fitnessResults.length,
    avgFitness: fitnessResults.length > 0
      ? parseFloat((fitnessResults.reduce((s, r) => s + r.overall, 0) / fitnessResults.length).toFixed(4))
      : null,
  };
}

// ═══════════════════════════════════════
// Step 2: Select — 淘汰低分,保留高分
// ═══════════════════════════════════════

async function stepSelect(runId, { log }) {
  const { selectGeneration } = require('./operators/selector');
  log('🏆 选择与淘汰...');
  const selection = await selectGeneration(runId, { eliteCount: 2, survivalRate: 0.5 });
  return { selection };
}

// ═══════════════════════════════════════
// Step 3: Reproduce — 交叉 + 变异 → 下一代
// ═══════════════════════════════════════

async function stepReproduce(runId, { log, generation }) {
  const { crossoverGeneration } = require('./operators/crossover');
  const { applyMutations } = require('./operators/mutator');

  log('🔀 交叉重组...');
  const children = await crossoverGeneration(runId, generation);

  log('🧬 变异...');
  const mutants = await applyMutations(runId, generation);

  return { crossoverChildren: children.length, mutants: mutants.length };
}

// ═══════════════════════════════════════
// Step 4: Benchmark 自进化 — 红皇后效应
// ═══════════════════════════════════════

async function stepBenchmarkEvolve(runId, { log }) {
  const { evolveAllBenchmarks } = require('./benchmark/evolver');
  log('🔄 环境进化...');
  await evolveAllBenchmarks(runId);
  return {};
}

module.exports = {
  stepEvaluate,
  stepSelect,
  stepReproduce,
  stepBenchmarkEvolve,
};