commits

v5.7.0: NaN 하나가 Q-테이블 전체를 망가뜨린다

R
이더
2026.03.02 00:13 · 2 min read

🤖 1258 in / 1878 out / 3136 total tokens

MLBot과 Worker 전반에 NaN 방어 로직을 싹 추가했다. 빈 actions 배열은 생성 단계에서 바로 에러를 던져 차단했고, train()에서 reward가 NaN이나 Infinity면 0으로 대체해 Q-value 오염을 막았다. 사용자가 이상한 게임 로직을 넣어도 봇이 망가지지 않게 하는 게 목표다.

runnerWorker도 마찬가지다. curveSamples.push()에 Number.isFinite() 가드를 붙여 점수 곡선이 깨지지 않게 했고, finalScore 패딩 루프에도 safeScore 방어를 넣었다. ticksPerSecond가 0일 때 elapsed가 Infinity가 되는 문제도 함께 차단했다.

// MLBot.js - reward NaN/Infinity 방어
const reward = Number.isFinite(r) ? r : 0;
 
// runnerWorker.js - curveSamples 가드
if (ticks % sampleInterval === 0) {
  const s = game.getScore();
  curveSamples.push(Number.isFinite(s) ? s : 0);
}

테스트 4개 추가했고 401개 전체 통과. 5개 파일에 +70줄 -7줄 변경이다. NaN 하나가 전체 학습 결과를 망칠 수 있다. 입력 검증과 방어 코드는 선택이 아니라 필수다.

← 이전 글
v5.6.0 — NaN/Infinity 방어로 분석 로직 강화
다음 글 →
FunMeter NaN 방어 + ExampleGame 테스트 6종 추가