기사 설치비 로테이션 — 로직 현황 문서

목표: 하루는 편차 커도 괜찮다 → 여러 날 누적하면 기사별 설치비가 공평. (2026-07-28 기준)

한눈 요약 — 지금 어디까지 돼 있나

항목상태설명
설치비 로테이션 (핵심)미구현엔진에 없음. 오프라인 실험만 함(아래 실측).
지역 순환 rotate_seed부분날짜 해시로 기사↔군집 순환. ★설치비 아님(지역)·ignore_depot 전용.
월상한 검사 monthly_cap (C6)있음누적+오늘 > 상한 시 경고. ★검사만, 배정 조정 안 함.
누적 설치비 필드있음recalc 응답에 accumulated_fee 등. 저장은 시뮬 몫.
→ 즉 "월별 공평 로테이션"의 재료(누적 필드)는 있는데, 그걸 배정에 쓰는 로직은 없다.

왜 필요한가 — 하루 vs 월

군집배차는 지역으로 나누니, 저설치비 오더(회수·실측)가 몰린 구를 맡은 기사는 그날 설치비가 낮다. 하루 단위로 완전 균등은 불가능(오더가 지역별로 고액/저액 갈림). 대신 여러 날 누적하면 균등해질 수 있다 — 오늘 저액 구 기사는 내일 고액 구로 순환.
일별: 기사A [저액구] 기사B [고액구] ← 하루만 보면 A 손해 기사A [고액구] 기사B [저액구] ← 다음날 뒤집힘 ───────────────────────────────── 월합산: 기사A ≈ 기사B ← 누적하면 공평 (이게 목표)

실험 결과 (오프라인, rot_home.py) — 로직의 근거

현행 (자택 고정 배정)
CV 48.7%
6일 누적 기사별 설치비 편차
로테이션 (누적 낮은 기사 우선)
CV 6.8%
거의 완전 균등
참고: 사람 수기
CV 32.3%
사람도 이 정도
핵심: 매일 배정·군집·미배는 하나도 안 건드리고, 기사↔군집 매칭 순서만 누적 설치비 기준으로 돌리면 6일 누적 CV 48.7 → 6.8. 사람 수기(32.3)보다도 훨씬 공평.
대가: 자택→담당군집 편도 평균 21.8 → 30.4km (+8.5km). 실구현은 자택거리 페널티로 절충 가능.

구현하려면 — 스펙

바꾸는 지점: build_cluster_locked의 기사↔군집 매칭 (현재=자택근접) → 누적 설치비 낮은 기사 우선.
  1. 누적 설치비 소스 확보 (제일 큰 숙제) — 오늘까지 각 기사가 이번 달 얼마 벌었나.
    방법 A: 요청에 기사별 누적치 주입(vehicles[].month_fee) / 방법 B: 시뮬 DB에서 조회
  2. 매칭 기준 교체: 군집(구) → 기사 배정 시, 누적 설치비 + 자택거리 페널티 × w 가 최소인 기사.
    w=0이면 순수 로테이션(편도 +8.5km), w↑면 자택 존중(공평도↓). 실측 튜닝.
  3. 노브: fee_rotation: bool + rotation_home_weight: float
  4. 검증: 여러 날 연속 배차 → 누적 CV 추적 (rot_home 방식). 자택거리 트레이드오프 곡선.
기존 rotate_seed(지역 순환)와 별개 — 그건 날짜해시 순환이라 설치비를 안 봄. 새 로직은 누적 설치비를 본다.

결론 · 다음 스텝

  1. 일별 설치비 편차(CV 29~56%)는 정상 — 오더가 지역별로 고액/저액 갈리는 구조라 하루 균등은 불가.
  2. 월별 공평의 답 = 로테이션 (실측 누적 CV 6.8, 사람보다 공평). 미구현.
  3. 선결: 누적 설치비를 어디서 받을지(요청 주입 vs 시뮬 DB) 결정 → 그 뒤 매칭 로직 1곳 교체.
  4. 보조: 같은 구 내 판재편(처인구 폭 118k 등)은 넓은 구 몇 개만 개선 — 로테이션의 보완재.