기사 설치비 로테이션 — 로직 현황 문서
목표: 하루는 편차 커도 괜찮다 → 여러 날 누적하면 기사별 설치비가 공평. (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의 기사↔군집 매칭 (현재=자택근접) →
누적 설치비 낮은 기사 우선.
- 누적 설치비 소스 확보 (제일 큰 숙제) — 오늘까지 각 기사가 이번 달 얼마 벌었나.
방법 A: 요청에 기사별 누적치 주입(vehicles[].month_fee) / 방법 B: 시뮬 DB에서 조회
- 매칭 기준 교체: 군집(구) → 기사 배정 시,
누적 설치비 + 자택거리 페널티 × w 가 최소인 기사.
w=0이면 순수 로테이션(편도 +8.5km), w↑면 자택 존중(공평도↓). 실측 튜닝.
- 노브:
fee_rotation: bool + rotation_home_weight: float
- 검증: 여러 날 연속 배차 → 누적 CV 추적 (rot_home 방식). 자택거리 트레이드오프 곡선.
기존 rotate_seed(지역 순환)와 별개 — 그건 날짜해시 순환이라 설치비를 안 봄. 새 로직은 누적 설치비를 본다.
결론 · 다음 스텝
- 일별 설치비 편차(CV 29~56%)는 정상 — 오더가 지역별로 고액/저액 갈리는 구조라 하루 균등은 불가.
- 월별 공평의 답 = 로테이션 (실측 누적 CV 6.8, 사람보다 공평). 미구현.
- 선결: 누적 설치비를 어디서 받을지(요청 주입 vs 시뮬 DB) 결정 → 그 뒤 매칭 로직 1곳 교체.
- 보조: 같은 구 내 판재편(처인구 폭 118k 등)은 넓은 구 몇 개만 개선 — 로테이션의 보완재.