Bob 's Sale (제품 합계를 최소화하기 위해 제약 조건이있는 페어 재정렬)


15

얼마 전에 Stack Overflow 에서이 질문을했습니다. 문제 : Bob의 판매 . 누군가가 여기에 질문을 게시 할 것을 제안했습니다.

누군가가 이미이 문제와 관련된 질문을했습니다. 주어진 카디널리티의 최소 무게 하위 포리스트 -내가 이해하는 한 내 문제에 도움이되지 않습니다. StackOverflow에 대한 최고 등급의 답변도 살펴볼 가치가 있습니다.

다음은 내 StackOverflow 질문의 축약 사본입니다. 아마도이 사이트에 적합하게 공식화되지 않았을 것입니다 (여기서 묻는 것만으로는 교육이 충분하지 않다고 느낍니다).


참고 : 이것은 SWF 파일의 레코드 순서와 관련된 실제 문제를 요약 한 것입니다. 솔루션은 오픈 소스 애플리케이션을 개선하는 데 도움이됩니다.

Bob은 상점을 가지고 있으며 판매를 원합니다. 그의 상점에는 여러 제품이 있으며 재고가있는 각 제품의 특정 정수 수량 단위가 있습니다. 또한 가격이 이미 인쇄되어있는 여러 선반 장착 가격 레이블 (제품 수만큼)이 있습니다. 그는 모든 제품에 가격 레이블을 붙일 수 있습니다 (해당 제품의 전체 재고에 대해 한 품목의 단일 가격). 일부 제품에는 추가 제한이 있습니다. 이러한 제품은 다른 제품보다 저렴하지 않을 수 있습니다.

Bob의 모든 도자기의 총 비용이 가능한 한 낮도록 가격 레이블을 배열하는 방법을 찾아야합니다. 총 비용은 각 제품에 지정된 가격 레이블의 합계에 해당 제품의 수량을 곱한 값입니다.


주어진:

  • N – 제품 및 가격 레이블 수
  • S i , 0≤ i <N – 인덱스 i (정수) 의 제품 재고 수량
  • P j , 0≤ j <N – 인덱스 j가있는 가격 레이블의 가격 (정수)
  • K – 추가 구속 조건 쌍 수
  • A k , B k , 0≤ k <K – 추가 구속 조건에 대한 제품 지수
    • 모든 제품 색인은 B에 최대 한 번 나타날 수 있습니다. 따라서이 인접 목록에 의해 형성된 그래프는 실제로 일련의 방향 트리입니다.

프로그램은 다음을 찾아야합니다.

  • M i , 0≤ i <N – 제품 인덱스에서 가격 레이블 인덱스로의 맵핑 (P M i 는 제품 i의 가격 임 )

조건을 만족 시키려면 :

  1. P M A k ≤ P M B k , 0≤ k <K
  2. 0≤i <N에 대한 Σ (S i × P M i ) 는 최소입니다

첫 번째 조건이 아닌 경우 솔루션은 단순히 가격과 제품을 수량별로 분류하고 레이블을 직접 정렬하는 것입니다.

입력의 일반적인 값은 N, K <10000입니다. 실제 문제에는 몇 가지 구별되는 가격표 (1,2,3,4) 만 있습니다.


가장 간단한 솔루션 (토폴로지 정렬 포함)이 작동하지 않는 이유는 다음과 같습니다.

당신은 가격 (1) (10)를 통해 수량으로 10 개 항목, 10 개 가격 레이블이 1 ~ 수량 1 항목보다 저렴 안됩니다 항목 수량 10 : 하나 개의 조건이있다 10.$$

최적의 솔루션은 다음과 같습니다.

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

총 비용이 249 인 경우. 1,10 쌍을 극단 부근에 배치하면 총 비용이 더 높아집니다.$


맨 아래 예제의 사전 형식이 지정된 블록 인 Erm이 문제를 일으켰으며 문제를 해결하는 방법을 잘 모르겠습니다 (StackOverflow의 Markdown 구문 및 <pre> 태그는 여기서 작동하지 않는 것 같습니다).
블라디미르 판 텔레 예프

달러 기호가 TeX 구분 기호로 취급 되었기 때문에 사전 형식이 지정된 블록에 대한 마크 업이 인식되지 않았습니다 (TeX 마크 업이 사전 형식이 지정된 블록에 대한 마크 업을 왜 망치는지 알 수는 없지만). 때문에 달러 기호를 탈출하기 위해 "올바른"방법이있을 것 같지 않습니다 , 나는 임시 방법으로 그것을 해결했습니다.
이토 츠요시

질문이 뭐야? 최적의 솔루션을 찾기위한 (효율적인) 알고리즘을 원하십니까? 경도? 대략적인 해결책?
Marcos Villagra 2013

1
@ 이토, 감사합니다. @Marcos-죄송합니다.이 문제를 해결하기 위해 알고리즘을 찾고 있습니다. 제 프로젝트에서 구현할 수 있기를 바랍니다. 대략적인 솔루션에 대한 많은 아이디어가 있으므로 정확한 솔루션이 선호됩니다.
블라디미르 판 텔레 예프

1
가치있는 것에 대해서는 관련 질문 ( cstheory.stackexchange.com/q/4904/751 )이 가격이 k 1과 N-k 0으로 구성된 경우를 고려 한다고 생각합니다 .
mhum

답변:


6

또한 스택 오버플로에 대한 귀하의 원래 질문에 이것을 게시했습니다.


