feat(B05): 노선 추천 후보마다 균형 종단 — 횡단 ㎥ 절성토 균형 점수 · 편집 창 미리 보기

- 균형 계획선 함수(서버 단독) — 종단기울기 상한 · 종단곡선(대수차) 지키며 B06 횡단 단면적으로 절 · 성토 균형
- 토공 최소 · 공사비 어림 점수를 균형 종단 토공(절 + 성 + 반입 + 사토)으로
- 추천 창에 균형 종단 한 줄 · 종단 그림 · 셈한 후보 표 · 지난 초 표시
- 균형 종단은 캐시에 안 적음 · 확정 체인 종단 규칙은 그대로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYJJRCfHfdCGNhmXTjQKV7
This commit is contained in:
2026-10-06 18:26:00 +09:00
co-authored by Claude Opus 5.5
parent 2a793e3a25
commit ebdb0610a6
11 changed files with 780 additions and 3 deletions
@@ -36,6 +36,7 @@ from B05_Profile.B05_Profile_Engine_RouteInitial_Metrics import (
COST_EARTH_M3,
COST_LENGTH_M,
)
from B05_Profile.B05_Profile_Engine_RouteInitial_Profile import profile_earth
from B05_Profile.B05_Profile_Engine_RouteInitial_Search import (
CROSSING_BAND,
OBJECTIVES,
@@ -266,6 +267,10 @@ def weighted(pool: Pool, weights: dict[str, float], min_radius_m: float, measure
def _earth(metrics: dict[str, Any]) -> float:
# 균형 종단을 붙인 후보(PLAN 63-4)는 절 + 성 + 반입 + 사토 · 못 붙였으면 가늠값
profile = metrics.get("profile")
if profile and "error" not in profile:
return profile_earth(profile)
return metrics["cut_m3"] + metrics["fill_m3"]