void checknode (node v) {
node u;
if (value(v) is better than best)
best = value(v);
if (promising(v))
for (each child u of v)
checknode(u);
레벨 k에 있는 (현재) 노드에서 왼쪽가지로 가면 k번째 item을 배낭에 넣는 경우이고, 오른쪽 가지로 가면 그 item을 배낭에 넣지 않는 경우이다.
-> 루트에서 leaf까지의 모든 경로는 해답 후보이다.
최적의 해를 찾는 optimization problem이므로 검색이 완전히 끝나기 전에는 해답을 알 수가 없다. 따라서 검색 과정에서 항상 그 때까지 찾은 최적의 해를 기억해야 한다.
profit: 루트에서 현재노드까지 선택한 item들의 총 이윤
weight: 그 노드에 오기까지 넣었던 item의 총 무게
bound: profit의 최대이윤
현재 노드가 레벨 i에 있고, 레벨 k 노드에서 총 무게가 W를 넘는다고 하자. 그러면,
bound = (루트에서 노드 x까지의 cost) + (노드 x에서 해답노드까지의 가장 좋은 cost)
maxprofit: 지금까지 찾은 최선의 해답의 총 이윤값
maxprofit = 현재까지 찾은 최적의 해답 값
최소값 구하는 문제의 경우, maxprofit >= bound
최대값 구하는 문제의 경우, maxprofit <= bound
최적의 해답에 더 빨리 도달하기 위한 전략
1. 주어진 노드의 모든 자식노드를 방문하여 다음을 수행한다.
1) 그 노드의 profit와 weight를 계산한다.
2) 그 노드의 bound를 계산한다.
2. promising 하면서 확장되지 않은 (unexpanded) 노드 살펴보고
promising: weight < W and bound > maxprofit
3. 그 중 가장 좋은(최고의) bound를 가진 노드를 확장함
Best-First Search가 너비우선검색에 비해 좋음
void best_first_BranchBound (state_space_tree T, number best) {
priority_queue_of_node PQ;
node u,v;
initialize(PQ); //PQ를 빈 대기열로 초기화
v = root of T;
maxprofit = profit(v);
insert(PQ, v);
while(!empty(PQ)) { //최고 bound를 가진 노드를 제거
remove(PQ,v);
if (bound(v) > maxprofit) // 노드의 promising 점검
for (each child u of v) {
if (profit(u) > maxprofit)
maxprofit = profit(u); //profit이 현재까지의 max보다 높으면 갱신
if (bound(u) > maxprofit)
insert(PQ,u);
}
}
}
풀이 참고) branch-and-bound : knapsack 문제 풀이
Knapsack Problem 알고리즘 분석
점검하는 노드의 수: O(2^n)
problem:
외판원의 고향 도시에서 출발하여 다른 도시들을 각각 한번씩만 방문하고, 다시 고향으로 돌아오는 일주여행경로(tour, Hamiltonian circuits) 중 가장 짧은 경로(optimal tour)를 구하는 문제
-> 음이 아닌 가중치 있는 방향성 그래프로 표현할 수 있다.
가능한 모든 일주여행경로를 다 고려한 후, 그 중에서 가장 짧은 일주여행경로를 선택한다.
State space tree 구축방법
각 노드: 출발노드로부터의 일주여행경로를 나타냄
최적일주여행경로를 구하기 위해서는 leaf 노드까지의 경로를 모두 검사하여 그 중에서 가장 길이가 짧은 경로를 찾음
Bound: 최소여행경로 길이의 한계값(lower bound)
A = V-([1,...,k] 경로에 속한 모든 노드의 집합)이라 두자

promising node: 최소여행경로를 minlength라고 두자.
Bound(v) < minlength인 노드를 유망한 노드라 한다.
최소여행경로의 초기값: (무한대)로 둔다.
완전한 여행경로를 처음 얻을 때 까지는 bound가 무조건 최소여행경로값보다 작으므로 모든 노드는 promising함
출처 및 자세한 설명 참고 : TSP 문제 (branch-and-bound)
아직도 알고리즘의 시간복잡도는 지수이거나 그보다 못하다.
=> 다른 방법? 근사(approcimation) 알고리즘: 최적의 해답을 준다는 보장은 없지만, 무리 없이 최적에 가까운 해답을 주는 알고리즘이다.
//6장 END.