การหาวิธีแก้ปัญหามุมที่แน่นอนในการเขียนโปรแกรมเชิงเส้นโดยใช้วิธีการจุดภายใน


11

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

สมมติว่าเราต้องการหามุมของ polytope แทน ตัวอย่างเช่นถ้าเราต้องการจับคู่สูงสุดโดยลดลงเป็นการเขียนโปรแกรมเชิงเส้นเราไม่ต้องการคำตอบที่ประกอบด้วย "การจับคู่ประกอบด้วย 0.34% ของขอบ XY และ 0.89% ของขอบ AB และ ... " เราต้องการคำตอบด้วย 0 และ 1 (ซึ่ง simplex จะให้เราเนื่องจากทุกมุมประกอบด้วย 0 และ 1 ของ) มีวิธีทำเช่นนี้ด้วยวิธีการจุดภายในที่รับประกันว่าจะหาวิธีการแก้ปัญหามุมที่แน่นอนในเวลาพหุนาม? (เช่นบางทีเราสามารถปรับเปลี่ยนฟังก์ชั่นวัตถุประสงค์เพื่อสนับสนุนมุม)


1
@JD: ทำไมคุณไม่ตอบคำถามนี้?
กราฟิลส์

คำตอบ:


6

คุณอาจต้องการอ่านกระดาษ:

Sanjay Mehrotra, เกี่ยวกับการหาวิธีการแก้ปัญหาจุดสุดยอดโดยใช้วิธีการจุดภายในพีชคณิตเชิงเส้นและการประยุกต์ของเล่มที่ 152, 1 กรกฎาคม 1991, หน้า 233-253, ISSN 0024-3795, 10.1016 / 0024-3795 (91) 90277-4 ลิงก์บทความ sciencedirect


4

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


มันน่าสนใจมากกว่าในทางทฤษฎีมากกว่าเชิงปฏิบัติ ถึงกระนั้นหลายครั้งที่วิธีการตกแต่งภายในจุดจะเร็วกว่าซิมเพล็กซ์ดังนั้นอาจมีปัญหาในกรณีที่นี่เป็นปัญหาในทางปฏิบัติ;)
Jules

3

สำหรับการขาดรายละเอียดนี่เป็นเพียงความคิดเห็นอีกต่อไป:

อัลกอริธึมเวลาพหุนามของ Karmarkarเคลื่อนไปใกล้ขอบเท่านั้น ในตอนท้ายจะพบทางออกพื้นฐานที่เหมาะสม (เช่นมุม) ซึ่งเหมาะสมที่สุดเมื่อใช้รูปแบบการทำให้บริสุทธิ์ ¹ คุณสามารถใช้เทคนิคนี้หรือเทคนิคที่คล้ายคลึงกันเพื่อเลื่อนไปยังมุมหนึ่งจากระนาบ


¹ฉันไม่สามารถทำให้มันออกมาในใน Karmarkar ของกระดาษเดิม การอ้างอิงของฉันคือ "Lineare Optimierung und Netzwerkoptimierung" (อังกฤษ: การเพิ่มประสิทธิภาพเชิงเส้นและเครือข่าย) โดย Hamacher และ Klamroth ซึ่งมีข้อความภาษาเยอรมันและภาษาอังกฤษอยู่เคียงข้างกัน


1

ใช่มีวิธีง่าย ๆ และฉันได้นำไปใช้ใน C ++ เพื่อรวมความเร็วของวิธีการจุดภายในกับความถูกต้องของวิธีการ simplex (โดยใช้การปรับแต่งแบบวนซ้ำของเมทริกซ์พื้นฐานที่ฉันสามารถบรรลุความถูกต้องของ 1 ส่วนใน 10 ^ 15 และดีกว่าในการฝึกอบรมข้อ จำกัด ที่หนาแน่นที่มีมากกว่า 1,000 ตัวแปรและข้อ จำกัด )

คีย์อยู่ในวิธี simplex ที่คุณใช้ สมมติว่าวิธีซิมเพล็กมีกลไกสำหรับการเปลี่ยนโครงสร้างพื้นฐาน (เช่นหลังจากข้อผิดพลาดในการปัดเศษสะสมทำให้จำเป็น) และวิธีการเปลี่ยนโครงสร้างนี้เพียงแค่สร้างเมทริกซ์ผกผันพื้นฐานสำหรับพื้นฐานที่มีรายการตัวแปรพื้นฐานที่ต้องการทั้งหมด ยิ่งกว่านั้นสมมติว่าแม้ว่าพื้นฐานที่ต้องการจะไม่สามารถสร้างขึ้นมาใหม่ได้ แต่อัลกอริธึม simplex สามารถดำเนินการต่อจากพื้นฐานที่มี 95% ของพื้นฐานเป้าหมายได้คำตอบนั้นง่ายมาก

สิ่งที่คุณต้องทำคือใช้วิธีการแก้ปัญหาจากวิธีการจุดภายในของคุณกำจัดตัวแปรที่มีค่าวิธีการแก้ปัญหาหลักจะเป็นศูนย์โดยความเกียจคร้านเสริมและให้ขนาดพื้นฐานในปัญหา simplex ของ b นำตัวแปร b ในการตกแต่งภายใน วิธีการแก้ปัญหาจุดที่มีค่ามากที่สุด (หรือมากที่สุดเท่าที่มีค่าที่ไม่ใช่ศูนย์หากที่น้อยกว่า b) และ refactor พื้นฐาน simplex เพื่อให้มีตัวแปร b เหล่านั้น จากนั้นดำเนินการกับวิธี simplex ต่อไปจนกว่าจะแก้ปัญหา เนื่องจากคุณกำลังเริ่มต้นปัญหาซิมเพล็กซ์ใกล้กับเส้นชัยซึ่งมักจะรวดเร็วมาก

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