อัลกอริทึมปฏิทิน / การวางแผน


24

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

สิ่งที่ฉันทำงานด้วย:

  • ฉันมีหมอ
  • แพทย์แต่ละคนจะต้องทำงาน 5 วัน / สัปดาห์
  • แพทย์แต่ละคนต้องทำงาน 1 คืน / สัปดาห์
  • แพทย์แต่ละคนจะต้องทำงานในจำนวนคืนที่เท่ากันเมื่อเทียบกับแพทย์คนอื่น ๆ (หรือใกล้เคียงที่สุด)
  • แพทย์แต่ละคนจะต้องทำงานในคืนวันพฤหัสบดีและคืนวันอาทิตย์ในจำนวนเท่ากันเมื่อเทียบกับหมอคนอื่น ๆ
  • แพทย์บางคนไม่สามารถทำงานได้ในบางวัน / คืน (ป้อนโดยผู้ใช้)
  • แพทย์บางคนต้องการทำงานบางวัน / คืน (ป้อนโดยผู้ใช้)
  • แพทย์บางคนต้องการที่จะไม่ทำงานบางวัน / คืน (ป้อนโดยผู้ใช้)

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

ปัญหาของฉัน:

ฉันไม่แน่ใจว่าจะสร้างการวางแผนที่แท้จริงได้อย่างไรฉันได้อ่านเกี่ยวกับ Neural Networks, Algorithms ทางพันธุกรรมและอื่น ๆ และพวกเขาทั้งหมดดูเหมือนจะเป็นทางออกที่ถูกต้อง แต่ก็ไม่จริง

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

แต่แล้วอีกครั้ง GA ของจริง ๆ ดูเหมือนว่าพวกเขาทำขึ้นสำหรับสิ่งนี้ดังนั้นฉันอาจไม่เข้าใจอย่างถูกต้องหรือไม่

อย่างไรก็ตามเนื่องจากฉันไม่เคยใช้ GAs (หรือเครือข่ายประสาทหรืออะไรก็ได้) ฉันต้องการให้แน่ใจว่าฉันจะใช้วิธีการที่ถูกต้องก่อนที่จะเข้าสู่ช่วงการเรียนรู้แบบนั้น

คำถามของฉัน :

คุณคิดว่าเป็นวิธีการที่ดี / อัลกอริทึม / เทคนิคสำหรับปัญหาเช่นเดียวกับฉัน? ก๊าซ? โครงข่ายประสาทเทียม มีอะไรที่แตกต่างอย่างสิ้นเชิง?

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


22
อาจคุ้มค่าที่จะอ่านวรรณกรรมรอบ ๆ ปัญหาพยาบาลที่มีปัญหาen.wikipedia.org/wiki/Nurse_scheduling_problem
Renaud M.

ช่างเป็นคำที่สะดวก! เฮ้ขอบคุณสำหรับลิงค์ของคุณ;)
กิลแซน

