อัลกอริทึมสำหรับสร้างตารางเวลาของโรงเรียน


96

ฉันสงสัยว่ามีวิธีแก้ปัญหาสำหรับอัลกอริทึมในการสร้างตารางเรียนของโรงเรียนหรือไม่ โดยพื้นฐานแล้วมันเกี่ยวกับการเพิ่มประสิทธิภาพ "การกระจายชั่วโมง" (ทั้งในกรณีของครูและกรณีของชั้นเรียน) สำหรับความสัมพันธ์ของครูประจำชั้น เราสามารถสันนิษฐานได้ว่าเรามีชุดชั้นเรียนหัวข้อบทเรียนและครูที่เกี่ยวข้องกันที่อินพุตและตารางเวลานั้นควรพอดีระหว่าง 8.00 น. ถึง 16.00 น.

ฉันเดาว่าอาจไม่มีอัลกอริทึมที่แม่นยำสำหรับสิ่งนั้น แต่อาจมีคนรู้วิธีการประมาณหรือคำแนะนำที่ดีในการพัฒนา


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

10
ดังที่เอียนริงโรสแห่ง StackOverflow กล่าวกับคำถามอื่น "ยังมี PHD จำนวนมากที่ต้องใช้ในซอฟต์แวร์ตั้งเวลา"
Reed Debaets

คำตอบ:


89

