วิธีการค้นหารอบที่รวมกันเกี่ยวข้องกับจำนวนมากที่สุดของขอบที่ไม่ใช้ร่วมกันในกราฟกำกับ?


26

ฉันไม่ได้เป็นนักทฤษฎีวิทยาการคอมพิวเตอร์ แต่คิดว่าปัญหาโลกแห่งความจริงเป็นของที่นี่

ปัญหา

บริษัท ของฉันมีหลายหน่วยงานทั่วประเทศ

เราเสนอให้พนักงานมีความเป็นไปได้ที่จะทำงานในหน่วยงานอื่น แต่มีเงื่อนไข: จำนวนคนงานทั้งหมดในหน่วยไม่สามารถเปลี่ยนแปลงได้

นั่นหมายความว่า: เราจะอนุญาตให้พนักงานออกจากหน่วยของเขาหากมีคนต้องการสถานที่ของเขา

ข้อมูลการร้องขอตัวอย่าง (สมมติ):

Name            Origin    Destination
Maria              1  ->  2
Marcos             2  ->  3
Jones              3  ->  4
Terry              4  ->  5
Joe                5  ->  6
Rodrigo            6  ->  1
Barbara            6  ->  1
Marylin            1  ->  4
Brown              4  ->  6
Benjamin           1  ->  3
Lucas              4  ->  1

ข้างต้นวางแผน: การแสดงข้อมูลข้างต้น

ดูว่าเราต้องเลือกระหว่างตัวเลือกสีแดงสีน้ำเงินหรือสีดำอย่างไร

ปัญหาที่แท้จริงนั้นซับซ้อนกว่านี้เล็กน้อยเนื่องจากเรามี 27 ยูนิตและ 751 คำขอ โปรดดูการสร้างภาพข้อมูล

เป้าหมาย

มีการรวบรวมคำขอทั้งหมดวิธีการตอบสนองมากที่สุดของพวกเขา?

แอปพลิเคชันทฤษฎี (?)

มีกราฟให้ทุกหน่วยเป็นจุดยอดและคำร้องขอเป็นขอบกำกับการแลกเปลี่ยนที่ประสบความสำเร็จจะอยู่ในรูปของไคล์กำกับV EG(V,E)VE

แต่ละรอบจะต้องใช้เพียงครั้งเดียว ( คนงานไม่สามารถออกจากหน่วยของเขาสองครั้ง ) แต่สามารถเยี่ยมชมหลายครั้ง ( หน่วยหนึ่งสามารถมีคนงานจำนวนมากที่ต้องการออก )VEV

คำถาม

หากปัญหานี้แสดงออกมาเป็น

"วิธีการหารอบที่รวมกันเกี่ยวข้องกับจำนวนมากที่สุดของขอบที่ไม่ใช้ร่วมกันในกราฟกำกับ"?

เราจะตอบสนองผู้ร้องขอส่วนใหญ่หรือไม่?

สิ่งนั้นเป็นความจริงมีอัลกอริธึมที่จะค้นหาชุดของรอบที่เหมาะสมที่สุด

วิธี Greddy นี้จะแก้ปัญหาได้หรือไม่?

  1. ค้นหาวงรอบกำกับที่ใหญ่ที่สุดใน ;G
  2. ลบขอบมันออกจาก ;G
  3. ทำซ้ำ 1 จนกระทั่งไม่มีรอบกำกับบน ;G

คุณสามารถช่วยฉันได้ไหม?

คุณรู้วิธีอื่นในการอธิบายปัญหาต้นฉบับ (ทำให้ผู้ขอใช้บริการส่วนใหญ่มีความสุข)

แก้ไข : เปลี่ยนแผนกเป็นหน่วยเพื่ออธิบายปัญหาได้ดียิ่งขึ้น


