ต้องการความช่วยเหลือในการระบุอัลกอริทึมการตั้งเวลาลีก


9

ฉันกำลังพยายามสร้างตารางเวลากีฬาลีก ฉันมีปัญหาในการระบุอัลกอริทึมเพื่อช่วยฉันเติมในแต่ละช่องอย่างมีประสิทธิภาพ

ข้อมูลตัวอย่างเพื่อสร้างตารางจะเป็น:

  1. 10 ทีม
  2. แต่ละทีมเล่นกัน 1 ครั้ง (ต้องมีเกมทั้งหมด 45 เกม)
  3. แต่ละทีมเล่นไม่เกิน 1 ครั้งต่อวัน
  4. ในการทดสอบของฉันฉันใช้ 9 วันกับ 5 ช่องต่อวัน

ตารางคำสั่งผสม (ประกอบด้วย 45 คอมโบ)

ID
Team1ID
Team2ID
บิตได้รับการแต่งตั้ง

ตารางเวลา (ประกอบด้วย 45 ช่วงเวลา)

กำหนดเวลา ID
บ้าน
ทีมออก
ห่างทีม
เกมวันเกมเวลา

ตอนนี้ขั้นตอนที่มีอยู่ของฉันเติมประมาณ 90% ของช่องที่เหลือ 10% ของช่องว่างของฉันให้ว่างเปล่ากับความขัดแย้งของการตั้งเวลาตามกฎข้างต้น

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

ฉันวนซ้ำซ้ำแล้วซ้ำอีกและทุกครั้งที่รายการทีมที่ฉันว่างมีขนาดเล็กลงเรื่อย ๆ และผลลัพธ์ของฉันก็เล็กลงเช่นกัน

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

สิ่งเดียวที่ฉันยังไม่ได้ลองคือ "รีเซ็ต" วันที่มีข้อขัดแย้งและลองอีกครั้งเพื่อดูว่าฉันได้ตำแหน่งที่ดีขึ้นหรือไม่

ไม่มีใครมีข้อเสนอแนะใด ๆ ?


5
กำหนดการทัวร์นาเมนต์ round-robin
kevin cline

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

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

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

คำตอบ:


5

นี่เป็นอัลกอริทึมที่ฉันคิดค้นเอง ฉันไม่รู้ว่ามันมีอยู่แล้วหรือจริง ๆ แล้วเป็นการนำไปใช้ของโรบินกลม:

1 4    1 5   1 6   1 3   1 2
2 5    4 6   5 3   6 2   3 4
3 6    2 3   4 2   5 4   6 5

โดยทั่วไปคุณเริ่มต้นด้วย

รูปหมุน

และให้ 1 อยู่ในตำแหน่งเดิมเสมอและหมุนที่เหลือ

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


2
คุณจะจัดการยอดคงเหลือบ้าน vs ยอดคงเหลือได้อย่างไร
Eric Cope

วิธีนี้ใช้ไม่ได้ผล - ในอัลกอริธึมการหมุนอย่างง่ายนี้ทีมการหมุนที่แยกออกจากกัน 2 สล็อต (2/4, 3/5) จะไม่เล่นเลย
mdryden

@ mdryden ใช้งานได้ ตรวจสอบได้ดีขึ้นและโปรดลบความคิดเห็นของคุณ
Pieter B

@PieterB ฉันคิดว่ามันจะใช้ได้ แต่จริง ๆ แล้วมันใช้ไม่ได้ถ้ามีจำนวนทีมที่คี่เพราะทีมที่อยู่ติดกัน (เช่น 4 และ 5) จะไม่เล่นกันเลย คุณสามารถเห็นได้อย่างง่ายดายในตอนท้ายด้วย 1 และที่ปลายอีกด้านหนึ่งเนื่องจากคุณมีทีมที่ห้อยต่องแต่ง (มีบาย) ที่นี่มีการตอบสนองที่ดีที่เกี่ยวข้องกับเลขคี่: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder

@ragingasiancoder หากมีจำนวนทีมแปลก ๆ เพิ่มทีมหลอกตา คำตอบที่คุณเชื่อมโยงนั้นจะอธิบายโซลูชันเดียวกับที่ฉันนำเสนอ
Pieter B

1

ฉันคิดว่าคุณกำลังทำมันย้อนหลัง อย่าเริ่มต้นด้วยตารางกำหนดเวลาเริ่มต้นด้วยตาราง / อาร์เรย์ / สิ่งใด ๆ ของชุดเกมทั้งหมด (เกม 45 เกม) จากตรงนั้นเป็นกระบวนการง่ายๆในการกำหนดเกมให้กับวันโดยอิงจากทีมที่เล่นวันละครั้งเท่านั้น และเนื่องจากการจับคู่เกิดขึ้นเพียงครั้งเดียว (ทีม A เล่นทีม B เพียงครั้งเดียวเท่านั้น) การตั้งเวลาจึงเป็นเรื่องง่ายเพราะคุณเพียงแค่ต้องทำให้แน่ใจว่าการจับคู่นั้นไม่ได้เกิดขึ้นแล้ว