문제는 일반적인 경우 NP 완료입니다. 이것은 3- 파티션 (여전히 NP- 완료된 빈 포장 버전)의 감소를 통해 보여 질 수 있습니다.

하자 w는 1 , ..., w는 N 이 3 분할 경우의 물체의 중량이 될 수 있도록 , b는 빈 크기 및 수 K = / 3 N 채워질 수있다 빈들의 수. 따라서 빈 당 정확히 3 개의 개체가 있도록 개체를 분할 할 수있는 경우 3 개의 파티션이 있습니다.

환원을 위해, 우리는 N = 설정된 킬로바이트 와 각 빈에 의해 표현되는 B의 동일한 가격의 가격 라벨 (P 생각 나는 마다 증가 b를 번째 라벨). t i , 1≤ iki 번째 빈에 해당하는 레이블의 가격 이라고합시다 . 각각에 대해 w 나는 우리가 하나의 제품의 S의이 J 양을 나는 + 1 (의 루트 제품이 전화를 할 수 있습니다 w 내가 ) 다른 내가 1 - S의보다 저렴 할 필요 수량 1 제품 J (휴가 제품이라고 부릅니다).

들면 t (2B + 1) = I가 , 1≤ i가k는 , 3 분할이있는 경우와 밥에 판매 될 수있는 경우에만 2B Σ 1≤ IK t I :

  • 3- 파티션에 대한 솔루션이있는 경우 동일한 빈에 지정된 오브젝트 w i , w j , w l에 해당하는 모든 b 제품 에 제한 사항을 위반하지 않고 동일한 가격으로 레이블을 지정할 수 있습니다. 따라서, 용액을 가지고 선정 2B Σ를 1≤ IK t I (제품 가격의 총량 보낸 t를 이다 2B ).
  • Bob 's Sale의 최적 솔루션을 고려하십시오. 먼저 모든 솔루션에서 3 개 이상의 루트 제품이 동일한 가격 레이블을 공유한다는 것을 관찰하십시오. "너무 많은"이러한 루트 제품 각각에 대해 3 개 미만의 루트 제품을 고수하는 저렴한 가격표가 있습니다. 가격 레이블 당 정확히 3 개의 루트 제품이있는 경우 (있는 경우) 솔루션보다 나쁩니다.
    이제 가격 당 3 개의 루트 레이블이있는 Bob 's Sale의 솔루션이 여전히있을 수 있지만 휴가 상품은 동일한 가격 레이블을 지니지 않습니다. 가장 비싼 가격 레이블 태그를의 루트 제품 말 w 내가 싼 태그 휴가 제품이 있습니다. 이것은 3 개의 루트 레이블 w i , w j , w l가장 비싼 가격으로 태그를 추가하면 b에 합산되지 않습니다 . 따라서이 가격으로 태그 된 제품의 총 비용은 2b + 1 이상 입니다.
    따라서 이러한 솔루션에는 비용 t k (2b + 1) + 다른 할당 비용이 있습니다. 기존 3- 파티션의 최적 비용은 2b Σ 1≤ ik t i 이므로 방금 고려 된 경우가 더 나쁘다는 것을 보여 주어야합니다. 이 경우인지 t K > 2B Σ 1 ≤ i가K-1 t I (주 그것이의 K-1 합 있음). 설정 t의 내가= (2b + 1) i , 1≤ ik 입니다. 이것은 또한 가장 비싼 가격표가 "나쁜"것이지만 다른 것이라면 마찬가지입니다.

따라서 이것은 파괴적인 부분입니다. ;-) 그러나 다른 가격표의 수가 일정하면 다이나믹 프로그래밍을 사용하여 다항식 시간으로 해결할 수 있습니다.


7

이것은 Gero의 답변 에 대한 후속 조치 입니다. 아이디어는 강한 NP 경도를 나타 내기 위해 그의 구조를 수정하는 것입니다.

나는=(2+1)나는나는=나는=21나는케이나는

나는1

따라서 모든 잎 제품이 루트 제품과 동일한 상품을 가진 경우에만 청구 된 상품을 얻을 수 있습니다. 즉, 3 개의 파티션이 있습니다.

케이에프(케이)영형(1)영형(케이)


또한 원래 스택 오버플로 질문에 교차 게시되었습니다.


난 그냥해야 있도록 :) 통찰력에 감사,이 개 답변을 받아 들일 수 없다
블라디미르 Panteleev

0

이것은 게임 이론 질문처럼 들립니다. 이 경우 매우 간단한 무차별 솔루션은 다음과 같습니다.

제약 조건이 형식의 일부 변형을 나타낸다고 가정 해 봅시다

S-> AkSBk | AkBkS | SAkBk

해결책은 제약 조건을 먼저 추가 한 다음 요소를 추가하는 것입니다. 예 : n = 10이라고 말하면 A1B1과 A2B2의 두 가지 제약이 있습니다. 그런 다음 루트 노드에 하위 3 개가 있습니다 (레벨 2). 이 3 개의 노드 각각에는 7 개의 하위 레벨 3이 있고 각 21에는 6 개의 레벨 4 등이 있습니다. 본질적으로 가능한 모든 조합을 실행합니다.

                A1B1 --- 레벨 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- 레벨 2

나무를 키우십시오. 처음에는 끔찍한 해결책처럼 보이지만 휴리스틱과 가지 치기를 사용하여 매우 비싼 잎을 쫓는 것을 포기할 수 있다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.