ปัญหานี้NP-Complete !
โดยสรุปเราต้องสำรวจชุดค่าผสมที่เป็นไปได้ทั้งหมดเพื่อค้นหารายการโซลูชันที่ยอมรับได้ เนื่องจากความผันแปรของสถานการณ์ที่ปัญหาปรากฏในโรงเรียนต่างๆ (ตัวอย่างเช่น: มีข้อ จำกัด เกี่ยวกับห้องเรียนหรือไม่, บางชั้นเรียนแบ่งเป็นกลุ่มย่อยบ้างหรือไม่, นี่เป็นตารางประจำสัปดาห์หรือไม่? ฯลฯ ) ไม่มีระดับปัญหาที่รู้จักกันดีซึ่งสอดคล้องกับปัญหาการจัดตารางเวลาทั้งหมด บางทีปัญหาของเป้มีองค์ประกอบหลายอย่างที่คล้ายคลึงกันกับปัญหาเหล่านี้โดยรวม

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

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

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

  • การกำหนดและจัดอันดับข้อ จำกัด ที่ทราบทั้งหมด
  • การลดพื้นที่ปัญหาด้วยตนเองโดยจัดเตรียมชุดข้อ จำกัดเพิ่มเติม
    สิ่งนี้อาจดูขัดจังหวะ แต่ตัวอย่างเช่นการจัดกำหนดการเริ่มต้นที่เต็มไปด้วยบางส่วน (พูดประมาณ 30% ของช่วงเวลา) ในลักษณะที่ตอบสนองข้อ จำกัด ทั้งหมดได้อย่างสมบูรณ์และด้วยการพิจารณากำหนดการบางส่วนที่ไม่เปลี่ยนรูปนี้เราจึงลด เวลา / พื้นที่ที่จำเป็นในการผลิตโซลูชันสำหรับผู้สมัคร
    ข้อ จำกัด เพิ่มเติมอีกวิธีหนึ่งคือการเพิ่มข้อ จำกัด ที่ทำให้ไม่สามารถสอนบางวิชาในบางวันของสัปดาห์ (หากเป็นตารางประจำสัปดาห์ ... ); ข้อ จำกัด ประเภทนี้ส่งผลให้ลดช่องว่างของปัญหา / วิธีแก้ปัญหาโดยปกติแล้วจะไม่รวมผู้สมัครที่ดีจำนวนมาก
  • ตรวจสอบให้แน่ใจว่าสามารถคำนวณข้อ จำกัด บางประการของปัญหาได้อย่างรวดเร็ว ซึ่งมักจะเกี่ยวข้องกับการเลือกแบบจำลองข้อมูลที่ใช้แสดงปัญหา แนวคิดก็คือเพื่อให้สามารถเลือกใช้ (หรือตัดออก) บางตัวเลือกได้อย่างรวดเร็ว
  • การกำหนดปัญหาใหม่และปล่อยให้ข้อ จำกัด บางอย่างเสียไปสองสามครั้ง (โดยทั่วไปจะไปที่โหนดท้ายของกราฟ) แนวคิดในที่นี้คือการลบข้อ จำกัดบางประการสำหรับการกรอกข้อมูลในช่องไม่กี่ช่องสุดท้ายในกำหนดการหรือเพื่อให้โปรแกรมสร้างกำหนดการอัตโนมัติหยุดอายที่จะทำตารางเวลาทั้งหมดให้เสร็จสิ้นแทนที่จะให้รายการโหลหรือเป็นไปได้ ผู้สมัคร มนุษย์มักอยู่ในตำแหน่งที่ดีกว่าในการไขปริศนาให้เสร็จตามที่ระบุไว้อาจทำลายข้อ จำกัด บางประการโดยใช้ข้อมูลที่มักจะไม่ใช้ร่วมกับตรรกะอัตโนมัติ (เช่นกฎ "ไม่มีคณิตศาสตร์ในช่วงบ่าย" อาจถูกทำลายในบางโอกาส สำหรับชั้นเรียน "คณิตศาสตร์และฟิสิกส์ขั้นสูง" หรือ "การฝ่าฝืนข้อกำหนดของ Mr Jones จะดีกว่าหนึ่งใน Ms Smith ... ;-))

ในการพิสูจน์การอ่านคำตอบนี้ฉันตระหนักดีว่ามันค่อนข้างขี้อายในการให้คำตอบที่ชัดเจน แต่ก็ไม่มีข้อเสนอแนะที่เป็นประโยชน์น้อยกว่า ฉันหวังว่าสิ่งนี้จะช่วยให้เกิด "ปัญหาหนัก"


1
คำตอบที่ยอดเยี่ยมถูกต้องและซับซ้อนขอบคุณสำหรับคำแนะนำและการพูดถึงเกี่ยวกับ NP-Completeness (ก็เดาได้เหมือนกัน)
cand

3
คุณมีข้อมูลอ้างอิงที่อธิบายความสมบูรณ์ของ NP ของปัญหานี้หรือไม่?
ดอน

50

มันเป็นเรื่องยุ่ง พระราชระเบียบ เพื่อเพิ่มคำตอบที่สมบูรณ์มากแล้วฉันต้องการชี้ให้เห็นประสบการณ์ครอบครัวของฉัน แม่ของฉันเป็นครูและเคยมีส่วนร่วมในกระบวนการนี้

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

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

อย่างที่คุณเห็นปัญหาไม่ใช่ NP-complete แต่เป็น NP-insane

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


12
"NP-insane" - ชื่อที่ดี;) ฉันยอมรับว่ามันเป็นปัญหาที่ซับซ้อนมากขอบคุณสำหรับความคิดเห็นเกี่ยวกับการรักษา "โลกแห่งความจริง" ของปัญหานี้ พ่อและแฟนของฉันเป็นครูเช่นกันและฉันรู้ว่าโรงเรียนส่วนใหญ่มีตารางที่มีพลาสติกแทรกอยู่ทำให้ฉันต้องคิดอัลกอริทึมที่เป็นไปได้สำหรับปัญหานี้ - เพราะถ้าผู้ชายสามารถแก้ได้บางทีมันอาจจะเขียนได้ ลงเป็นอัลกอริทึม
cand

10
สิ่งที่คุณต้องการเขียนคือระบบผู้เชี่ยวชาญ: ระบบที่สร้างขึ้นจากกฎฮิวริสติกจำนวนมาก นอกเหนือจากระบบผู้เชี่ยวชาญแล้วนี่คือฟิลด์ที่อัลกอริทึมทางพันธุกรรมเป็นหนึ่งในตัวเลือกที่ดีที่สุด ความยากไม่ได้อยู่ที่การแก้ปัญหาไม่เพียง ปัญหายังอยู่ที่การระบุปัญหาและข้อ จำกัด
Stefano Borini

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

