Codepass Expert № 03 · Graph · 2023.11
All 14 NN + TSP heuristic
PROBLEM № 03 — 2311 Logistics

적재 50칸 트럭과 백만 개의 주소. 한 번에 몇 개를 실을 것인가.

트럭 적재량은 50이지만 적재량이 늘수록 이동 비용이 가산된다 (거리 × (100 + 적재 × 10)). 30보다 20이 더 좋다는 사실은 풀어 봐야만 안다.

PASS · SCORE < 1.3 × 10¹⁰ 1k centers · 1M deliveries 10k product types
DEEP-DIVE · 심층 분석
물류배송 — 베스트 해법의 정당성과 알고리즘 원리
NN 그리디의 근사비와 TH 파라미터 튜닝의 수학, 통과 풀이 코드 해부
심층 분석 읽기 →

§ 1문제 정의

배송지 100만 개를 어디서 출발할까? 각 배송지에는 받고 싶은 제품 ID가 있고, 그 제품을 가진 센터는 평균 16곳뿐이다. 가장 가까운 센터에 미리 묶어두는 것이 핵심.

배송지를 센터별 큐로 분배한다. 그다음 트럭은 매번 가장 가까운 센터로 이동해 TH개의 물건을 차례로 골라 싣는다(센터→배송지1→배송지2→…). 적재 한도 TH는 5번의 sub-task 실험 결과 20이 최적.

점수 함수가 적재량에 비례하기 때문에 50을 다 채우는 건 손해다. 빈 트럭 이동 비용은 그대로 두고 적재 비용을 줄이는 trade-off에서 균형점이 20 부근에 있다.

트럭은 비어 있을 때 가장 싸다. 50을 채우지 마라 — 20에서 멈춰라.

§ 2예제 시각화 — 4개 센터, 20개 배송지

FIG. 3 — truck cycle: pickup → 4 deliveries → repeat STEP 01 / 6
SPACE play/pause · ← → step · R reset

§ 3알고리즘 골격

sendCenterList(…):
    backup centers, build product→centers index

sendDeliveryList(…):
    for each delivery:
        center = nearest center that has product
        push delivery into deliByCenter[center]

solve(truck):
    while there are deliveries:
        center = nearest center with remaining deliveries
        # pick TH=20 closest deliveries inside that center, NN chain
        pickups = nearestChain(truck, deliByCenter[center], TH=20)
        truckLoading(center, productsOf(pickups))
        for d in pickups: truckMove(d)

§ 4관련 문제