8
ฉันไม่ใช่ผู้เชี่ยวชาญในเรื่องนี้ แต่ถ้าสิ่งที่คุณกำลังมองหาคือวิธีการที่จะช่วยให้คุณประหยัดเวลาในการพัฒนามันอาจคุ้มค่าที่จะลองทำแบบจำลองปัญหาเป็น Mixed Integer Programming Problem ( en.wikipedia org / wiki / Linear_programming # Integer_unknowns ) จากนั้นป้อนข้อมูลลงในตัวแก้ปัญหา MIP หรือเป็นปัญหาการเขียนโปรแกรมข้อ จำกัด แล้วป้อนไปยังตัวแก้ CP เช่น OR-tools ( developers.google.com/optimization ) วิธีที่คุณต้องทำคือแสดงปัญหาของคุณ
Renaud M.

3
การเขียนโปรแกรมเชิงเส้นรับประกันว่าจะได้รับทางออกที่ดีที่สุด !
recursion.ninja

2
@RenaudM น่าเสียดายที่โปรแกรมเมอร์มืออาชีพสองสามคนเข้าใจสาขาคณิตศาสตร์ที่มีประโยชน์อย่างน่าอัศจรรย์นี้ เมื่อใดก็ตามที่มีคนแนะนำอัลกอริธึมการจำลองหรือพันธุกรรมที่อยู่ด้านนอกของ AI การตอบสนองของฉันคือ: น่าจะเป็นแบบจำลองที่ดีขึ้นในการเพิ่มประสิทธิภาพโปรแกรมเชิงเส้น
recursion.ninja

คำตอบ:


14

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

นี่เป็นความคิดที่สำคัญ: กำหนดสองตารางเวลาเราต้องการวิธีในการตัดสินใจว่าตาราง A หรือกำหนดการ B นั้น“ ดีกว่า” คุณได้แสดงเกณฑ์ต่างๆไว้แล้ว แต่ยังไม่ชัดเจนว่าเกี่ยวข้องกันอย่างไร การไม่สามารถปฏิบัติตามเกณฑ์หนึ่งข้อล้มเหลวในการแก้ปัญหาทั้งหมดหรือไม่ หรือข้อ จำกัด ที่ล้มเหลวเพียงบางส่วนทำให้มันเป็นทางออกที่แย่กว่าคนอื่น ๆ ?

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

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


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

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

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

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


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

5
@ คนที่กำลังสร้างตารางเวลาอยู่แล้วอาจใช้อัลกอริทึมแบบไม่เป็นทางการอยู่แล้ว คุณสามารถพูดคุยกับพวกเขาและพยายามทำความเข้าใจกระบวนการตัดสินใจของพวกเขาจากนั้นทำระเบียบและดำเนินการนั้น นี่จะเป็นวิธีที่ง่ายกว่าการตั้งค่าและฝึกอบรมเครือข่ายประสาท
amon

นั่นคือขั้นตอนแรกของเรา: p เรามีการประชุมกับพวกเขาแล้ว! ขอบคุณสำหรับทุกความช่วยเหลือของคุณ :)
จิลแซนด์

3
สำหรับกรณีการใช้งานนี้อัลกอริทึมพันธุศาสตร์นั้นด้อยกว่า Tabu Search และจำลองการอบอ่อนอย่างต่อเนื่องซึ่งได้รับการพิสูจน์จากการแข่งขันทางการวิจัยระหว่างประเทศ (แต่แน่นอนพวกเขายังดีกว่า algo โลภ)
Geoffrey De Smet

12

คุณสามารถใช้การอบจำลอง

ฉันทำอะไรแบบนั้นก่อนที่ฉันจะลงจอดงานแรกของฉัน - ดูhttps://vimeo.com/20610875 (สาธิตเริ่มต้นที่ 2:50 อัลกอริทึมอธิบายจาก 6:15)

การจำลองการหลอมเป็นอัลกอริธึมทางพันธุกรรมชนิดหนึ่งและบางทีมันอาจไม่เหมาะสมในทางทฤษฎี (ตามที่ @ มอนด์รักษาไว้ในคำตอบของเขา ) แต่มันใช้งานได้ดีในทางปฏิบัติ