1
คุณสามารถแปลข้อ จำกัด และเป้าหมายเหล่านี้เป็น MAXSAT ได้โดยตรง โดยทั่วไปอัลกอริทึม MAXSAT มีความน่าเชื่อถือมากกว่าอัลกอริทึมทางพันธุกรรม แต่คุณอาจมีการระเบิดของประโยคเนื่องจากเป้าหมายเช่นชั้นเรียนคณิตศาสตร์ควรกระจายออกไปในช่วงสัปดาห์
Jules

27

นานาชาติจัดตารางการแข่งขัน 2007มีการตั้งเวลาบทเรียนการติดตามและการกำหนดเวลาสอบติดตาม นักวิจัยหลายคนเข้าร่วมการแข่งขันครั้งนั้น มีการทดลองการวิเคราะห์พฤติกรรมและเมตาฮิวริสติกส์จำนวนมาก แต่ในท้ายที่สุดการค้นหาในท้องถิ่น (เช่น Tabu Search และ Simulated Annealing) เอาชนะอัลกอริทึมอื่น ๆ อย่างชัดเจน (เช่นอัลกอริทึมทางพันธุกรรม)

ดู 2 เฟรมเวิร์กโอเพนซอร์สที่ผู้เข้ารอบสุดท้ายบางคนใช้:

  • JBoss OptaPlanner (Java, โอเพ่นซอร์ส)
  • Unitime (Java, โอเพ่นซอร์ส) - เพิ่มเติมสำหรับมหาวิทยาลัย

17

หนึ่งในงานครึ่งเทอมของฉันคือการสร้างตารางอัลกอริทึมทางพันธุกรรมของโรงเรียน

ทั้งโต๊ะคือ "สิ่งมีชีวิต" อย่างหนึ่ง มีการเปลี่ยนแปลงและคำเตือนบางประการสำหรับวิธีการอัลกอริธึมทางพันธุกรรมทั่วไป:

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

  • การกลายพันธุ์ "Exchange" เป็นเรื่องปกติมากกว่าการกลายพันธุ์ "แก้ไข" การเปลี่ยนแปลงเป็นเพียงส่วนหนึ่งของยีนที่สมเหตุสมผล - ไม่มีการแทนที่ครูด้วยห้องเรียน

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

  • ครูสามารถสร้างตารางภาระงานของตนเป็น "อยากทำงานแล้ว" "โอเคทำงานแล้ว" "ไม่ชอบทำงานแล้ว" "ทำงานไม่ได้แล้ว" โดยกำหนดน้ำหนักให้เหมาะสม ตลอด 24 ชั่วโมงเป็นชั่วโมงการทำงานที่ถูกกฎหมายยกเว้นเวลากลางคืนไม่เป็นที่ต้องการ

  • ฟังก์ชั่นน้ำหนัก ... โอ้ใช่ ฟังก์ชันน้ำหนักเป็นผลิตภัณฑ์ที่ใหญ่มหึมา (เช่นเดียวกับการคูณ) ของน้ำหนักที่กำหนดให้กับคุณสมบัติและคุณสมบัติที่เลือก มันสูงชันมากคุณสมบัติหนึ่งสามารถเปลี่ยนได้อย่างง่ายดายตามลำดับขนาดขึ้นหรือลง - และมีคุณสมบัติหลายร้อยหรือหลายพันรายการในสิ่งมีชีวิตเดียว สิ่งนี้ส่งผลให้ตัวเลขจำนวนมากเป็นน้ำหนักและผลโดยตรงจำเป็นต้องใช้ bignum library (gmp) เพื่อทำการคำนวณ สำหรับแบบทดสอบขนาดเล็กบางกลุ่ม 10 คนครู 10 คนและห้องเรียน 10 ห้องชุดเริ่มต้นเริ่มต้นด้วยบันทึก 10 ^ -200 บางสิ่งและจบด้วย 10 ^ + 300 บางสิ่ง มันไร้ประสิทธิภาพโดยสิ้นเชิงเมื่อแบนมากขึ้น นอกจากนี้ค่านิยมยังขยายวงกว้างขึ้นมากกับ "โรงเรียน" ที่ใหญ่กว่า

  • เวลาในการคำนวณอย่างชาญฉลาดมีความแตกต่างเล็กน้อยระหว่างประชากรกลุ่มเล็ก (100) ในช่วงเวลาอันยาวนานและประชากรจำนวนมาก (10,000+) ในช่วงอายุน้อย การคำนวณในเวลาเดียวกันทำให้เกิดคุณภาพเดียวกัน

  • การคำนวณ (บน CPU 1GHz บางรุ่น) จะใช้เวลา 1 ชั่วโมงในการทำให้เสถียรใกล้ 10 ^ + 300 สร้างตารางเวลาที่ค่อนข้างดีสำหรับกรณีทดสอบ 10x10x10 ดังกล่าว

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

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


