67 lines
2.6 KiB
TypeScript
67 lines
2.6 KiB
TypeScript
|
|
import { describe, test, expect } from 'bun:test';
|
|
import { createPopulation, evolveGeneration, getPopulationStats, DEFAULT_EVOLUTION_CONFIG } from './evolution';
|
|
import { evaluatePopulation, DEFAULT_MATCH_CONFIG } from './selfPlay';
|
|
|
|
// Extended configuration for Long-term Test
|
|
const LONG_RUN_CONFIG = {
|
|
...DEFAULT_EVOLUTION_CONFIG,
|
|
populationSize: 50, // Smaller pop for faster test speed
|
|
};
|
|
|
|
const MATCH_CONFIG = {
|
|
...DEFAULT_MATCH_CONFIG,
|
|
matchesPerGenome: 6, // 2 Static + 2 Spinner + 2 Peer
|
|
maxTicks: 300,
|
|
};
|
|
|
|
describe('Curriculum Evolution Long-term', () => {
|
|
test('Should reliably evolve High Fitness over 50 generations', () => {
|
|
let population = createPopulation(LONG_RUN_CONFIG);
|
|
const history: number[] = [];
|
|
|
|
console.log('\n--- Starting Long-term Curriculum Test (50 Gens) ---');
|
|
|
|
for (let gen = 0; gen < 50; gen++) {
|
|
try {
|
|
// 1. Evaluate
|
|
const evaluatedPop = evaluatePopulation(population, MATCH_CONFIG);
|
|
const stats = getPopulationStats(evaluatedPop);
|
|
|
|
history.push(stats.avgFitness);
|
|
|
|
console.log(`Gen ${gen}: Avg ${stats.avgFitness.toFixed(2)} | Max ${stats.maxFitness.toFixed(2)} | Species ${stats.speciesCount}`);
|
|
|
|
// Checks
|
|
if (gen === 0) {
|
|
if (stats.avgFitness <= 1.0) {
|
|
console.error(`FAILURE at Gen 0: Avg Fitness ${stats.avgFitness} <= 1.0`);
|
|
}
|
|
expect(stats.avgFitness).toBeGreaterThan(1.0);
|
|
}
|
|
|
|
if (gen === 20) {
|
|
if (stats.avgFitness <= 12.0) {
|
|
console.error(`FAILURE at Gen 20: Avg Fitness ${stats.avgFitness} <= 12.0`);
|
|
}
|
|
expect(stats.avgFitness).toBeGreaterThan(12.0);
|
|
}
|
|
|
|
// 2. Evolve
|
|
population = evolveGeneration(evaluatedPop, LONG_RUN_CONFIG);
|
|
} catch (e) {
|
|
console.error(`CRASH at Gen ${gen}:`, e);
|
|
throw e;
|
|
}
|
|
}
|
|
|
|
console.log('--- Test Complete ---');
|
|
|
|
// Final Success Criteria
|
|
const finalStats = getPopulationStats(evaluatePopulation(population, MATCH_CONFIG));
|
|
console.log(`Final Gen: Avg ${finalStats.avgFitness.toFixed(2)}`);
|
|
|
|
expect(finalStats.avgFitness).toBeGreaterThan(15.0); // Better than just Static + Spinner?
|
|
}, 600000); // 10 minute timeout
|
|
});
|