การขายของ Bob (การเรียงลำดับคู่ที่มีข้อ จำกัด เพื่อลดผลรวมของผลิตภัณฑ์)


15

ผมเคยถามคำถามนี้ในกองมากเกินขณะที่ผ่านมา: ขายของบ๊อบ: ปัญหา มีคนแนะนำการโพสต์คำถามที่นี่เช่นกัน

มีคนถามคำถามเกี่ยวกับปัญหานี้แล้ว - น้ำหนักต่ำสุดย่อยของ cardinality ที่กำหนด - แต่เท่าที่ฉันเข้าใจมันไม่ได้ช่วยฉันด้วยปัญหาของฉัน คำตอบที่ได้รับคะแนนสูงสุดใน StackOverflow ก็ควรพิจารณาเช่นกัน

ต่อไปนี้เป็นคำต่อคำของคำถาม StackOverflow ของฉัน อาจเป็นสูตรที่ไม่เหมาะสมสำหรับไซต์นี้ (เฮ้ฉันรู้สึกว่าไม่ได้รับการศึกษาเพียงแค่ขอจากที่นี่) ดังนั้นอย่าลังเลที่จะแก้ไข:


หมายเหตุ: นี่เป็นคำพูดที่เป็นนามธรรมของปัญหาชีวิตจริงเกี่ยวกับการสั่งซื้อบันทึกในไฟล์ SWF โซลูชันจะช่วยฉันปรับปรุงแอปพลิเคชันโอเพนซอร์ซ

Bob มีร้านค้าและต้องการขายสินค้า ร้านค้าของเขามีสินค้าจำนวนหนึ่งและเขามีหน่วยเป็นจำนวนเต็มจำนวนหนึ่งของแต่ละผลิตภัณฑ์ในสต็อก นอกจากนี้เขายังมีป้ายราคาติดตั้งบนชั้นวางจำนวนมาก (มากที่สุดเท่าที่จำนวนผลิตภัณฑ์) โดยมีการพิมพ์ราคาลงบนพวกเขา เขาสามารถวางป้ายราคาใด ๆ ในผลิตภัณฑ์ใด ๆ (ราคารวมสำหรับหนึ่งรายการสำหรับสินค้าทั้งหมดของเขาของผลิตภัณฑ์นั้น) แต่สินค้าบางอย่างมีข้อ จำกัด เพิ่มเติม - ผลิตภัณฑ์ดังกล่าวอาจไม่ถูกกว่าผลิตภัณฑ์อื่นบางอย่าง

คุณต้องหาวิธีจัดเรียงป้ายราคาเช่นว่าค่าใช้จ่ายโดยรวมของสินค้าทั้งหมดของบ๊อบต่ำที่สุดเท่าที่จะเป็นไปได้ ต้นทุนรวมคือผลรวมของป้ายราคาที่กำหนดของแต่ละผลิตภัณฑ์คูณด้วยปริมาณของผลิตภัณฑ์นั้นในสต็อก


ได้รับ:

  • N - จำนวนของผลิตภัณฑ์และป้ายราคา
  • S i , 0≤ i <N - ปริมาณสินค้าในสต็อคที่มีดัชนีi (จำนวนเต็ม)
  • P j , 0≤ j <N - ราคาบนฉลากราคาพร้อมดัชนีj (จำนวนเต็ม)
  • K - จำนวนคู่ข้อ จำกัด เพิ่มเติม
  • A k , B k , 0≤ k <K - ดัชนีผลิตภัณฑ์สำหรับข้อ จำกัด เพิ่มเติม
    • ดัชนีผลิตภัณฑ์ใด ๆ อาจปรากฏขึ้นหนึ่งครั้งใน B ดังนั้นกราฟที่เกิดขึ้นจากรายการ adjacency นี้เป็นชุดของต้นไม้ที่กำกับ

โปรแกรมจะต้องค้นหา:

  • M i , 0≤ i <N - การแมปจากดัชนีผลิตภัณฑ์ไปยังดัชนีป้ายราคา (P M iคือราคาของผลิตภัณฑ์i )

เพื่อตอบสนองเงื่อนไข:

  1. P M A k ≤ P M B k , สำหรับ0≤ k <K
  2. Σ (S i × P M i ) สำหรับ0≤ i <N นั้นน้อยมาก

โปรดทราบว่าหากไม่ใช่เงื่อนไขแรกโซลูชันจะทำการเรียงลำดับฉลากตามราคาและผลิตภัณฑ์ตามปริมาณและจับคู่ทั้งสองโดยตรง

ค่าทั่วไปสำหรับอินพุตจะเป็น N, K <10,000 ในปัญหาในชีวิตจริงมีแท็กราคาที่แตกต่างกันเพียงไม่กี่ (1,2,3,4)


นี่คือตัวอย่างหนึ่งว่าทำไมโซลูชั่นที่ง่ายที่สุด (รวมถึงการจัดเรียงโทโพโลยี) ไม่ทำงาน:

$$

ทางออกที่ดีที่สุดคือ:

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

$


