Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C/C++에서 Branch와 Bound를 사용하는 0/1 배낭?

<시간/>

아이디어는 Greedy 접근법이 Fractional Knapsack 문제에 대한 최상의 솔루션을 제공한다는 사실을 구현하는 것입니다.

특정 노드가 더 나은 솔루션을 제공할 수 있는지 여부를 확인하기 위해 Greedy 접근 방식을 구현하는 최적의 솔루션(노드를 통해)을 계산합니다. Greedy 접근법 자체로 계산된 솔루션이 지금까지 최고 이상이라면 노드를 통해 더 나은 솔루션을 얻을 수 없습니다.

완전한 알고리즘은 아래와 같습니다 -

  • Greedy Approach를 구현하여 상한값을 계산할 수 있도록 단위 중량당 값의 비율이 내림차순으로 모든 항목을 정렬합니다.

  • maxProfit =0과 같은 최대 이익 초기화

  • 빈 대기열 Q가 생성됩니다.

  • 의사결정 트리의 더미 노드를 생성하여 Q에 삽입하거나 큐에 넣습니다. 더미 노드의 이익과 가중치는 0이 됩니다.

  • Q가 비어 있지 않거나 비어 있지 않은 동안 다음을 수행하십시오.

    • Q에서 항목이 생성됩니다. 추출된 항목을 u로 둡니다.

    • 다음 레벨 노드의 이익을 계산합니다. 이익이 maxProfit보다 크면 maxProfit을 수정합니다.

    • 다음 레벨 노드의 경계를 계산합니다. bound가 maxProfit보다 높으면 Q에 다음 레벨 노드를 추가합니다.

    • 다음 레벨 노드가 솔루션의 일부로 취급되지 않거나 고려되지 않는 경우를 고려하고 다음 레벨로 큐에 노드를 추가하지만 다음 레벨 노드를 처리하거나 고려하지 않고 가중치와 이익을 얻습니다.

아래에 제공된 그림 -

입력

// First thing in every pair is treated as weight of item
// and second thing is treated as value of item
Item arr1[] = {{2, 40}, {3.14, 50}, {1.98, 100}, {5, 95}, {3, 30}};
Knapsack Capacity W1 = 10

출력

The maximum possible profit = 235