บทนำ
เขียนแก้สำหรับการเขียนโปรแกรมเชิงเส้นจำนวนเต็ม
ท้าทาย
งานของคุณคือเขียนตัวแก้สำหรับการเขียนโปรแกรมเชิงเส้นจำนวนเต็ม (ILP) ใน ILP จะได้รับอสมการเชิงเส้นของเซตของ unknowns (ซึ่งทั้งหมดเป็นจำนวนเต็ม) และเป้าหมายคือการค้นหาขั้นต่ำหรือสูงสุดของฟังก์ชันเชิงเส้น
ตัวอย่างเช่นสำหรับความไม่เท่าเทียมกัน (ตัวอย่างที่นำมาจากการเขียนโปรแกรมเชิงเส้นจำนวนเต็มแบบผสม )
4x+2y-15≤0
x+2y- 8≤0
x+ y- 5≤0
- x ≤0
- y ≤0
และฟังก์ชั่นวัตถุประสงค์3x+2y
สูงสุดของฟังก์ชั่นวัตถุประสงค์ควรจะ12
( x=2,y=3
) ในขณะที่ขั้นต่ำควรจะ0
( x=y=0
)
อินพุตถูกกำหนดเป็นอาร์เรย์ 2d (หรือเทียบเท่าตามข้อกำหนดมาตรฐาน) แต่ละแถวสอดคล้องกับความไม่เท่าเทียมกันหนึ่งข้อยกเว้นแถวสุดท้าย ตัวเลขในอาร์เรย์เป็นค่าสัมประสิทธิ์และ≤0
ส่วนที่ถูกละเว้นเสมอ หากมีn
องค์ประกอบในแต่ละแถวก็หมายความว่ามีn-1
สิ่งแปลกปลอม
แถวสุดท้ายของอาร์เรย์สอดคล้องกับฟังก์ชันเชิงเส้น ค่าสัมประสิทธิ์มีการระบุไว้
ตัวอย่างเช่นอาร์เรย์อินพุตสำหรับปัญหาข้างต้นคือ
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,0]].
ผลลัพธ์ควรเป็นค่าต่ำสุดและค่าสูงสุดที่กำหนดในรูปแบบที่สมเหตุสมผล
สำหรับปัญหาต่อไปนี้ (ข้อ จำกัด สองข้อถูกนำออกจากปัญหาข้างต้น):
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]].
สูงสุดยังคงอยู่12
แต่ค่าต่ำสุดไม่มีอยู่และฟังก์ชันวัตถุประสงค์สามารถมีค่าลบขนาดใหญ่ตามอำเภอใจ (ในแง่ของค่าสัมบูรณ์) ในกรณีนี้โปรแกรมควรส่งออก12
ตามค่าเท็จที่ตัดสินใจโดยผู้ตอบ อีกกรณีหนึ่งคือไม่มีวิธีแก้ปัญหาเลยตัวอย่างเช่น
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]].
ในกรณีนี้ค่าเท็จควรส่งออกเช่นกัน มันจะเป็นการดีที่จะแยกแยะกรณีที่ "ค่าที่ดีที่สุด" สำหรับฟังก์ชั่นวัตถุประสงค์คืออินฟินิตี้และกรณีที่ไม่มีวิธีแก้ปัญหาเลย แต่สิ่งนี้ไม่จำเป็น
อินพุตมีค่าสัมประสิทธิ์จำนวนเต็มทั้งสำหรับความไม่เท่าเทียมกันและสำหรับฟังก์ชันวัตถุประสงค์เท่านั้น สิ่งที่ไม่ทราบทั้งหมดเป็นจำนวนเต็มด้วย เมทริกซ์สัมประสิทธิ์ของความไม่เท่าเทียมกันรับประกันว่าจะมีอันดับเต็ม
กรณีทดสอบ
เครดิตให้กับ @KillillL สำหรับการค้นหาจุดบกพร่องในชุดทดสอบดั้งเดิมและทำให้ฉันเข้าใจปัญหา ILP ได้มากขึ้น
Input
Output
[[4,2,-15],[1,2,-8],[1,1,-5],[-1,0,0],[0,-1,0],[3,2,1]]
[1,13]
[[4,2,-15],[1,2,-8],[1,1,-5],[3,2,0]]
[-inf, 12]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[3,2,0]]
[NaN, NaN]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[5,5,5,5,6,7]]
[55, inf]
[[-1,-1,-1,-1,-1,8],[1,1,1,1,0,0],[0,0,0,0,0,4]]
[4, 4]
[[4,2,-15],[-1,-2,7],[-1,0,3],[0,1,0],[0,0,4]]
[NaN, NaN]
รายละเอียด
ไม่จำเป็นต้องกังวลเกี่ยวกับการจัดการข้อยกเว้น
นี่คือรหัส - กอล์ฟจำนวนไบต์ต่ำสุดชนะ
9
จำนวนสูงสุดของราชวงศ์:12
จำนวนสูงสุดของความไม่เท่าเทียมกัน:คุณสามารถรับอินพุตและให้เอาต์พุตผ่านรูปแบบมาตรฐานและคุณสามารถเลือกรูปแบบได้ฟรี
ตามปกติช่องโหว่เริ่มต้นจะมีผลที่นี่