Erm บล็อกที่จัดรูปแบบล่วงหน้าสำหรับตัวอย่างที่ด้านล่างมีข้อผิดพลาดและฉันไม่แน่ใจว่าจะแก้ไขได้อย่างไร (ไวยากรณ์ Markdown ของ StackOverflow และแท็ก <pre> ดูเหมือนจะไม่ทำงานที่นี่)
Vladimir Panteleev

มาร์กอัปสำหรับบล็อกที่จัดรูปแบบล่วงหน้าไม่ได้รับการยอมรับเนื่องจากเครื่องหมายดอลลาร์ถูกถือว่าเป็นตัวคั่น TeX (แม้ว่าฉันจะไม่ทราบว่าเพราะเหตุใดมาร์กอัปของ TeX จึงทำลายมาร์คอัปสำหรับบล็อกที่จัดรูปแบบล่วงหน้า) เนื่องจากดูเหมือนจะไม่มีวิธีที่“ ถูกต้อง” ในการหลีกเลี่ยงสัญญาณดอลลาร์ฉันจึงทำการแก้ไขด้วยวิธีการเฉพาะกิจ
Tsuyoshi Ito

คำถามคืออะไร? คุณต้องการอัลกอริทึม (มีประสิทธิภาพ) สำหรับการค้นหาโซลูชันที่ดีที่สุดหรือไม่ ความแข็ง? ทางออกโดยประมาณ?
Marcos Villagra

1
@ ฉันขอบคุณ @Marcos - ขอโทษฉันกำลังมองหาอัลกอริทึมในการแก้ปัญหานี้หวังว่าเร็วพอที่ฉันสามารถใช้มันในโครงการของฉัน มีแนวคิดมากมายสำหรับโซลูชันโดยประมาณดังนั้นควรเลือกโซลูชันที่แน่นอน
Vladimir Panteleev

1
สำหรับสิ่งที่คุ้มค่าฉันคิดว่าคำถามที่เกี่ยวข้อง ( cstheory.stackexchange.com/q/4904/751 ) พิจารณากรณีที่ราคาประกอบด้วย k และ N − k zeroes
mhum

คำตอบ:


6

ฉันยังโพสต์สิ่งนี้กับคำถามเดิมของคุณใน Stack Overflow:


ปัญหาคือ NP-complete สำหรับเคสทั่วไป สิ่งนี้สามารถแสดงได้ผ่านการลดขนาดพาร์ติชั่น 3 ตัว (ซึ่งเป็นเวอร์ชั่นที่สมบูรณ์ของการบรรจุถังขยะรุ่น NP)

ให้w 1 , ... , w nเป็นน้ำหนักของวัตถุของอินสแตนซ์ 3 พาร์ติชัน, ให้bเป็นขนาดของ bin และ k = n / 3จำนวนของถังขยะที่ได้รับอนุญาตให้เติม ดังนั้นจึงมี 3- พาร์ติชันหากวัตถุสามารถแบ่งพาร์ติชันดังกล่าวว่ามี 3 วัตถุต่อ bin

สำหรับการลดลงเราตั้งค่า N = kbและแต่ละ bin จะถูกแสดงด้วยป้ายราคาbของราคาเดียวกัน (คิดว่า P iเพิ่มขึ้นทุกป้ายที่b ) ขอทีฉัน , 1≤ ฉันkเป็นราคาของฉลากที่สอดคล้องกับฉัน bin TH สำหรับแต่ละW ฉันเรามีหนึ่งผลิตภัณฑ์ S JปริมาณW ฉัน + 1 (ช่วยให้เรียกสิ่งนี้ว่าผลิตภัณฑ์รากของW ฉัน ) และอีกW ฉัน - 1ผลิตภัณฑ์ปริมาณ 1 ซึ่งจะต้องมีราคาถูกกว่า S J (เรียกผลิตภัณฑ์เหล่านี้ลา)

