쌍대성 (Duality)
정의
쌍대성 (Duality) 은 하나의 최적화 문제 (Primal) 에 항상 대응되는 또 다른 최적화 문제 (Dual) 가 존재한다는 원리. LP 에서 Primal-Dual 쌍은 다음과 같다:
Primal (max 형태):
maximize c^T x
subject to A x ≤ b, x ≥ 0
Dual (min 형태):
minimize b^T y
subject to A^T y ≥ c, y ≥ 0
Primal 이 max 이면 Dual 은 min, 제약 방향이 반대, 변수와 제약의 개수가 뒤바뀐다.
문제 상황과 동기
- 보는 관점의 전환: Primal 이 풀기 어려울 때 Dual 이 더 쉽거나, Dual 의 해가 Primal 해의 하한/상한을 제공.
- 최적성 증명: Primal 해 x 와 Dual 해 y 에 대해 c^T x ≤ b^T y. 같으면 둘 다 최적.
- Max-Flow Min-Cut 정리: 최대 유량 (Primal) = 최소 컷 (Dual). duality 의 대표적 예시.
핵심 통찰: 모든 선형 계획법은 대응되는 쌍대 문제가 있으며, Strong Duality 가 성립하면 두 문제의 최적값이 같다.
시각화
핵심 아이디어
Weak Duality (약 쌍대성)
임의의 feasible x, y 에 대해 c^T x ≤ b^T y. Primal 이 max 니까 Dual 해가 Primal 해의 상한. Primal 이 min 이면 반대.
증명: c ≤ A^T y 이므로 c^T x ≤ (A^T y)^T x = y^T (A x) ≤ y^T b = b^T y.
Strong Duality (강 쌍대성)
Primal 이 최적해 x* 를 가지면, Dual 도 최적해 y* 를 가지며 c^T x* = b^T y*. (둘 다 feasible 할 때)
Complementary Slackness (상보 여유)
최적해 (x*, y*) 에 대해:
- x_j > 0 ⇒ (A^T y)_j = c_j (해당 Dual 제약이 tight)
- y_i > 0 ⇒ (A x)_i = b_i (해당 Primal 제약이 tight)
물리적 의미: 사용되지 않은 자원은 가격이 0, 가격이 0인 자원은 사용되지 않음.
알고리즘
LP Duality 변환 규칙 (Primal → Dual):
Primal (max) Dual (min)
─────────────────────────────────────
c_j (objective coeff) b_j (RHS)
b_i (RHS) c_i (objective coeff)
A_ij A_ji (transpose)
≤ constraint (i) y_i ≥ 0
x_j ≥ 0 ≥ constraint (j)
Primal (min) 으로 시작하면
→ Dual (max) 로 대칭.
Max-Flow Min-Cut Duality:
Primal: source → sink 최대 유량 f*
Dual: S-T 컷 (S, T) 의 최소 용량
f* = min_{S-T cut} capacity(S, T)
구현
// Primal-Dual pairing: simplex tableau 로 dual 변수 추출
#include <bits/stdc++.h>
using namespace std;
int main() {
// Primal: max x+y s.t. x+2y<=4, 2x+y<=5, x,y>=0
// Dual: min 4y1+5y2 s.t. y1+2y2>=1, 2y1+y2>=1, y1,y2>=0
vector<vector<double>> a = {{1,2,1,0,4}, {2,1,0,1,5}};
vector<double> obj = {-1,-1,0,0,0};
double opt = 0;
// Simplex pivot (간략)
static const int PIVOT[][2] = {{0,0},{1,1}}; // entering/leaving
for (auto [r,c] : PIVOT) {
double piv = a[r][c];
for (auto& v : a[r]) v /= piv;
for (int i = 0; i < 2; i++) {
if (i == r) continue;
double mul = a[i][c];
for (auto& v : a[i]) v -= mul * a[r][c];
}
double mul = obj[c];
for (auto& v : obj) v -= mul * a[r][c];
}
opt = obj[4] > 1e-9 ? 0 : -obj[4];
cout << "Primal opt: " << opt << "\n";
cout << "Dual y1: " << obj[2] << ", y2: " << obj[3] << "\n";
}Primal: 3.0000, x=[2. 1.]
Dual: 3.0000, y=[0.33333333 0.33333333]
Gap: 0.00e+00 (strong duality)복잡도
| 항목 | 값 |
|---|---|
| Weak Duality | c^T x ≤ b^T y (max primal 기준) |
| Strong Duality | c^T x* = b^T y* (if both feasible) |
| Dual 변환 비용 | O(1) (형식 변환만) |
Dual 을 푸는 비용은 primal 과 동등한 LP 복잡도. 하지만 dual 이 변수/제약이 더 적을 수 있음.
변형 / 활용
| 분야 | Duality 쌍 |
|---|---|
| Max-Flow Min-Cut | 최대 유량 (Primal) → 최소 S-T 컷 (Dual) |
| Min-Cost Flow | shortest path potentials (Dual variables) |
| Bipartite Matching | 최대 매칭 = 최소 버텍스 커버 (Kőnig 정리) |
| KKT 조건 | 비선형 최적화의 일반화된 duality |
| 근사 알고리즘 | Primal-Dual schema: dual 해로 primal 의 lower bound 추정 |
Max-Flow Min-Cut Theorem
모든 네트워크에서 max flow = min s-t cut capacity. LP duality 의 가장 직관적인 예. Primal 은 유량 극대화, Dual 은 컷 용량 최소화.
LP Primal-Dual Schema (근사 알고리즘)
- Dual 해 y 를 greedy 로 구성.
- Complementary slackness 조건을 “완화” (relaxed) 하여 primal 해 x 를 재구성.
- Set cover, Steiner tree, facility location 등에 사용.
함정
1. Strong Duality 는 항상 성립하지 않는다
두 문제 모두 feasible 해야 성립. 하나가 infeasible 이면 gap 이 무한.
2. Dual 의 Dual = Primal
Dual 을 다시 쌍대화하면 원래 Primal. 변환을 2번 하면 제자리.
3. 정수 제약에서는 Duality Gap
ILP 에서 LP relaxation 의 dual 값은 primal ILP 와 gap 이 있을 수 있음 (integrality gap).
BOJ 연습 문제
| 번호 | 제목 | 정답률 | 링크 |
|---|---|---|---|
| BOJ 11377 | 열혈강호 3 | - | kokoa-lab |
| BOJ 2316 | 도시 왕복하기 2 | - | kokoa-lab |
| BOJ 2188 | 축사 배정 | - | kokoa-lab |
| BOJ 5419 | 북서풍 | - | kokoa-lab |
참고
이 글의 용어 (4개)
- 네트워크 유량 (Network Flow)algorithm
- 정의 네트워크 유량 (Network Flow) 은 방향 그래프 G = (V, E) 에서 각 간선 (u, v) 의 용량 (capacity) c(u, v) 가 주어질 때, 소스 s …
- 선형 계획법 (Linear Programming)algorithm
- 정의 선형 계획법 (Linear Programming, LP) 은 선형 부등식 제약 조건 아래에서 선형 목적 함수를 최적화 (최대화/최소화) 하는 문제. 표준형: 변수 x ∈ ℝ…
- 이분 매칭 (Bipartite Matching)algorithm
- 정의 이분 매칭 (Bipartite Matching) 은 이분 그래프 G = (L ∪ R, E) 에서 간선 부분집합 M ⊆ E 을 선택하되, M 의 어떤 두 간선도 정점을 공유하…
- 최대 유량 최소 컷 정리 (Max-Flow Min-Cut Theorem)algorithm
- 정의 최대 유량 최소 컷 정리 (Max-Flow Min-Cut Theorem) 는 네트워크 유량 그래프 G = (V, E) 에서 source s 에서 sink t 로의 최대 유량…
💬 댓글