11. 분기 한정 (Branch and Bound)
핵심 인사이트 (3줄 요약)
- 본질: 분기 한정(Branch and Bound)은 조합 최적화 문제에서 가능한 모든 solutions를 체계적으로 탐색하되, 현재 발견된最优해보다 좋을 가능성이 없는 하위 문제의 하위 트리를 잘라냄으로써( bound + 가지치기) 효율적으로 최적해를 찾는 기법이다.
- 가치: 완전 탐색 대비 최소 10배에서 수천 배 빠르게 최적해를 찾을 수 있으며, 백트래킹의 확장판으로서 최적화 문제(순회 salesman, 배낭 등)에서 정확한 해 보장하면서도 실용적 시간 내에 동작한다.
- 융합: 분기 한정은 운송 최적화(차량 경로 문제, VRP), 스케줄링(작업 할당), 네트워크 설계(최소 비용 신장 트리 확장), 조합 경매(최적 입찰 전략) 등 실世界の 최적화 문제에 필수적으로 적용된다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
분기 한정(Branch and Bound)은 1960년대 Land과 Doig, 그리고 Lawler와 Wood 등에 의해 개발된 조합 최적화(combinatorial optimization)를 위한 알고리즘 프레임워크이다. 백트래킹(Backtracking)이 **존재性问题(답이 있는가?)**에 초점을 맞춘다면, 분기 한정은 **최적화 문제(어떤 답이 가장 좋은가?)**에 초점을 맞춘다. 이 차이는 근본적인데, 백트래킹은 해를 하나 찾으면 종료할 수 있지만, 분기 한정은 최적해를 찾아야 하므로 더 많은 탐색이 필요하다.
분기 한정의 핵심 가치는 **하한(lower bound)과 상한(upper bound)**을利用하여 탐색 공간을 줄이는 것이다. 현재 발견된 가장 좋은 해(상한: Upper Bound)보다 어떤 하위 트리가 반드시 나쁠 수밖에 없음을 보여줄 수 있으면(하한: Lower Bound ≥ 상한), 그 하위 트리 전체를 탐색할 필요가 없이 잘라낼(bounding + pruning) 수 있다.
이 도식은 분기 한정의 작동을 보여준다.
[분기 한정 (Branch and Bound) 작동 원리]
┌──────────────────────────────────────────────────────┐
│ │
│ [분기 (Branch): 문제 분할] │
│ ──────────────────────────────────── │
│ │
│ 전체 문제 │
│ │ │
│ ┌───┴───┐ │
│ 하위1 하위2 하위3 │
│ │ │ │ │
│ ... ... ... │
│ │
│ [한정 (Bound): 하위 트리 탐색 필요성 판단] │
│ ──────────────────────────────────── │
│ │
│ 현재 최적해 (Upper Bound) = 100 │
│ │
│ 하위 문제 A의 하한 = 95 │
│ → 95 < 100 → 탐색 필요! (개선 가능성 있음) │
│ │
│ 하위 문제 B의 하한 = 105 │
│ → 105 >= 100 → 탐색 불필요! (이미 발견된 해보다 못함)│
│ → 이 하위 트리 전체를 pruning! │
│ │
│ [배낭 문제에 적용] │
│ ──────────────────────────────────── │
│ 용량 W=10, 물건 4개: │
│ (무게, 가치): (3,30), (4,40), (5,50), (6,60) │
│ │
│ Branch: 물건 1,2,3,4를 포함/불포함으로 분기 │
│ │
│ Bound: (상한) 포함 가능한 최대 가치 = 140 │
│ (현재 발견된 최적 = 120) │
│ 140 > 120 → 탐색 계속 │
│ │
│ Bound: (하한) 반드시 포함해야 하는 가치 = 100 │
│ 100 < 120 → 이 경로는 최악해도 100 │
│ │
│ 정렬된 가치/무게 순서로 분기하면 더 빠른 bound 가능 │
│ │
└──────────────────────────────────────────────────────┘
- 관찰: Bound 함수의 품질이 분기 한정의 효율을 결정한다. Bound가 정확할수록(현재最优해에 근접할수록) 더 많은 하위 트리가 pruning된다.
- 원인: Bound 함수는 "이 하위 트리의 모든 해는 최소 X 이상의 비용을 가진다"는 보장(하한) 또는 "이 하위 트리의 어떤 해도 현재最优해보다 좋을 수 없다"는 보장(상한)을 제공한다.
- 결과: 이러한 bound를 통해 엄청난 수의 하위 트리가 사전에 제거되어, 완전 탐색 대비 극적으로 빠른 최적해 발견이 가능해진다.
- 판단: 분기 한정의 실무 적용에서는 문제에 맞는 excellent한 bound 함수를 설계하는 것이 가장 중요하며, 이것이 기술사 시험과 실제 문제 해결의 핵심이다.
📢 섹션 요약 비유: 분기 한정은 부동산 중개인의 집 검색과 같습니다. 고객이 "10억 이하로 서울에 3방 아파트"를 찾으려 할 때, 중개인은 "이 지역은 平均 15억이므로 탐색 불필요"이라고 판단하여(한정) 다른 지역을 탐색하고, 그렇게 지역을 분할하여(분기) 탐색 범위를 좁혀 갑니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
분기 한정의 알고리즘 구조는 탐색 트리 순회 + Bound 기반 가지치기로 구성된다. 탐색 전략으로는 깊이 우선(FIFO Branch and Bound), 너비 우선(LIFO Branch and Bound), **최고 하한 우선(Best-First Branch and Bound)**이 있다. 최고 하한 우선은 각 노드의 하한을 우선순위 큐(priority queue)에 저장하고, 가장 하한이 낮은 노드부터 탐색하는 방식으로, 가장 빨리 최적해에 도달할 가능성이 높다.
**외판원 문제(Traveling Salesman Problem, TSP)**에 분기 한정을 적용하는 것이 가장 대표적인 사례이다. TSP에서 분기 한정의 bound 함수는 1-트리(1-Tree) 바운드를利用한다. 첫 번째 정점을 고정하고 나머지 정점들로 구성된 최소 신장 트리(MST)의 길이에 두 배 가장 짧은 두 엣지를 더한 값이 하한이 된다. 이 하한을 통해 현재最优해보다 나을 가능성이 없는 분기를 pruning한다.
[TSP에 적용: 최고 하한 우선 분기 한정]
┌──────────────────────────────────────────────────────┐
│ │
│ [TSP 분기 한정 과정] │
│ ──────────────────────────────────── │
│ │
│ 4개 도시: A, B, C, D │
│ 비용 행렬: │
│ A B C D │
│ A INF 10 15 20 │
│ B 10 INF 25 15 │
│ C 15 25 INF 10 │
│ D 20 15 10 INF │
│ │
│ Step 0: 초기 하한 = 55 (1-Tree bound) │
│ 초기 상한 = INF (아직 해 없음) │
│ │
│ Branch 1: A→B 경로 선택 │
│ 하한 = 60 (A→B = 10 + 나머지 최적 50) │
│ → 현재 상한 INF > 60 → 계속 탐색 │
│ │
│ Branch 2: A→C 경로 선택 │
│ 하한 = 65 (A→C = 15 + 나머지 최적 50) │
│ → 계속 탐색 │
│ │
│ Branch 3: A→D 경로 선택 │
│ 하한 = 50 (A→D = 20 + 나머지 최적 30) │
│ → 50 < 현재 상한? 아직 INF이므로 계속 │
│ │
│ 叶 노드에서 완전한 경로 발견: A→B→C→D→A = 60 │
│ → 상한 = 60 업데이트! │
│ │
│ 나머지 분기 중 하한 >= 60 인 것 → pruning! │
│ → 탐색大幅 줄어듦 │
│ │
│ [Best-First 탐색 전략] │
│ ──────────────────────────────────── │
│ Priority Queue에 모든 노드의 (하한, 노드) 저장 │
│ 가장 낮은 하한 먼저 탐색 │
│ → 최적해에 가장 빨리 도달하는 경로를 우선 탐색 │
│ → 평균적으로 탐색량 최소화 │
│ │
└──────────────────────────────────────────────────────┘
- 관찰: TSP에서 n=20만 되어도 가능한 경로는 19!/2 ≈ 6×10^16개나 되지만, 분기 한정을 적용하면 실제 탐색은 수백만 분기 내에서 최적해 발견이 가능하다.
- 원인: Bound 함수를 통해 대부분의 하위 트리가 상한에 도달하기 전에 pruning되기 때문이다.
- 결과: 이러한 효율성으로 인해 TSP의 정확한 해를 구하는 데 분기 한정이 필수적으로 사용된다.
- 판단: 분기 한정의 효율은 bound 함수의 정확도에直接결정되므로, 문제 도메인에 맞는 최적의 bound 설계가 핵심이다.
📢 섹션 요약 비유: 분기 한정은 旅游舍의 выбор과 같습니다. 예산(상한)이 정해져 있을 때, 파리의 숙소가 주당 200만원 이상이면(하한 >= 상한) 유럽 전체旅游规划에서 제외하고(가지치기), 예산 범위 내에서 가장 좋은 조합을 찾을 때까지 지역별,/숙소별 조합을 분기하며 탐색합니다.
Ⅲ. 구현 및 실무 응용 (Implementation & Practice)
분기 한정의 실무 적용은 **정수 선형 프로그래밍(Integer Linear Programming, ILP)**과 **차량 경로 문제(Vehicle Routing Problem, VRP)**에서 가장 두드러진다. ILP 솔버(如: CPLEX, Gurobi)는 내부적으로 분기 한정을 사용하여 정수 제약이 있는 최적화 문제의 최적해를 찾는다. VRP는 화물 차량이 다수의 고객을 방문하면서 최소한의 총 이동 거리나 비용을達成하는 문제로, 분기 한정의 대표적인 실应用 사례이다.
실무 분기 한정 구현 패턴은 다음과 같다. 우선순위 큐(최소 힙)에 (node, lower_bound)를 저장한다. 큐가 empty일 때까지: 가장 작은 lower_bound 노드를 pop한다. 그 노드의 lower_bound가 현재 upper_bound 이상이면 skip(pruning). 그렇지 않으면 branch하여 하위 노드들을 생성하고, 각 하위 노드의 bound를 계산하여 큐에 삽입한다. 완전한 해를 발견하면 upper_bound를 업데이트한다.
[분기 한정 구현 패턴]
┌──────────────────────────────────────────────────────┐
│ │
│ function branch_and_bound(problem): │
│ PQ = empty priority queue │
│ best_solution = INF // upper bound (최소화) │
│ │
│ root_node = create_root(problem) │
│ root_bound = compute_bound(root_node) │
│ PQ.push(root_bound, root_node) │
│ │
│ while PQ not empty: │
│ bound, node = PQ.pop() │
│ │
│ if bound >= best_solution: │
│ continue // pruning │
│ │
│ if is_leaf(node): │
│ solution = evaluate(node) │
│ if solution < best_solution: │
│ best_solution = solution │
│ continue │
│ │
│ for child in branch(node): │
│ child_bound = compute_bound(child) │
│ if child_bound < best_solution: │
│ PQ.push(child_bound, child) │
│ │
│ return best_solution │
│ │
│ [분기 한정 vs 백트래킹 차이] │
│ ──────────────────────────────────── │
│ 백트래킹: │
│ - 해 존재 여부만 확인 │
│ - 하나의 해를 찾으면 종료 (존재 증명) │
│ - 최적 여부는 확인하지 않음 │
│ │
│ 분기 한정: │
│ - 최적해 찾기 (Optimizing) │
│ - 현재 최적해보다 나을 수 없으면 pruning │
│ - 모든 노드 탐색 or 최적해 발견 후 upper_bound로 │
│ 나머지 nodes pruning │
│ │
└──────────────────────────────────────────────────────┘
📢 섹션 요약 비유: 분기 한정은拍卖에서 입찰 전략과 같습니다. 내 최고 예상가(상한)이 1,000만원일 때,拍卖사가 제시한最低 경매가(하한)가 1,100만원이면(하한 >= 상한) 입찰을 포기하고(가지치기), 그 이하이면 다음拍卖를 계속 진행하며, 더 높은 입찰자가 나타나면 상한을 更新해 갑니다.
Ⅳ. 품질 관리 및 테스트 (Quality & Testing)
분기 한정의 품질 관리에서 가장 중요한 것은 bound 함수의 정확성 검증이다. Bound가 너무 느슨하면(실제보다 훨씬 낮음) pruning 효과가 거의 없고, bound가 너무 tight하면(실제보다 훨씬 높음) 잘못된 경로까지 탐색하게 되어 최적해를 놓칠 수 있다. 따라서 bound 함수의 수학적 근거가 정확한지 반드시 검증해야 한다.
품질 관리 체크리스트는 다음과 같다. Bound 함수가 항상 하한(최소 비용의の下限)을 정확히 제공해야 한다. Upper bound 업데이트가 올바르게 이루어져야 한다. 분기 전략이 탐색 효율에 미치는 영향을 분석해야 한다. 가장 작은 하한을 가진 노드부터 탐색하는 Best-First 전략이 실제로 효율적인지 확인해야 한다.
📢 섹션 요약 비유: 분기 한정의 품질 관리는 시험문제의 배점 기준표 설정과 같습니다. 문제별 예상 점수(하한)가 실제 배점(실제)과 괴리가 크면(부정확한 bound) 시험의公平성이毀损되듯이, bound가 부정확하면 최적해에 도달하지 못하거나 비효율적 탐색을 하게 됩니다.
Ⅴ. 최신 트렌드 및 결론 (Trends & Conclusion)
분기 한정의 최신 동향은 분기 절단 평면(Branch and Cut), 분기 가격(Branch and Price), 동시 분기 한정(Parallel Branch and Bound) 등 전통적 방법을 hybrid로 확장한 것이다. Branch and Cut은 ILP에 유효한 부등식(valid inequalities)을 추가하여 bound를 강화하는 기법이고, Branch and Price는 열 생성(Column Generation)과 결합하여 대규모 조합 최적화에 적용된다. 또한 멀티코어/분산 환경에서 병렬 분기 한정은 탐색 트리의 서로 다른 부분을 동시에 탐색하여 최적해 발견 속도를 높인다.
분기 한정은 조합 최적화의 정확한 해를 찾는 가장 강력한 범용 방법론이다. NP-어려움 문제에서도 입력이 충분히 작으면 최적해를 찾을 수 있으며, 근사 알고리즘과 달리 최적해 보장을 제공한다. 기술사 시험에서는 bound 기반 가지치기의 작동 원리와 최적화 문제 적용에서의 역할을 설명할 수 있는 능력을 검증한다.
📢 섹션 요약 비유: 분기 한정은 탐험대의 지도 제작과 같습니다. 未踏査 지역을 탐사할 때(분기), 각 지역 도착 시 "이 지역에서 얻을 수 있는 정보의 최소량(하한)"을 미리 estimation하여, 이미 完成된 지도(현재最优해)보다 나을 정보가 없다면(하한 >= 상한) 해당 지역 탐사를 취소하고(가지치기) 다른 지역을 탐사합니다.
핵심 인사이트 ASCII 다이어그램 (Concept Map)
[분기 한정 (Branch and Bound) 핵심 개념 맵]
┌─────────────────────────────────┐
│ 분기 한정 (Branch and Bound) │
└────────────────┬────────────────┘
│
┌───────────────────┼───────────────────┐
│ │ │
▼ ▼ ▼
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 핵심 구성 │ │ 탐색 전략 │ │ 대표 문제 │
│ Components │ │ Strategies │ │ Problems │
├──────────────┤ ├──────────────┤ ├──────────────┤
│ Branch 분기 │ │ Best-First │ │ TSP (외판원) │
│ Bound 한정 │ │ FIFO │ │ 배낭 문제 │
│ Pruning 가지 │ │ LIFO │ │ 작업 할당 │
│ Upper Bound │ │ │ │ ILP (정수계획)│
│ Lower Bound │ │ │ │ VRP (차량경로)│
└──────────────┘ └──────────────┘ └──────────────┘
│ │ │
└───────────────────┴────────────────────┘
│
▼
┌─────────────────────────────────┐
│ 분기 한정 vs 백트래킹 │
├─────────────────────────────────┤
│ 백트래킹: 해 존재 여부 (결정 문제) │
│ 분기 한정: 최적해 찾기 (최적화 문제) │
│ │
│ 공통점: 상태 공간 트리 탐색 │
│ 차이점: Bound 기반 pruning 여부 │
│ │
│ Bound 정확도 ↑ → 탐색량 ↓ → 효율 ↑ │
└─────────────────────────────────┘
참고
- 모든 약어는 반드시 전체 명칭과 함께 표기
- 일어/중국어 절대 사용 금지
- 각 섹션 끝에 📢 요약 비유 반드시 추가
- 최소 800자/파일
- 파일명: 01_, 02_... 형식