배낭 문제의 변형


11

배낭의 항목 수를 상수 로 제한 해야하는 경우 동적 프로그래밍 상황에서 배낭 문제에 어떻게 접근 합니까? 이것은 같은 문제입니다 (최대 무게 , 모든 항목의 값 V 및 무게 ) . 배낭 에 항목 만 추가 할 수 있으며 배낭 값을 최적화해야합니다.

우리는 3 차원이 필요합니까? 그렇지 않으면 다른 접근법을 찾을 수 있습니다. 셀의 배낭에 항목 수를 추가하고 끝에 항목 수 == 최대 값을 가져 오려고했지만 최선의 해결책은 아닙니다.


이것은 좋은 숙제 운동입니다. 무엇을 시도 했습니까? 동적 프로그래밍이 편안합니까? (아니라면 연습을 해보도록하자.) 배낭 문제에 대한 표준 동적 프로그래밍 알고리즘을 연구 했습니까? 표준 접근 방식을 수정하는 방법을 찾으십시오. 주요 임무는 일련의 하위 문제가 무엇인지 디자인하는 것입니다. 표준 접근법에서, 하위 문제는 하나의 매개 변수 (항목의 무게에 대한 한계)를 특징으로합니다. 두 개의 매개 변수 (더 큰 하위 문제점 세트)를 사용하는 것이 좋습니다. 다양한 가능성을 시도하십시오-무엇을 얻습니까?
DW

답변:


9

아주 좋은 질문입니다!

당신은 두 번 옳습니다.

  1. 배낭에있는 품목의 수를 전파한다고해서 최적의 솔루션으로 이어지지는 않습니다.
  2. 하나의 솔루션은 3 차원을 추가하는 것으로 구성됩니다. 이것은 간단하지만 그렇게 할 때 몇 가지 사실을 고려해야합니다. 그러나 이것이 유일한 대안은 아닙니다.

다음에서는 동적 프로그래밍 기반 솔루션에 익숙하다고 가정합니다. 특히, 솔루션을 결정하기 위해 테이블을 뒤로 이동하는 방법에 대해서는 설명하지 않겠습니다 .

먼저 일반적인 경우에 중점을 두겠습니다 . 항목 수는 무제한 입니다. 이 경우, 당신은 단지 테이블 구축 T , j는 배낭의 전체 용량이 같을 때 최적의 값을 포함 전을 하고 첫 번째 J의 항목이 고려됩니다. 여기에서:TTi,jij

나는,제이=최대{나는,제이1,나는제이,제이1+V제이}

여기서 V J에서 의 무게 값과 방치 J의 각각 번째 항목. 경우 C는 사용자의 배낭의 전체 용량과 총있다 N의 최적 솔루션이 주어진다 항목 T C , N . 이 알고리즘은 의사 다항식 시간으로 실행되는 것으로 알려져 있으며 그 아름다움 중 하나는 최대 용량에 맞는 조합 만 고려한다는 것입니다.제이V제이제이,

그러나 제약 조건을 추가 할 때는 충분하지 않습니다 : 최대 항목 수 . 그 이유는 이전 반복 수식에서 다른 항목 조합을 고려하지 않기 때문입니다.

  1. 첫째, 만일 다음 T I , J = ( T I - w J , J - 1 + 브이 J ) 때문에 그 j 개의 번째는 고려되는 최대 항목 수에도 불구하고 항목이 배낭에 추가됨, p나는,제이1<(나는제이,제이1+V제이)나는,제이=(나는제이,제이1+V제이)제이--- 제약 조건을 위반할 수 있습니다. 글쎄, 여기에 각 단계에 삽입 된 항목 수를 추적하는 위의 공식을 적용하고 현재 배낭에있는 항목 수가 초과 하지만 다른 항목을 추가하지 않으려 고 유혹 할 수 있습니다 .
  2. 둘째, 경우 T는 내가 , j는 = T , J - 1 그래서이 항목이 추가되지만되지 않는다는 것을 큰 실수가 될 수도 경우에 최적의 솔루션 T I , J - 1나는,제이1>(나는제이,제이1+V제이)나는,제이=나는,제이1나는,제이1배낭에 넣을 수있는 최대 개수의 항목으로 이미 구성되어 있습니다. 그 이유는 우리가 제대로 비교 아니라는 것이다 : 한편으로 이루어진 최적의 솔루션을 보존하기 위해 이전 중에서 선택 항목 ( J - 1 ) ; 반면에, j 번째 아이템 을 삽입 하고, 이전 ( j - 1 ) 중에서 ( p - 1 ) 아이템을 갖는 최상의 서브셋을 추가로 고려한다 .(제이1)제이(1)(제이1)