5
เปิดโฆษณาแล้วลองเอานักวิชาการเข้ามาดูบ้างไหม? ใช้ซ้ำสำหรับโครงการต่อไปหรือไม่? ในทางเทคนิคแล้วโปรแกรมแบบนี้สำหรับพนักงาน 300 คนเพียงอย่างเดียวจะคุ้มค่ากับเงินที่โรงเรียนในการจัดทำตารางเวลาที่เหมาะสมและพวกเขาไม่รังเกียจที่จะใช้เวลาสองสามวันในการคำนวณตารางเวลาที่เหมาะสมทางพันธุกรรม คิดว่าการประมวลผลแบทช์ สวัสดีสัญญาฮาร์ดแวร์และซอฟต์แวร์;)
jcolebrand

1
ฟังดูดี! ฉันสงสัยว่าฟังก์ชันน้ำหนักสามารถทำได้ด้วยการลอยในช่วง 0..1
Craig McQueen

1
@ Craig: สิ่งที่แบนจะทำให้ประชากรที่หยุดนิ่งหรือแม้กระทั่งคุณภาพลดลงเมื่อเวลาผ่านไปเนื่องจากการกลายพันธุ์แบบสุ่มทำให้เกิดการเปลี่ยนแปลงเชิงลบมากกว่าที่การผสมพันธุ์ / การคัดเลือกจะชดเชยได้ เฉพาะฟังก์ชันที่มีคุณภาพสูงชันมากเท่านั้นที่จะทำให้เติบโตได้อย่างมั่นคง แน่นอนว่าฟังก์ชันนี้สามารถทำให้เป็นมาตรฐานได้ แต่ถึงกระนั้นยีนที่ "ดีกว่า" จะต้องมีโอกาสรอดชีวิตสูงขึ้น
SF.

9

ปัญหานี้รุนแรงกว่าที่คิด

ตามที่คนอื่นพูดถึงนี่เป็นปัญหา NP-complete แต่มาวิเคราะห์กันว่านั่นหมายถึงอะไร

โดยทั่วไปหมายความว่าคุณต้องดูชุดค่าผสมที่เป็นไปได้ทั้งหมด

แต่การ "มอง" ไม่ได้บอกคุณมากนักว่าคุณต้องทำอะไร

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

ปัญหาที่สองคือหนึ่งในการตัดสินว่าชุดค่าผสมที่เป็นไปได้นั้นดีไม่ดีหรือดีกว่าโซลูชัน "ดี" ก่อนหน้านี้

สำหรับสิ่งนี้คุณต้องการมากกว่าแค่ "มันเป็นทางออกที่เป็นไปได้"

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

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

สรุปได้ว่าการสร้างทางออกที่ดีสำหรับปัญหานี้จะมีค่ามากสำหรับหลาย ๆ คน ดังนั้นจึงไม่ใช่เรื่องง่ายที่จะทำลายและแก้ไข เตรียมพร้อมที่จะเดิมพันกับเป้าหมายบางอย่างที่ยังไม่ 100% และเรียกสิ่งเหล่านั้นว่า "ดีพอ"


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