สำหรับเสื้อฉัน = (2b + 1) ฉัน , 1≤ ฉันkมีพาร์ทิชัน 3 และถ้าหากบ๊อบสามารถขาย2b Σ 1≤ ฉันk T ฉัน :

  • หากมีวิธีแก้ปัญหาสำหรับ 3 พาร์ติชันผลิตภัณฑ์bทั้งหมดที่เกี่ยวข้องกับวัตถุw i , w j , w lที่กำหนดให้กับถังขยะเดียวกันสามารถติดป้ายกำกับด้วยราคาเดียวกันโดยไม่ละเมิดข้อ จำกัด ดังนั้นวิธีการแก้ปัญหามีค่าใช้จ่ายที่ 2b Σ 1≤ ฉันk T ฉัน (ตั้งแต่ปริมาณรวมของผลิตภัณฑ์ที่มีราคาทีฉันเป็น2b )
  • พิจารณาทางออกที่ดีที่สุดของ Bob's Sale แรกสังเกตว่าในการแก้ปัญหาใด ๆ มากกว่า 3 ผลิตภัณฑ์รากแบ่งปันป้ายราคาเดียวกันสำหรับแต่ละผลิตภัณฑ์ดังกล่าวที่ "มากเกินไป" มีป้ายราคาที่ถูกกว่าซึ่งติดอยู่กับผลิตภัณฑ์รากน้อยกว่า 3 สิ่งนี้เลวร้ายยิ่งกว่าวิธีแก้ปัญหาใด ๆ เพราะมีผลิตภัณฑ์ 3 รายการต่อฉลากราคา (ถ้ามี)
    ขณะนี้ยังมีวิธีแก้ปัญหาของ Bob's Sale ที่มี 3 ป้ายชื่อรูทต่อราคา แต่ผลิตภัณฑ์ที่ลาของพวกเขาไม่ได้ใส่ป้ายราคาเดียวกัน (ถังเรียงลำดับของการไหลผ่าน) สมมติว่าป้ายราคาสินค้าที่แพงที่สุดนั้นเป็นผลิตภัณฑ์รูทของw ฉันซึ่งมีผลิตภัณฑ์ลาแท็กที่ถูกกว่า นี่หมายความว่า 3 รูทเลเบลw i , w j , w lแท็กที่มีราคาแพงที่สุดไม่ได้เพิ่มขึ้นถึงข ดังนั้นค่าใช้จ่ายทั้งหมดของผลิตภัณฑ์ที่มีแท็กราคานี้เป็นอย่างน้อย2b + 1
    ดังนั้นโซลูชันดังกล่าวจึงมีต้นทุนt k (2b + 1) + ต้นทุนการมอบหมายอื่น ๆ เนื่องจากค่าใช้จ่ายที่ดีที่สุดสำหรับอยู่ 3 พาร์ทิชัน2b Σ 1≤ ฉันk T ฉันเราจะต้องแสดงให้เห็นว่ากรณีการพิจารณาเพียงแค่จะเลวร้ายยิ่ง เป็นกรณีนี้ถ้าเสื้อk > 2b Σ 1≤ ฉันK-1 เสื้อฉัน (หมายเหตุว่ามันเป็นK-1ในผลรวมในขณะนี้) การตั้งค่าทีฉัน= (2b + 1)ฉัน , 1≤ ฉันk , เป็นกรณีนี้ สิ่งนี้ถือได้ว่าไม่ใช่แท็กราคาที่แพงที่สุดคือ "เลว" แต่อย่างใด

ดังนั้นนี่คือส่วนที่ทำลายล้าง ;-) อย่างไรก็ตามหากจำนวนแท็กราคาแตกต่างกันเป็นค่าคงที่คุณสามารถใช้การเขียนโปรแกรมแบบไดนามิกเพื่อแก้ปัญหาในเวลาพหุนาม


7

นี่คือการติดตามคำตอบของ Geroคำตอบความคิดคือการปรับเปลี่ยนการก่อสร้างของเขาเพื่อแสดงความแข็ง NP ที่แข็งแกร่ง

เสื้อผม=(2+1)ผมเสื้อผม=ผมP=2Σ1ผมkเสื้อผมแปลว่ามีพาร์ติชั่น 3 ตัว

Wผม-1PP

ดังนั้นจึงเป็นไปได้ที่จะได้รับรางวัลที่อ้างสิทธิ์เท่านั้นหากผลิตภัณฑ์ใบไม้ทั้งหมดมีรางวัลเดียวกันกับผลิตภัณฑ์รากซึ่งหมายความว่ามีพาร์ติชัน 3 ส่วน

k(k)nO(1)nO(k)


รวมทั้งโพสต์ข้ามไปยังคำถามสแต็ค - โอเวอร์โฟลว์เดิม


ฉันไม่สามารถยอมรับสองคำตอบดังนั้นฉันก็จะต้องขอขอบคุณสำหรับความเข้าใจ :)
วลาดิเมีย Panteleev

0

ฟังดูเหมือนคำถามทฤษฎีการเล่นเกม ในกรณีดังกล่าววิธีการแก้ปัญหาแบบบังคับกำลังแบบง่าย ๆ คือ

ให้เราสมมติว่าข้อ จำกัด เป็นตัวแทนของรูปแบบคงที่

S-> AkSBk | AkBkS | SAkBk

การแก้ปัญหาคือการเพิ่มข้อ จำกัด ก่อนแล้วจึงองค์ประกอบ เช่นให้เราบอกว่า n = 10 และมีข้อ จำกัด 2 ข้อคือ A1B1 และ A2B2 จากนั้นมีลูกสามคนไปที่โหนดรูท (ระดับ 2) แต่ละโหนด 3 โหนดเหล่านี้จะมีลูก 7 ระดับระดับ 3 แต่ละโหนดมี 21 ลูกที่ระดับ 4 เป็นต้นโดยพื้นฐานแล้วคุณจะต้องใช้ชุดค่าผสมที่เป็นไปได้ทั้งหมด

                A1B1 --- ระดับ 1 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1 --- ระดับ 2

และปลูกต้นไม้ แม้ว่าในตอนแรกดูเหมือนว่าจะเป็นทางออกที่น่ากลัว แต่ฉันรู้สึกว่าคุณสามารถละทิ้งใบที่มีราคาแพงมากด้วยการใช้ฮิวริสติกและการตัดแต่งกิ่ง ...

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.