첫 번째 솔루션은 3 차원을 추가하는 것으로 구성됩니다. 귀하의 경우 배낭의 용량이 i 일 때 첫 번째 j 항목 만 고려되고 배낭에 k 개 이상의 항목 을 넣을 수없는 경우 가 최적의 솔루션이되도록하십시오 . 지금,나는,제이,케이나는제이케이

  • 만약 계산하는 경우 를 삽입 할 수있는 항목의 수보다 엄격 작거나 같은 항목의 번호 ( J k는 ) 평소와 같이 수행되지만 동일한 값 사용 케이 : T I , J , k는 = 최대 { T I , J - 1 , K , T I - w J , J - 1 , K + V의 J }나는,제이,케이제이케이케이Ti,j,k=max{Ti,j1,k,Tiwj,j1,k+vj}
  • 만약 계산해야한다면 이제 을 삽입 할 수있는 항목의 수보다 엄격 큰 아이템의 번호는 ( J > K는 ) 다음 : T는 I , J는 , k는 = 최대 { T I , J를 - 1 , K , T I - w J , J - 1 , K - 1 + 브이 J }Ti,j,kj>kTi,j,k=max{Ti,j1,k,Tiwj,j1,k1+vj}

첫 번째 표현은 분명해야합니다. 두 번째는 테이블 T 번째 계층이 위에서 요구 한 바와 같이 첫 번째 ( j - 1 ) 중에서 ( k - 1 ) 항목 의 최상의 조합을 추적하기 때문에 작동합니다.(k1)T(k1)(j1)

이 알고리즘의 효율적인 구현은 계산하지 않아도 모두를위한 케이 . 이전의 되풀이 관계는 레이어 k( k - 1 ) 을 관련 시키므로 두 개의 연속 레이어 사이를 번갈아 가며 진행할 수 있습니다 (예 : k = 4 인 최적 솔루션에 관심이있는 경우 두 개의 연속 레이어 만 사용). 1, 1 및 2, 2 및 3, 3 및 4가 완료되었습니다). 다시 말해,이 알고리즘은 동적 프로그래밍에 기반한 기존 방식에 필요한 메모리의 두 배를 차지하므로 의사 다항식 시간으로 계속 실행될 수 있습니다.Ti,j,kkk(k1)k=4

그러나 이것이 유일한 해결책은 아닙니다. 그리고 당신이 더 우아하게 찾을 또 다른 것이 있습니다. 위 수식에서, 우리는 이하로 구성되어 최적의 솔루션 검색 상품 중 제 ( J - 1 ) 로서 T I , J - 1 , K - 1 . 그러나 이것이 정확히 max p = 0 , j - 1 { T i , p }와 동일하다는 것이 분명해야합니다(k1)(j1)Ti,j1,k1maxp=0,j1{Ti,p}원래 테이블을 사용하여 !! 즉, 1 개 항목, 2 개 항목, 3 개 항목, ... ( j - 1 ) 항목 의 최적 솔루션을 고려하여 개 이하의 항목을 가진 최적의 솔루션을 검색 할 수도 있습니다. 또한 셀당 두 개의 정수가 필요하도록 모든 부분 솔루션에서 고려되는 항목 수를 추적하십시오. 이 메모리 점유는 위에 표시된 알고리즘의 메모리 요구 사항과 정확히 동일합니다 (레이어 k 형식의 3 차원 사용 ) .k(j1)k

도움이 되었기를 바랍니다,


매우 훌륭한 답변입니다. 감사합니다. 3 차원을 구현하여 게시물 이전에 얻을 수있었습니다.
user11536

질문을 닫아 주셔서 감사합니다. 응답이 마음에 들었다 니 기쁩니다. 내 아이디어를 명확히하기 위해 파이썬 에서이 알고리즘을 구현하려고 시도했습니다. 관심이 있으시면 알려주세요. 기꺼이 게시하거나 보내 드리겠습니다. 건배,
카를로스 리나 레스 로페즈

다차원 배낭 문제에 대한 놀라운 설명. 유사한 사례가 있지만 정확히 k 개의 요소가 있는지 궁금해했지만 3 차원의 k 번째 열에 의해 반환 된 값만 볼 것입니다. 값이 없으면 0을 반환합니다. 여전히 동적 프로그래밍을 처음 사용하기 때문에 올바른지 확실하지 않습니다.
SteveIrwin

@ CarlosLinaresLópez 좋은 답변입니다. 파이썬 스크립트도 공유해 주시겠습니까? 아마 gist.github.com에 게시 하시겠습니까?
Saad Malik

1
안녕하세요 @Carlos! 대체 수식 사용에 대한 후속 질문을 여기에 게시했습니다 : 0/1 배낭에서 n-best 항목 찾기 . 어쨌든 나는 당신이 휴가를 즐기고 있기를 바랍니다!
Saad Malik
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.