8

อัลกอริทึมการกำหนดเวลาของฉันใช้งานใน FET (ซอฟต์แวร์ Timetabling ฟรีhttp://lalescu.ro/liviu/fet/แอปพลิเคชันที่ประสบความสำเร็จ):

อัลกอริทึมคือฮิวริสติก ฉันตั้งชื่อมันว่า "การแลกเปลี่ยนซ้ำ"

อินพุต: ชุดกิจกรรม A_1 ... A_n และข้อ จำกัด

ผลลัพธ์: ชุดของเวลา TA_1 ... TA_n (ช่วงเวลาของแต่ละกิจกรรมห้องจะไม่รวมอยู่ที่นี่เพื่อความเรียบง่าย) อัลกอริทึมต้องใส่แต่ละกิจกรรมในช่วงเวลาโดยคำนึงถึงข้อ จำกัด TA_i แต่ละตัวอยู่ระหว่าง 0 (T_1) และ max_time_slots-1 (T_m)

ข้อ จำกัด :

C1) พื้นฐาน: รายการของกิจกรรมที่ไม่สามารถทำพร้อมกันได้ (เช่น A_1 และ A_2 เนื่องจากมีครูคนเดียวกันหรือนักเรียนคนเดียวกัน)

C2) ข้อ จำกัด อื่น ๆ อีกมากมาย (ยกเว้นไว้ที่นี่เพื่อความเรียบง่าย)

อัลกอริทึมการกำหนดเวลา (ซึ่งฉันตั้งชื่อว่า "การแลกเปลี่ยนซ้ำ"):

  1. เรียงลำดับกิจกรรมที่ยากที่สุดก่อน ไม่ใช่ขั้นตอนที่สำคัญ แต่อาจเพิ่มความเร็วอัลกอริทึมได้ 10 เท่าหรือมากกว่านั้น
  2. พยายามวางแต่ละกิจกรรม (A_i) ในช่วงเวลาที่อนุญาตโดยทำตามลำดับข้างต้นทีละรายการ ค้นหาช่องว่าง (T_j) สำหรับ A_i ซึ่งสามารถวางกิจกรรมนี้ได้โดยคำนึงถึงข้อ จำกัด หากมีช่องเพิ่มเติมให้เลือกแบบสุ่ม หากไม่มีให้ทำการสลับซ้ำ:

    . ในแต่ละช่วงเวลา T_j ให้พิจารณาว่าจะเกิดอะไรขึ้นถ้าคุณใส่ A_i ลงใน T_j จะมีรายการกิจกรรมอื่น ๆ ที่ไม่เห็นด้วยกับการย้ายนี้ (ตัวอย่างเช่นกิจกรรม A_k อยู่ในช่อง T_j เดียวกันและมีครูคนเดียวกันหรือนักเรียนคนเดียวกันกับ A_i) เก็บรายการกิจกรรมที่ขัดแย้งกันสำหรับแต่ละช่วงเวลา T_j

    . เลือกช่อง (T_j) ที่มีกิจกรรมขัดแย้งกันน้อยที่สุด สมมติว่ารายการกิจกรรมในช่องนี้ประกอบด้วย 3 กิจกรรม: A_p, A_q, A_r

    . วาง A_i ที่ T_j และทำให้ A_p, A_q, A_r ไม่ได้ปันส่วน

    . ลองวาง A_p, A_q, A_r ซ้ำ ๆ (ถ้าระดับการเรียกซ้ำไม่มากเกินไปให้พูดว่า 14 และถ้าจำนวนการเรียกซ้ำทั้งหมดที่นับตั้งแต่ขั้นตอนที่ 2) บน A_i เริ่มไม่มากเกินไปให้พูด 2 * n) ตามขั้นตอนที่ 2)

    . หากวาง A_p, A_q, A_r สำเร็จให้ส่งกลับด้วยความสำเร็จหรือลองใช้ช่วงเวลาอื่น (ไปที่ขั้นตอนที่ 2 b) แล้วเลือกช่วงเวลาที่ดีที่สุดถัดไป)

    . หากลองช่วงเวลาทั้งหมด (หรือจำนวนที่เหมาะสม) ไม่สำเร็จให้ส่งคืนโดยไม่ประสบความสำเร็จ

    . ถ้าเราอยู่ที่ระดับ 0 และเราวาง A_i ไม่สำเร็จให้วางไว้ในขั้นตอนที่ 2 b) และ 2 c) แต่ไม่มีการเรียกซ้ำ ตอนนี้เรามีกิจกรรมอีก 3 - 1 = 2 กิจกรรม ไปที่ขั้นตอนที่ 2) (ใช้วิธีการบางอย่างเพื่อหลีกเลี่ยงการปั่นจักรยานที่นี่)