มีซอร์สโค้ดพร้อมใช้งาน (C #) แต่ในขณะที่ใช้งานได้มันแย่มากฉันกลัวมันไม่กี่ปีที่ผ่านมาและเป็น autodidact ฉันไม่รู้เกี่ยวกับการบำรุงรักษา มันให้ผลลัพธ์ที่ดีมาก ๆ

มันทำงานอย่างไรโดยย่อ:

  • สร้าง 1 เป็นไปได้ (อาจไม่ดีมาก แต่เป็นไปได้ทางร่างกาย) ตารางเวลาเป็นจุดเริ่มต้น ขั้นตอนวิธีเชิงพันธุกรรมนั้นไม่จำเป็นในตอนนี้คุณเพียงแค่เพิ่มวิธีการแก้ปัญหาแรกที่คุณพบ ผมใช้ย้อนรอย ความซับซ้อนในการคำนวณสามารถเอาชนะได้ด้วยการแก้ไข rota ในแต่ละวันแยกกัน หากไม่มีวิธีแก้ปัญหาเลย (ตาม แต่กรณี) อาจเป็นไปได้ที่คุณจะตรวจจับ

  • สร้างกลุ่มของโซลูชัน - กล่าวคือ 100 สำเนาของโซลูชันระดับเริ่มต้นสำหรับการเริ่มต้น

  • เปลี่ยนวิธีการแก้ปัญหาแบบสุ่ม: ให้แพทย์สลับกะระหว่างคนอื่น ๆ นำหมอแบบสุ่มออกจากกะและวางคนที่มีให้แบบสุ่มเป็นต้น

  • ประเมินแต่ละโซลูชันด้วยฟังก์ชั่นการออกกำลังกายที่กำหนดว่าดีแค่ไหน ผู้ชายคนหนึ่งทำงานมากกว่าคืนอื่นได้หรือไม่ ลบจุดโทษ มีคนต้องการทำวันจันทร์ แต่พวกเขาไม่ทำ ลบจุดโทษอีกครั้ง

  • ใช้คำพูดที่ดีที่สุด 20 คำตอบและคัดลอกแต่ละรายการ 5 ครั้งเขียนทับส่วนที่เหลือ 80 รายการด้วยวิธีนี้จึงนำไปสู่รุ่นต่อไป เอาชีวิตรอดจาก fittest

  • ล้างและทำซ้ำ

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

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


4
ฉันใช้ OptaPlanner (nee Drools Planner) กับ Simulated Annealing สำหรับตารางเรียนของวิทยาลัย ประกาศนางแบบ - Shift มีเวลาและหมอ เขียนกฎที่เปิดเผยสำหรับฟังก์ชั่นการออกกำลังกาย - ข้อ จำกัด อย่างหนัก (แพทย์ไม่สามารถใช้การเลื่อนที่ทับซ้อนกัน) และการลงโทษได้ เขียนการแลกเปลี่ยน (นั่นคือประเด็น!) สลับกะ OptaPlanner จะสร้างสถานะเริ่มต้นโดยการสุ่ม (อาจเป็นไปไม่ได้) คำนวณฟังก์ชันการออกกำลังกายจากกฎและแม้แต่ดำเนินการสลับตามขั้นตอนวิธีการปรับให้เหมาะสม คุณสามารถเลือกและปรับพารามิเตอร์เช่นกำหนดการอบอ่อน
Jesvin Jose

6

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

คุณสามารถค้นหาJob Shop SchedulingและOpen Shop SchedulingหรือFlow Shop Scheduling ซึ่งเป็นจุดเริ่มต้นที่น่าสนใจ

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

  • ความแตกต่างของคืนที่ได้รับมอบหมายระหว่างแพทย์ที่มีงานยุ่งมากที่สุดกับงานที่ยุ่งน้อยคือการลงโทษในส่วนของค่าใช้จ่าย
  • ทุกครั้งที่แพทย์ทำงานมากกว่า 5 วันต่อสัปดาห์หรือ 1 คืนต่อสัปดาห์คุณจะต้องเสียค่าปรับ
  • ข้อ จำกัด แต่ละข้อของคุณ ฯลฯ ...

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

เมื่อพูดถึงสิ่งเหล่านี้ทุกครั้งที่ฉันใช้อัลกอริทึมทางพันธุกรรมที่อาศัยการผ่าเหล่ามากกว่าที่ผ่านมาฉันสามารถพัฒนาการจำลองการอบอ่อนที่จะทำงานได้ดีขึ้นด้วยการใช้งานที่ง่ายขึ้น ราคา / ความเหมาะสมและฟังก์ชั่นการกลายพันธุ์สำหรับอัลกอริทึมทางพันธุกรรมอาจจะคล้ายกับที่ใช้ในการจำลองการอบ ฉันจะเริ่มต้นที่นั่นดู @Konrad Morawski คำตอบ

การค้นหาของ Google ค้นหาผลลัพธ์ที่ดีสำหรับ Job Shop และ GA

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