3
คุณแน่ใจหรือว่าต้องการหลีกเลี่ยงการใช้ขอบเดียวกันมากกว่าหนึ่งครั้ง จากคำอธิบายแอปพลิเคชันของคุณดูเหมือนว่าคุณควรหลีกเลี่ยงการใช้จุดสุดยอดเดียวกันมากกว่าหนึ่งครั้งซึ่งเป็นเงื่อนไขที่ดีกว่า
Tsuyoshi Ito

3
@TsuyoshiIto: ตามที่ฉันเข้าใจจากคำอธิบายเงื่อนไขคือในแต่ละจุดสุดยอด indegree ควรเท่ากับ outdegree ดังนั้นจึงไม่จำเป็นต้องแยกจากกัน
โยชิโอะโอกาโมโตะ

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

3
โพสต์นี้กล่าวถึงลักษณะทั่วไปของปัญหาของคุณokasaki.blogspot.co.uk/2008/03/what-heck-is-math-trade.html (คิดว่าแต่ละคนมีรายการหนึ่งเพื่อแลกเปลี่ยนนั่นคือตำแหน่งงานของพวกเขา)
Radu GRIGore

4
คำถามที่ยอดเยี่ยมทำให้เรารู้สึกว่าสิ่งที่เราสามารถนำไปใช้ได้จริงในชีวิตจริง :)
Gopi

คำตอบ:


9

ตกลงฉันอ่านรหัสของ TradeMaximizer และฉันเชื่อว่ามันแก้ปัญหาทั่วไปได้มากขึ้นต่อไปนี้

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

เพื่อแก้คำถามที่ถามนี่ให้จุดเป็นพนักงานและวาดโค้งของต้นทุนต่อหน่วยเมื่อxจะชอบงานของปี โปรดทราบว่าขณะนี้พนักงานเป็นจุดสูงสุดแทนที่จะเป็นขอบ สิ่งที่ดีคือพนักงานสามารถพูดว่า "ฉันต้องการงานของyแต่zก็ทำเช่นกัน"xyxyyz

วิธีการแก้:

  1. สร้างกราฟแบบสองฝ่ายดังนี้: สำหรับแต่ละจุดยอดในกราฟต้นฉบับแนะนำจุดยอดซ้ายx Lจุดยอดขวาx Rและส่วนโค้งx Lx Rซึ่งค่าใช้จ่ายสูงมาก (ใหญ่กว่าผลรวมของต้นทุนในต้นฉบับ กราฟ). สำหรับแต่ละส่วนโค้งx yในกราฟต้นฉบับแนะนำส่วนโค้งx Ly Rในกราฟสองส่วนxxLxRxLxRxyxLyR

  2. ค้นหาการจับคู่ที่สมบูรณ์แบบต้นทุนต่ำสุดในกราฟสองฝ่าย

มีการประมวลผลกราฟต้นฉบับล่วงหน้าด้วยเช่นกัน: ลบส่วนโค้งระหว่าง SCC จากนั้นประมวลผลขนาด SCC ทั้งหมดตามที่ระบุข้างต้น>1

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

PS: ผู้เขียน, คริสโอคาสากิได้รับการยืนยันว่านี่คือสิ่งรหัสไม่กลับไปที่โพสต์บล็อก


ฉันจัดการเพื่อค้นหาวิธีแก้ไขปัญหาดั้งเดิมโดยใช้ TradeMaximizer ฉันจะโพสต์ detais ในวันพรุ่งนี้
motobói

@ motobói แต่สิ่งที่คุณต้องทำคือสิ่งที่ฉันเขียนในวรรคสอง ...
Radu GRIGore

ฉันพบคำอธิบายเกี่ยวกับอัลกอริทึมนี้: boardgamegeek.com/wiki/page/TradeMaximizer
motobói

คุณสามารถอธิบายหรือชี้ไปที่คำอธิบายว่าทำไมจึงจำเป็นต้องลบส่วนโค้งระหว่างส่วนประกอบที่มีการเชื่อมต่อที่แข็งแกร่ง?
motobói