1
FET มีประโยชน์กับฉันมาก ขอบคุณ @Liviu Lalescu!
Noel Llevares

6

UPDATE: จากความเห็น ... น่าจะมีฮิวริสติกส์ด้วย!

ฉันจะไปกับ Prolog ... จากนั้นใช้ Ruby หรือ Perl หรืออะไรซักอย่างเพื่อล้างโซลูชันของคุณให้อยู่ในรูปแบบที่สวยกว่า

teaches(Jill,math).
teaches(Joe,history).

involves(MA101,math).
involves(SS104,history).

myHeuristic(D,A,B) :- [test_case]->D='<';D='>'.
createSchedule :- findall(Class,involves(Class,Subject),Classes),
                  predsort(myHeuristic,Classes,ClassesNew),
                  createSchedule(ClassesNew,[]).
createSchedule(Classes,Scheduled) :- [the actual recursive algorithm].

ฉัน (ยัง) อยู่ในกระบวนการทำบางอย่างที่คล้ายกับปัญหานี้ แต่ใช้เส้นทางเดียวกับที่ฉันเพิ่งพูดถึง Prolog (เป็นภาษาที่ใช้งานได้) ทำให้การแก้ปัญหา NP-Hard ง่ายขึ้นจริงๆ


1
Prolog เป็นภาษาที่ยอดเยี่ยมในการแสดงปัญหาที่จำเป็นอย่างไรก็ตามตามที่คุณชี้ให้เห็น: ปัญหาคือ NP-complete หากไม่ใช่ NP-Hard ซึ่งหมายความว่า Prolog อาจไม่เร็วพอสำหรับการนำไปใช้งานจริง
Poindexter

3
ถ้ามันมีส่วนเกี่ยวข้องกับ NP และเราจะไม่พอใจกับการประมาณอัลกอริทึมใด ๆ ที่กำหนดขึ้นจะถูกดูดอย่างทวีคูณ :)
Gabriel Ščerbák

1
จากนั้นเป้าหมายคือการใช้ฮิวริสติกที่มีประสิทธิภาพ ... ตัวอย่างเช่นอัลกอริธึมการจัดตารางงาน 9 แบบที่เรียบง่ายใช้เวลา 3.078 วินาทีในการทำให้เสร็จสมบูรณ์ แต่ด้วยการแก้ปัญหาที่เล็กที่สุด WindowFirst ใช้ปัญหาเดียวกันจะใช้เวลาเพียง 0.123 วินาที
Reed Debaets

2
ฮ่าฮ่า prolog (คนเดียว) จะไม่เคยแก้ปัญหานี้ ขออภัยสำหรับตัวพิมพ์ใหญ่ แต่ฉันมีความคิดเดียวกันเมื่อ 10 หรือ 15 ปีที่แล้วและล้มเหลวโดยสิ้นเชิง ไม่ใช่ว่าช้าไม่ได้ มันง่ายมากไม่สามารถไขคดีในโลกแห่งความจริงได้;)!
Karussell


5

1
ลิงค์ยูทิลิตี้และเครื่องมือการตั้งเวลาหยุดทำงาน
Baran

@Baran ใช้เครื่อง wayback แล้วคุณจะพบรายการ
srijanshukla

