친구 몸무게를 맞혀야 한다. 정확한 숫자는 모르지만 이렇게 말할 수 있다.
"음… 최소 60kg은 넘겠지(하한), 아무리 많아도 80kg은 안 넘겠지(상한)."
정확한 답을 몰라도 "이 범위 안에 있다"는 건 확신할 수 있다. 그리고 범위가 좁아질수록("68~70kg 사이!") 답에 가까워진다.
최적화도 똑같다. 진짜 정답(가장 좋은 답)을 단번에 찾기 어려우니까,
💡 왜 중요하냐면, 컴퓨터가 "완벽한 정답"을 다 못 찾아도 "지금 답이 최선에서 2% 이내"라고 보장해줄 수 있기 때문이다.
택배 기사 3명에게 배달 구역을 나눠준다. 두 가지 방법이 있다.
여기서 핵심은 "제일 오래 일하는 사람"이다.
💡 그냥 "총 거리 줄이기"만 하면 A와 B를 구분 못 한다. "제일 힘든 사람을 보라"는 관점이 있어야 B를 고를 수 있다.
사장님이 회사 전체 계획을 세운다. 근데 혼자 모든 걸 다 정할 순 없다. 그래서 이렇게 한다.
큰 문제를 "큰 결정 담당(master)"과 "세부 확인 담당(subproblem)"으로 나눠 주고받는 것 — 이게 분해(decomposition)의 핵심이다.
직원이 사장에게 보내는 피드백 종류에 따라 두 갈래로 나뉜다.
- "이건 안 돼요 / 이렇게 하면 더 좋아요" 하고 조건을 보내면 → Benders
- "이런 새 방법(경로)이 있어요" 하고 선택지를 보내면 → 열 생성
"반 대표를 몇 명 뽑을까?" 계산기를 두드렸더니 2.5명이라고 나왔다. 현실에 2.5명은 없다. 하지만 이 답도 쓸모가 있다. "진짜 답은 2명 아니면 3명 근처겠구나"라는 감을 주니까.
원래 문제는 "사람은 딱 떨어지는 정수여야 한다"는 빡빡한 규칙이 있어서 풀기 어렵다. 그래서 "잠깐 2.5명도 허용하자"고 규칙을 느슨하게 푼다. 이렇게 하면 문제가 훨씬 쉽게 풀리고, 진짜 답의 범위(1번에서 배운 하한!)를 싸게 알아낼 수 있다.
이게 LP 완화(relaxation)다. "정수여야 한다"는 조건을 잠깐 풀어주는 것.
공장에서 원재료가 딱 100kg까지만 있다. 사장이 묻는다. "재료를 1kg 더 구하면 이익이 얼마나 늘어?" 답이 "3만 원"이라면 → 그 재료 1kg의 숨은 가치는 3만 원이다.
이렇게 "제한을 아주 조금 풀면 결과가 얼마나 좋아지는가"를 나타내는 값을 그림자 가격(dual)이라 한다. 겉으로 안 보이지만 각 조건마다 붙어 있는 "숨은 시세표" 같은 것.
배달 문제에서는 이렇게 쓴다. "고객 A를 한 번 방문하는 것의 숨은 가치 = 5천 원." 이 시세표가 있어야 다음 단계에서 "새 배달 경로가 이득인지 아닌지"를 판단할 수 있다.
여행사가 여행 코스를 짠다. 가능한 코스 조합은 수만 가지라 전부 종이에 적을 수 없다. 그래서 이렇게 한다.
배달 문제에서 "새 경로가 이득인지"는 5번의 그림자 가격으로 판단한다.
"이 경로의 실제 비용"이 "그 경로가 들르는 고객들의 숨은 가치 합"보다 싸면 → 이득! 추가한다.
지금 손에 든 코스 몇 개만 놓고 푸는 이 축소판 문제를 RMP(제한된 마스터)라 부른다. "냉장고 재료를 다 꺼내지 않고, 지금 쓸 것만 도마에 올리고 부족하면 그때 가져온다"는 느낌.
한 장면. 열 생성으로 문제를 풀었더니 답이 "이 경로를 0.5번, 저 경로를 0.5번 써라"라고 나왔다. 경로를 반만 쓸 순 없다.
그래서 갈래를 친다. "이 경로를 쓴다 vs 안 쓴다" 두 경우로 나눠서 각각 다시 풀어본다. 이렇게 어중간한 답이 나올 때마다 갈라 가며 정수(딱 떨어지는 답)로 몰아가는 게 분기(branch)다.
열 생성 + 분기를 합친 게 Branch-and-Price. 갈라진 각 경우에서 또 열 생성을 돌린다.