@ motobóiมันเป็นการเพิ่มประสิทธิภาพ (สำหรับกรณีทั่วไป) ขั้นตอน (1) และ (2) ควรเพียงพอ
Radu GRIGore

22

1-1

เนื่องจากค่าใช้จ่ายและกำลังการผลิตทั้งหมดถูก จำกัด ด้วยค่าคงที่อัลกอริทึมการยกเลิกรอบอย่างง่ายจะค้นหาการหมุนเวียนที่ต้องการในเวลาพหุนาม นี่เกือบจะเหมือนกับอัลกอริทึมโลภที่เห็นได้ชัด:

while G has any negative-cost directed cycles
    γ = arbitrary negative-cost directed cycle
    reverse every edge in γ
    negate the cost of every edge in γ
return the subgraph of reversed edges

O(VE)0-EEO(VE2)

นี่ไม่ใช่อัลกอริทึมที่เร็วที่สุดที่รู้จักกัน


คิดว่ามันใช้งานได้ตราบใดที่คนไม่ต้องการทำงานใน "หน่วย" มากกว่าหนึ่งหน่วยใช่มั้ย การใช้ถ้อยคำของคำถามดั้งเดิม แต่ถ้าคนต้องการทำงานในหน่วยมากกว่าหนึ่งสงสัยว่าสิ่งที่เป็นนามธรรมนี้แบ่งลง OP ระบุปัญหาในแง่ของหน่วยเดียวเท่านั้น [มนุษย์คนไหนที่มีความพึงพอใจเพียงอย่างเดียว ... ?]
vzn

1
"บุคคล" และ "หน่วย" คืออะไร? นี่เป็นคำถามเกี่ยวกับกราฟ
Jeff

ฉันสับสน: ตัวอย่างของฉันไม่ใช่ตัวอย่างเคาน์เตอร์สำหรับอัลกอริทึมนี้หรือไม่ หลังจากเลือก C รอบ C_1 และ C_2 จะไม่มีรอบอีกต่อไป (เนื่องจากแต่ละรอบมีหนึ่งขอบที่ตรงกันข้าม) C จะไม่ถูกใช้อีกครั้งเนื่องจากมีค่าใช้จ่ายเป็นบวกหลังจากกลับขอบของมันและไม่มีรอบใหม่ พวกเรากำลังพูดถึงปัญหาเดียวกันหรือไม่? ชอบที่จะมีสูตรทางคณิตศาสตร์ของปัญหา
FiB

3
CCC1C2C'C'C1C2C'=C1+C2-C

เห็นได้ชัดว่า "หน่วย" เป็นอะไรที่เหมือน "แผนก" และผู้ใช้กำลังบันทึกคำขอโอนย้ายระหว่างแผนก [ไม่ใช่ตำแหน่งเฉพาะในแผนก] หรือไม่? แผนภาพ FIB ดูเหมือนว่าจะมีหน่วยเป็นจุดยอดและขอบตามคำขอ empl ระหว่างหน่วย FiB-- "ชอบที่จะมีสูตรทางคณิตศาสตร์ของปัญหา" .. มันขึ้นอยู่กับคุณที่จะให้สูตรที่แม่นยำ .. คุณดูเหมือนจะอยู่ครึ่งทางนั่น ..
vzn

4

วิธีการโลภนี้จะไม่ให้ทางออกที่ดีที่สุดเสมอไป

Cn{(โวลต์1,โวลต์2),...,(โวลต์n,โวลต์1)}C1C2n-1C

CnC1C2

C1C22(n-1)=2n-2

n2


-3