3

เอกสารนี้อธิบายปัญหาตารางเรียนของโรงเรียนและแนวทางของอัลกอริทึมได้ค่อนข้างดี: " The Development of SYLLABUS - An Interactive, Constraint-Based Scheduler for Schools and Colleges " [PDF]

ผู้เขียนแจ้งให้ฉันทราบว่าซอฟต์แวร์ SYLLABUS ยังคงถูกใช้งาน / พัฒนาที่นี่: http://www.scientia.com/uk/


3

ฉันทำงานกับเครื่องมือตั้งเวลาที่ใช้กันอย่างแพร่หลายซึ่งทำเช่นนี้ ใช่มันเป็น NP-Complete; แนวทางที่ดีที่สุดพยายามหาวิธีแก้ปัญหาที่เหมาะสมโดยประมาณ และแน่นอนว่ามีหลายวิธีที่จะบอกว่าวิธีใดเป็นวิธีแก้ปัญหาที่ "ดีที่สุด" - สิ่งที่สำคัญกว่าคือครูของคุณต้องพอใจกับตารางเวลาของพวกเขาหรือให้นักเรียนเข้าชั้นเรียนทั้งหมด

คำถามที่สำคัญที่สุดที่คุณต้องแก้ไขตั้งแต่เนิ่นๆคืออะไรทำให้ระบบนี้ดีกว่าอีกวิธีหนึ่ง ? นั่นคือถ้าฉันมีตารางเรียนกับ Mrs Jones ที่สอนคณิตศาสตร์ตอน 8 และ Mr Smith สอน Math ตอน 9 จะดีกว่าหรือแย่กว่ากันโดยทั้งสองคนสอน Math ตอน 10 มันดีกว่าหรือแย่กว่าหนึ่งกับ Mrs Jones สอนตอน 8 และ Mr Jones สอนที่ 2? ทำไม?

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

มักใช้รหัสผ่านการเพิ่มประสิทธิภาพการค้นหาในพื้นที่เพื่อ "ขัด" คำตอบสุดท้ายเพื่อผลลัพธ์ที่ดีขึ้น

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


2

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

โชคดี !


2

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


2

คุณสามารถจัดการกับอัลกอริทึมทางพันธุกรรมได้ใช่ แต่คุณไม่ควร :) อาจช้าเกินไปและการปรับพารามิเตอร์อาจใช้เวลามากเกินไปเป็นต้น

มีแนวทางอื่นที่ประสบความสำเร็จ ทั้งหมดดำเนินการในโครงการโอเพ่นซอร์ส:

  • แนวทางตามข้อ จำกัด
    • ดำเนินการในUniTime (ไม่ใช่สำหรับโรงเรียนจริงๆ)
    • คุณยังสามารถไปเพิ่มเติมและใช้การเขียนโปรแกรมจำนวนเต็ม ประสบความสำเร็จที่มหาวิทยาลัย Udineและที่ University Bayreuth (ฉันมีส่วนร่วมที่นั่น) โดยใช้ซอฟต์แวร์เชิงพาณิชย์ (ILOG CPLEX)
    • แนวทางตามกฎด้วยฮิวริสติก - ดูผู้วางแผน Drools
  • การวิเคราะห์พฤติกรรมที่แตกต่างกัน - FETและของฉันเอง

ดูรายการซอฟต์แวร์ที่กำหนดเวลาได้ที่นี่


0

ฉันคิดว่าคุณควรใช้อัลกอริทึมทางพันธุกรรมเพราะ:

  • เหมาะที่สุดสำหรับกรณีที่มีปัญหาใหญ่
  • ช่วยลดความซับซ้อนของเวลาในราคาของคำตอบที่ไม่ถูกต้อง (ไม่ใช่ที่สุดยอดที่สุด)
  • คุณสามารถระบุข้อ จำกัด และความชอบได้อย่างง่ายดายโดยการปรับการลงโทษฟิตเนสสำหรับสิ่งที่ไม่ตรงตาม
  • คุณสามารถระบุการ จำกัด เวลาสำหรับการทำงานของโปรแกรม
  • คุณภาพของการแก้ปัญหาขึ้นอยู่กับระยะเวลาที่คุณตั้งใจจะใช้แก้โปรแกรม ..

    นิยามอัลกอริทึมทางพันธุกรรม

    การสอนอัลกอริทึมทางพันธุกรรม

    โครงการจัดตารางเรียนด้วย GA

