Butuh bantuan mengidentifikasi algoritma penjadwalan liga

9

Saya mencoba membuat penjadwal liga olahraga. Saya mengalami kesulitan mengidentifikasi algoritma untuk membantu saya secara efisien mengisi setiap slot.

Contoh data untuk membangun jadwal adalah:

  1. 10 tim
  2. Setiap tim bermain satu sama lain 1 kali (diperlukan total 45 pertandingan)
  3. Setiap tim bermain tidak lebih dari 1 kali per hari
  4. Dalam pengujian saya, saya menggunakan 9 hari dengan 5 slot per hari.

Combo Table (mengandung 45 combo)

ID
Team1ID
Team2ID
bitDitugaskan

Jadwal Tabel (berisi 45 slot waktu)

scheduleID
homeTeamID
awayTeamID
GameDate
GameTime

Saat ini prosedur saya yang ada mengisi sekitar 90% dari slot sehingga 10% dari slot saya kosong untuk konflik penjadwalan berdasarkan aturan di atas.

Saya mengulangi tabel jadwal saya dalam urutan tanggal / waktu naik.
Slot pertama saya mungkin Sabtu jam 8 pagi.
Saya menanyakan daftar tim yang belum dijadwalkan. Saya kemudian membuat berbagai kemungkinan kombinasi tim-tim itu. Saya kemudian menggunakan array itu untuk menarik 1 catatan acak dari tabel kombinasi saya dari kombinasi yang belum dijadwalkan dan saya menempatkan tim-tim itu pada jadwal. Saya kemudian mengatur kombinasi itu seperti yang digunakan.

Saya mengulangi loop berulang dan setiap kali daftar tim yang tersedia saya semakin kecil dan array saya sebagai hasilnya juga lebih kecil.

Saya menemukan bahwa beberapa hari berjalan dengan baik, dan di hari lain 2 tim terakhir saya yang tersisa sudah bermain di minggu sebelumnya sehingga mereka tidak ditambahkan ke jadwal lagi.

Satu-satunya hal yang saya belum coba adalah "mengatur ulang" hari konflik dan mencobanya lagi untuk melihat apakah saya mendapatkan penempatan yang lebih baik.

Adakah yang punya saran?

steve
sumber
5
penjadwalan turnamen round-robin
kevin cline
kevin terima kasih. kanan Anda. Saya tampaknya sekarang array saya mulai di tempat yang sama setiap kali dan tidak ada rotasi sehingga tidak ada aliran yang teratur untuk memasangkan tim.
steve
1
Saya menggunakan pendekatan yang sepenuhnya acak. Pilih secara acak slot dan dua tim. Jika aturan terpenuhi maka jadwalkan permainan. Jika tidak dibuang dan coba lagi. Saya menetapkan batas pada upaya total dan jika batas tercapai, buang seluruh jadwal dan mulai lagi dari awal. Ini sebenarnya bekerja cukup baik dalam praktik.
Cerad
Saya akhirnya pergi dan mengikuti pendekatan round robin. Saya 95% selesai menulis skrip untuk terhubung ke DB, tetapi dalam pengujian tampaknya berjalan mulus dan seimbang. Saya memperlakukan hari-hari saya seperti "putaran" dan mereka tetap bagus dan seimbang. Saya dapat memainkan putaran saya dalam urutan apa pun dan menempatkan permainan untuk setiap putaran dalam urutan apa pun, tetapi memindahkan permainan dari satu putaran ke putaran lainnya pada akhirnya akan melanggar aturan.
steve

Jawaban:

5

Inilah algoritma yang saya temukan sendiri. Saya tidak tahu apakah itu sudah ada atau sebenarnya implementasi round robin:

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

pada dasarnya Anda mulai dengan

foto rotasi

dan selalu menjaga 1 di posisi yang sama dan memutar sisanya.

Dengan begitu Anda akan selalu mendapat jadwal pertandingan yang unik. Ini sangat mudah diimplementasikan dan diskalakan dengan sejumlah lawan, bahkan atau tidak merata. Jika Anda memiliki jumlah lawan yang tidak merata, jangan menempatkan tim di posisi 1 dan mereka memiliki putaran bebas.