อาจมีวิธีการทางทฤษฎี / สูตรการคำนวณเพื่อแก้ปัญหานี้ แต่ปัญหานี้ฟังดูเหมือนปัญหาการเปลี่ยนแปลงกับฉันที่การเปลี่ยนลำดับทั้งหมดบางส่วนถูกปฏิเสธและผู้อื่นก็ใช้ได้ การเรียงสับเปลี่ยนเป็นพนักงานและตำแหน่งเป็น "ตำแหน่ง" ใน บริษัท การเปลี่ยนแปลงถูกปฏิเสธถ้ามันไม่ตรงกับข้อกำหนดของ "คน [x] ต้องการตำแหน่ง [y]" ความแตกต่างของหน่วย / ขอบเขต / org เห็นได้ชัดว่าไม่จำเป็นสำหรับการแก้ปัญหาในกรณีนี้

ปัญหาการเปลี่ยนรูปแบบนี้พร้อมข้อ จำกัด สามารถแปลงเป็นตัวอย่างของปัญหา SAT (ความพึงพอใจ) ได้อย่างง่ายดาย การกำหนดตัวแปรบูลีนหมายถึงพนักงานและข้อ จำกัด แสดงถึงข้อ จำกัด "person [x] ต้องการตำแหน่ง [y]" มีตัวอย่างคลาสสิกในบริเวณใกล้เคียงโดยทั่วไปมักจะเรียกว่าปัญหา "โต๊ะอาหารค่ำ" ซึ่งคุณมีตำแหน่งที่นั่งและแขกและไม่ใช่แขกทุกคนที่ต้องการนั่งถัดจากกัน (หรือคล้ายกันมากกับแขกบางคน

และแน่นอนว่ามีตัวแก้ SAT ที่ซับซ้อนสำหรับอินสแตนซ์ขนาดใหญ่พอสมควรซึ่งเกี่ยวข้องกับตัวแปรและส่วนคำสั่งต่างๆนับร้อยบนพีซีและหากปัญหาไม่ "ยาก" ในหน่วยพัน

ดูเช่น [1] สำหรับการอ้างอิงระดับมืออาชีพและ [2] สำหรับแบบฝึกหัดในชั้นเรียน นอกจากนี้ยังมีความคล้ายคลึงกันของโครงสร้างบางอย่างกับสิ่งที่เรียกว่า "ปัญหานกพิราบ" ซึ่งได้รับการศึกษาอย่างดีในแวดวง SAT ที่นกพิราบถูกกำหนดให้กับนกพิราบและคุณมีรูมากกว่าหรือน้อยกว่านกพิราบ ในกรณีนี้อย่างไรก็ตามนกพิราบมักถูกมองว่าเป็นสิ่งที่ใช้แทนกันได้ กล่าวอีกนัยหนึ่งปัญหาของโต๊ะอาหารก็เหมือนปัญหานกพิราบที่มีข้อ จำกัด ที่แข็งแกร่งกว่าและแขก / นกพิราบต้องมีความต้องการ

ทราบแน่นอน / โปรดจำไว้ว่าสำหรับปัญหาประเภทนี้ขึ้นอยู่กับข้อ จำกัด คำตอบอาจเป็น "ไม่มีวิธีแก้ไขข้อ จำกัด ดังกล่าว"

[1] อัลกอริทึมโต๊ะอาหารเย็นโดย crato

[2] CS402 พรินซ์ตัน HW SAT

[3] ปัญหาความพึงพอใจวิกิพีเดีย


ฉันลองเปลี่ยนรูปโดยใช้คนชักชวน ตั้งพนักงานเป็นผู้ใช้ที่ต้องการค้าหน่วยของเขาXสำหรับหน่วยY แต่ซอฟต์แวร์จะไม่อนุญาตให้ผู้ใช้มากกว่าหนึ่งรายซื้อขายรายการเดียวกัน (หน่วยของเขา) แต่ละรายการจะต้องไม่ซ้ำกัน เพื่อรองรับสิ่งนี้ฉันจะต้องพูด [(Jones) ต้องการแลกเปลี่ยน Unit-C-James สำหรับ Unit-D-Laura หรือ Unit-D-Sergio หรือ Unit-D-Mary]
motobói
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.