ลองดูที่: คำถามที่คล้ายกันและอีกคำถามหนึ่ง


0

ฉันไม่รู้ว่าจะมีใครเห็นด้วยกับรหัสนี้ แต่ฉันพัฒนารหัสนี้ด้วยความช่วยเหลือของอัลกอริทึมของฉันเองและกำลังทำงานให้ฉันใน Ruby หวังว่ามันจะช่วยพวกเขาที่กำลังค้นหารหัสต่อไปนี้คือ periodflag, dayflag subjectflag และ teacherflag คือแฮชที่มี id ที่สอดคล้องกันและค่าแฟล็กซึ่งเป็นบูลีน มีปัญหาใด ๆ ติดต่อฉัน ....... (-_-)

periodflag แต่ละ do | k2, v2 |

            if(TimetableDefinition.find(k2).period.to_i != 0)
                subjectflag.each do |k3,v3|
                    if (v3 == 0)
                        if(getflag_period(periodflag,k2))
                            @teachers=EmployeesSubject.where(subject_name: @subjects.find(k3).name, division_id: division.id).pluck(:employee_id)
                            @teacherlists=Employee.find(@teachers)
                            teacherflag=Hash[teacher_flag(@teacherlists,teacherflag,flag).to_a.shuffle] 
                            teacherflag.each do |k4,v4|
                                if(v4 == 0)
                                    if(getflag_subject(subjectflag,k3))
                                        subjectperiod=TimetableAssign.where("timetable_definition_id = ? AND subject_id = ?",k2,k3)
                                        if subjectperiod.blank?
                                            issubjectpresent=TimetableAssign.where("section_id = ? AND subject_id = ?",section.id,k3)
                                            if issubjectpresent.blank?
                                                isteacherpresent=TimetableAssign.where("section_id = ? AND employee_id = ?",section.id,k4)
                                                if isteacherpresent.blank?
                                                    @finaltt=TimetableAssign.new
                                                    @finaltt.timetable_struct_id=@timetable_struct.id
                                                    @finaltt.employee_id=k4
                                                    @finaltt.section_id=section.id
                                                    @finaltt.standard_id=standard.id
                                                    @finaltt.division_id=division.id
                                                    @finaltt.subject_id=k3
                                                    @finaltt.timetable_definition_id=k2
                                                    @finaltt.timetable_day_id=k1
                                                    set_school_id(@finaltt,current_user)
                                                    if(@finaltt.save)

                                                        setflag_sub(subjectflag,k3,1)
                                                        setflag_period(periodflag,k2,1)
                                                        setflag_teacher(teacherflag,k4,1)
                                                    end
                                                end
                                            else
                                                @subjectdetail=TimetableAssign.find_by_section_id_and_subject_id(@section.id,k3)
                                                @finaltt=TimetableAssign.new
                                                @finaltt.timetable_struct_id=@subjectdetail.timetable_struct_id
                                                @finaltt.employee_id=@subjectdetail.employee_id
                                                @finaltt.section_id=section.id
                                                @finaltt.standard_id=standard.id
                                                @finaltt.division_id=division.id
                                                @finaltt.subject_id=@subjectdetail.subject_id
                                                @finaltt.timetable_definition_id=k2
                                                @finaltt.timetable_day_id=k1
                                                set_school_id(@finaltt,current_user)
                                                if(@finaltt.save)

                                                    setflag_sub(subjectflag,k3,1)
                                                    setflag_period(periodflag,k2,1)
                                                    setflag_teacher(teacherflag,k4,1)
                                                end
                                            end
                                        end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.