Pieter B
sumber
2
bagaimana Anda mengelola saldo home vs away?
Eric Cope
Ini tidak benar-benar bekerja - dalam algoritma rotasi sederhana ini, tim rotasi yang terpisah 2 slot (2/4, 3/5) tidak akan pernah bermain.
mdryden
@mdryden itu berhasil. Periksa dengan lebih baik dan harap hapus komentar Anda.
Pieter B
@PieterB Saya berpikir bahwa itu akan berhasil, tetapi sebenarnya tidak berfungsi jika ada jumlah tim yang ganjil, karena yang ada di sebelah satu sama lain (seperti 4 dan 5) tidak akan pernah saling bermain. Anda dapat melihatnya dengan mudah di akhir dengan angka 1, dan juga di ujung lainnya karena Anda memiliki tim yang menggantung (dengan selamat tinggal) Berikut adalah respons yang baik yang juga berkaitan dengan angka ganjil: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder
@ragingasiancoder jika ada jumlah ganjil tim, tambahkan tim dummy. Jawaban yang Anda tautkan menggambarkan solusi yang sama persis seperti yang saya sajikan.
Pieter B
1

Saya pikir Anda melakukannya mundur. Jangan mulai dengan tabel jadwal, mulai dengan tabel / array / apa pun dari semua kombinasi game (45 game). Dari sana, ini adalah proses sederhana untuk menetapkan game ke sehari, berdasarkan pada tim yang hanya bermain sekali sehari. Dan karena pertarungan hanya terjadi sekali (Tim A hanya memainkan Tim B sekali) penjadwalannya mudah karena Anda hanya perlu memastikan bahwa pertarungan belum terjadi (entri-entri itu "unik" seperti itu).

Coder Tidak Dikenal
sumber
1

Saya membuat jadwal 10 tim babak robin tunggal di bawah ini. Butuh waktu sekitar 3 menit.

Info jadwal:

10 tim - 1 round robin (hanya 6 minggu pertama yang ditampilkan)
Tanggal mulai musim 1/6/15 - tanggal akhir 3/5/15
2 pertandingan setiap Selasa, 3 pertandingan setiap Kamis, 5 pertandingan setiap minggu, tanpa tanggal lewati

  • Semua tim didistribusikan untuk bermain dalam 5 slot waktu yang sama.
  • Semua mainkan 9 game.
  • Semua saling bermain satu sama lain.
  • Semua didistribusikan secara merata sebagai rumah & pengunjung (baik 5/4, atau 4/5). Catatan: pada akhir babak 2 semua tim bermain 18 pertandingan (9 sebagai tuan rumah & 9 sebagai pengunjung) dan semua tim memiliki 2 Byes.
  • Semua didistribusikan untuk bermain secara merata dalam 5 slot waktu setiap minggu.

Kami menggunakan komputer kerangka utama Honeywell yang sudah ketinggalan zaman dan baru berusia di bawah 3 tahun untuk menggabungkan semua ini. Setelah perangkat lunak penjadwalan kami di-debug, dibutuhkan komputer kerangka utama berjam-jam mencari jutaan permutasi & kombinasi untuk menghitung dan membuat pola seimbang untuk 4 hingga 22 tim yang kami cari.

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 

Tidak ada algoritma yang menyelesaikan keseluruhan masalah penjadwalan yang terkait dengan ratusan atau ribuan jenis liga, olahraga, dan situasi potensial. Apa yang kami lakukan untuk menyelesaikan masalah ini adalah mengambil pendekatan berbeda untuk menghitung jadwal. Itu dimulai dengan matematika yang sangat kompleks untuk menentukan pasangan tim round robin yang tepat (pertandingan), tetapi itu baru permulaan. Bagian lain diperlukan untuk membuat jadwal seimbang yang bermanfaat yang dapat diterbitkan dan didistribusikan. Pemain, pelatih, orang tua, dll., Semua harus tahu tidak hanya siapa yang mereka mainkan ; tetapi di mana mereka bermain ; jam berapa mereka bermain ; jika mereka adalah rumah atau pengunjung ; dan untuk banyak liga, sejumlah permainan .

Saya harap ini membantu Anda dan orang lain memahami apa yang perlu kami 3 tahun untuk mencari tahu.

Komunitas
sumber