1

ฉันสร้างตารางรอบเดียว 10 นัดของโรบินด้านล่าง ฉันใช้เวลาประมาณ 3 นาที

ข้อมูลกำหนดการ:

10 ทีม - 1 รอบโรบิน (แสดงเฉพาะ 6 สัปดาห์แรก)
วันที่เริ่มต้นฤดูกาล 1/6/15 - วันที่สิ้นสุด 3/5/15
2 เกมในแต่ละวันอังคาร 3 เกมในแต่ละวันพฤหัสบดี 5 เกมในแต่ละสัปดาห์ไม่มีวันที่ข้าม

  • ทุกทีมมีการแจกจ่ายให้เล่นในช่วงเวลา 5 เท่า ๆ กัน
  • ทั้งหมดเล่น 9 เกม
  • ทั้งหมดเล่นกันอีกครั้ง
  • ทั้งหมดจะถูกกระจายอย่างเท่าเทียมกันเป็นบ้าน & ผู้เข้าชม (ทั้ง 5/4 หรือ 4/5) หมายเหตุ: ในตอนท้ายของรอบ robin 2 ทุกทีมเล่น 18 เกม (9 เป็นบ้าน & 9 เป็นผู้เยี่ยมชม) และทีมทั้งหมดมี 2 Byes
  • ทั้งหมดจะถูกแจกจ่ายให้เล่นอย่างสม่ำเสมอใน 5 ช่วงเวลาในแต่ละสัปดาห์

เราใช้คอมพิวเตอร์เฟรมหลักที่ล้าสมัยของ Honeywell และใช้เวลาน้อยกว่า 3 ปีในการรวมสิ่งนี้เข้าด้วยกัน เมื่อซอฟต์แวร์การตั้งเวลาของเราถูกดีบั๊กมันต้องใช้คอมพิวเตอร์เฟรมหลักหลายชั่วโมงในการค้นหาพีชคณิตและชุดค่าผสมนับล้านเพื่อคำนวณและสร้างรูปแบบที่สมดุลสำหรับ 4 ถึง 22 ทีมที่เรากำลังมองหา

10 Team Division Schedule   DATE 12/20/14

DATE   DAY TIME    LOCATION  GM  HOME vs VISITOR

Jan  6 Tue 6:00pm  Field #1   1  # 1 vs #10 
Jan  6 Tue 6:00pm  Field #2   1  # 2 vs # 9 
Jan  8 Thu 6:30pm  Field #3   1  # 3 vs # 8 
Jan  8 Thu 6:30pm  Field #4   1  # 4 vs # 7 
Jan  8 Thu 6:30pm  Field #5   1  # 5 vs # 6

Jan 13 Tue 6:00pm  Field #1   2  # 6 vs # 3 
Jan 13 Tue 6:00pm  Field #2   2  #10 vs # 8 
Jan 15 Thu 6:30pm  Field #3   2  # 7 vs # 2 
Jan 15 Thu 6:30pm  Field #4   2  # 9 vs # 1 
Jan 15 Thu 6:30pm  Field #5   2  # 4 vs # 5

Jan 20 Tue 6:00pm  Field #1   3  # 7 vs # 9 
Jan 20 Tue 6:00pm  Field #2   3  # 5 vs # 2 
Jan 22 Thu 6:30pm  Field #3   3  # 6 vs #10 
Jan 22 Thu 6:30pm  Field #4   3  # 3 vs # 4 
Jan 22 Thu 6:30pm  Field #5   3  # 8 vs # 1

Jan 27 Tue 6:00pm  Field #1   4  # 9 vs # 5 
Jan 27 Tue 6:00pm  Field #2   4  # 1 vs # 7 
Jan 29 Thu 6:30pm  Field #3   4  # 2 vs # 3 
Jan 29 Thu 6:30pm  Field #4   4  # 8 vs # 6 
Jan 29 Thu 6:30pm  Field #5   4  #10 vs # 4

Feb  3 Tue 6:00pm  Field #1   5  # 4 vs # 8 
Feb  3 Tue 6:00pm  Field #2   5  # 7 vs # 5 
Feb  5 Thu 6:30pm  Field #3   5  # 1 vs # 6 
Feb  5 Thu 6:30pm  Field #4   5  #10 vs # 2 
Feb  5 Thu 6:30pm  Field #5   5  # 3 vs # 9

Feb 10 Tue 6:00pm  Field #1   6  # 3 vs # 7 
Feb 10 Tue 6:00pm  Field #2   6  # 6 vs # 4 
Feb 12 Thu 6:30pm  Field #3   6  # 5 vs # 1 
Feb 12 Thu 6:30pm  Field #4   6  # 9 vs #10 
Feb 12 Thu 6:30pm  Field #5   6  # 8 vs # 2 

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

ฉันหวังว่าสิ่งนี้จะช่วยให้คุณและคนอื่น ๆ เข้าใจว่าเราใช้เวลา 3 ปีในการค้นหา

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