ให้ฉันดูว่าฉันทำถูกต้องแล้วบล็อกที่ทำเครื่องหมายสีแดงเป็นสีน้ำเงินและอัลกอริทึมพบรูปร่าง T และทำเครื่องหมายสีแดงว่าถูกต้องหรือไม่ เป้าหมายของคุณคือการค้นหารูปร่าง T มากที่สุดเท่าที่เป็นไปได้ด้วยบล็อกสีเดียวกันแก้ไขจนฉันหวังว่า ขณะนี้คุณทำเครื่องหมายออกเมื่อคุณพบพวกเขาและทำให้ประโยชน์ของอัลกอริทึมลดลง (เนื่องจากคุณอาจพลาดวิธีที่เหมาะสมที่สุด) คุณกำลังวางแผนในการค้นหารูปร่างทั้งหมดแล้วเลือกสิ่งที่จะใช้และสิ่งที่ไม่ควรใช้ ฉันถูกต้องแล้วหรือยัง สาเหตุที่คุณต้องการเพิ่มจำนวนบล็อกที่มีอยู่ภายในรูปร่าง T เมื่ออัลกอริทึมเสร็จสิ้น
หากฉันถูกต้องต่อไปนี้เป็นทางออกที่ดีที่สุดสำหรับสถานการณ์ของคุณในความคิดของฉัน
เราจะใช้การเขียนโปรแกรมเชิงเส้นจำนวนเต็ม
ฉันเชื่อว่าฉันเคยใช้สิ่งนี้ในอดีต:
http://sourceforge.net/projects/lpsolve/
http://lpsolve.sourceforge.net/5.5/Java/README.html
(คุณสามารถใช้งานได้กับหลายภาษาฉันใช้กับ PHP, Java และ C)
สิ่งที่เราจะทำคือลงทะเบียนรูปร่าง T ทุกอย่างที่เป็นไปได้บนกระดานแล้วใช้ ILP เพื่อเพิ่มจำนวนบล็อกที่ครอบคลุมมากที่สุด ILP นั้นซับซ้อนอย่างมาก พิจารณาขนาดของบอร์ดของคุณว่าจะไม่เป็นปัญหา ฉันใช้คำถามที่มีความซับซ้อนน้อยกว่า / สูงสุดในกราฟที่มี ILP และใช้เวลาเพียงเสี้ยววินาทีในการดำเนินการและถึง 30-90 วินาทีกับจุดยอดนับร้อย (ในกรณีของคุณมันอยู่ในเสี้ยววินาที)
สิ่งที่ฉันอยากจะแนะนำให้ทำ:
- ค้นหารูปร่าง Line ที่เป็นไปได้ทั้งหมด
- ค้นหาทางแยกทั้งหมดระหว่างรูปร่างเส้นที่มีสีเดียวกัน
- ค้นหารูปร่าง T ที่เป็นไปได้ทั้งหมดค้นหาจุดตัดทั้งหมด
- กำหนดตัวแปรบูลีนในปัญหาเชิงเส้นสำหรับแต่ละรูปร่าง T (
0 <= Bi <= 1
) เนื่องจากค่าเป็นจำนวนเต็มนั่นจะเหลือ 0 หรือ 1
- กำหนดเงื่อนไขสำหรับรูปร่างแต่ละคู่ของ T ที่ตัดกัน (
Bi + Bj <= 1
)
- ฟังก์ชันวัตถุประสงค์จะเป็น (ผลรวมของบล็อกในรูปทรง "T" (i) * Bi)
- เรียกใช้ตัวแก้ไขและทำให้รูปร่าง T เข้มขึ้นซึ่งบูลีนที่สอดคล้องกันของตัวแก้ปัญหาโดยที่ 1 ในโซลูชันที่ดีที่สุด
นี่เป็นความรู้ที่มีค่าฉันใช้ตัวแก้ปัญหาเชิงเส้นบ่อยครั้งสำหรับโครงการทำงาน
ILP นั้นเป็นวิธีการแก้ปัญหาการเลือกที่คุณต้องการบรรลุสูงสุดหรือต่ำสุดสำหรับฟังก์ชั่นเชิงเส้นบางอย่าง
คุณสามารถอ่านเพิ่มเติมได้ที่นี่การใช้ Integer Linear Programming และ Linear Programming เหมือนกันสำหรับโปรแกรมเมอร์เท่านั้นที่ Integer นั้นซับซ้อนกว่าสำหรับคอมพิวเตอร์มากซึ่งอาจส่งผลให้ใช้เวลานาน ไม่ใช่ในกรณีของคุณมันง่ายมากและควรใช้เวลาน้อยกว่ามิลลิวินาทีในกรณีที่เลวร้ายที่สุด
ฉันเดาว่าคุณสามารถอ่านเพิ่มเติมได้ที่นี่:
http://en.wikipedia.org/wiki/Integer_linear_programming#Integer_unknowns
สิ่งนี้อธิบายได้ดี:
http://fisher.osu.edu/~croxton_4/tutorial/
โดยทั่วไปมันเป็นวิธีแก้ปัญหาการตัดสินใจวิธีการตัดสินใจที่ให้ผลลัพธ์สูงสุดตามที่คุณต้องการ นี่จะถือว่าฟังก์ชันที่ตัดสินผลลัพธ์เป็นเส้นตรงซึ่งในกรณีปัจจุบันของคุณโดยเฉพาะ ฟังก์ชั่นที่ตัดสินผลในกรณีนี้รวมบล็อกสำหรับรูปร่าง T ทั้งหมดที่คุณตัดสินใจที่จะทำให้มืดลง
ในทางคณิตศาสตร์, วิธีการตั้งค่าตัวแปร: ในกรณีปัจจุบันของเรา Booleans (ฉันทำให้รูปร่าง T มืดลงด้วยดัชนี i หรือไม่) เป็นค่าที่เหมาะสมที่สุดเพื่อให้ได้ผลลัพธ์สูงสุดที่เราต้องการ: ทำการบล็อกให้มากที่สุดเท่าที่จะเป็นไปได้ ตราบใดที่ผลลัพธ์ที่คุณต้องการสามารถคำนวณได้ด้วยฟังก์ชันเชิงเส้นเมื่อคุณมีตัวแปรทั้งหมดที่ตั้งค่าไว้มันจะแก้ปัญหาได้ ในกรณีของเราเราตรวจสอบว่า T รูปร่างใดที่เรามืดและรวมบล็อกที่ครอบคลุม
ฉันรู้ว่ามันไม่สำคัญดังนั้นถ้าคุณเลือกที่จะก้าวกระโดดรู้สึกอิสระที่จะแสดงความคิดเห็นและฉันจะทำอย่างละเอียด