Lig planlama algoritmasını tanımlamak için yardıma ihtiyacınız var


9

Bir spor ligi zamanlayıcısı oluşturmaya çalışıyorum. Her yuvayı verimli bir şekilde doldurmama yardımcı olacak bir algoritma tanımlamakta sorun yaşıyorum.

Programı oluşturmak için örnek veriler:

  1. 10 takım
  2. Her takım birbirlerini 1 kez oynar (toplam 45 oyun gereklidir)
  3. Her takım günde en fazla 1 kez oynar
  4. Testlerimde günde 5 slot ile 9 gün kullanıyorum.

Kombo Tablo (45 kombinasyon içerir)

ID
Team1ID
Team2ID
bit Atanmış

Zamanlama Tablosu (45 zaman aralığı içerir)

scheduleID
homeTeamID
awayTeamID
GameDate
Gametime

Şu anda mevcut prosedürlerim, alanların yaklaşık% 90'ını dolduruyor, yuvalarımın% 10'unu yukarıdaki kurallara göre bir zamanlama çakışmasına boş bırakıyor.

Zaman çizelgesi tablomda artan tarih / saat sırasına göre döngü yapıyorum.
İlk slotum Cumartesi sabah 8'de olabilir.
Henüz planlanmamış takımların listesini sorgularım. Daha sonra bu takımların bir dizi olası kombinasyonunu yapıyorum. Daha sonra bu diziyi, henüz planlanmamış kombinasyonlardan kombinasyon tablomdan 1 rastgele kayıt almak için kullanıyorum ve bu takımları programa yerleştiriyorum. Sonra bu kombinasyonu kullandım.

Döngüyü tekrar tekrar tekrar ediyorum ve mevcut takım listem her küçüldüğünde ve sonuç olarak dizim de daha küçük.

Bazı günlerin iyi gittiğini ve diğer günlerde son 2 kalan takımımın bir önceki hafta oynadıklarını görüyorum, bu yüzden programa tekrar eklenmezler.

Henüz denemediğim tek şey, çakışma günlerini "sıfırlamak" ve daha iyi yerleşimler alıp almadığımı görmek için tekrar denemek.

Kimsenin önerisi var mı?


5
round-robin turnuva çizelgesi
kevin cline

kevin teşekkürler. haklısın. Görünüşe göre dizim her seferinde aynı noktada başlıyor ve takımları eşleştirmek için düzenli bir akış yok.
steve

1
Tamamen rastgele bir yaklaşım kullanıyorum. Rastgele bir slot ve iki takım seçin. Kurallar yerine getirilirse oyunu planlayın. Değilse atın ve tekrar deneyin. Toplam denemelerde bir sınır belirledim ve sınıra ulaşılırsa, tüm zamanlamayı atın ve baştan başlayın. Aslında pratikte oldukça iyi çalışıyor.
Cerad

Sonunda yuvarlak robin yaklaşımını izledim. Ben% 95 DB bağlamak için komut dosyası yazma bitti, ama test düzgün ve dengeli çalışıyor gibi görünüyor. Günlerime "mermi" gibi davranıyorum ve güzel ve dengeli kalıyorlar. Turlarımı herhangi bir sırayla oynayabilir ve her tur için oyunları herhangi bir sırayla koyabilirim, ancak bir oyunu bir turdan diğerine taşımak nihayetinde kuralları ihlal eder.
steve

Yanıtlar:


5

İşte kendimi icat ettiğim bir algoritma. Zaten var mı yoksa aslında yuvarlak robin uygulaması mı bilmiyorum:

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

temel olarak

döndürme resmi

ve daima 1'i aynı konumda tutun ve gerisini döndürün.

Bu şekilde her zaman benzersiz eşleşmeler takvimi elde edersiniz. Bunu uygulamak son derece kolaydır ve herhangi bir sayıda rakiple, hatta eşit olmayan şekilde ölçeklendirilir. Eğer eşit olmayan sayıda rakibiniz varsa, sadece bir takımı 1 pozisyona yerleştirmeyin ve ücretsiz bir rauntu var.


2
ev ve deplasman dengesini nasıl yönetiyorsun?
Eric Cope

Bu gerçekten işe yaramaz - bu basit rotasyon algoritmasında, 2 yuva (2/4, 3/5) olan dönen takımlar asla oynamaz.
mdryden

@mdryden işe yarıyor. Daha iyi kontrol edin ve lütfen yorumunuzu kaldırın.
Pieter B

@PieterB Çalışacağını düşünüyordum, ancak yan yana olan takımlar (4 ve 5 gibi) asla birbirini oynamayacağı için, tek sayıda takım varsa aslında işe yaramaz. Sonunda 1 ile kolayca görebilirsiniz ve diğer tarafta da sarkan ekibiniz var (bye ile) İşte tek sayı ile de ilgilenen iyi bir yanıt: stackoverflow.com/a/6649732/ 6489306
ragingasiancoder

@ ragingasiancoder Tek sayıda takım varsa, sahte bir takım ekleyin. Bağladığınız cevap sunduğum çözümün aynısını anlatıyor.
Pieter B

1

Bence bunu geri yapıyorsun. Do zamanlama tabloyla başlamak, bir masa / dizisi ile başlar / tüm oyun kombinasyonları (45 oyun) ne olursa olsun. Oradan, sadece günde bir kez oynayan bir takıma dayanan oyunları bir güne atamak basit bir işlemdir. Eşleşmeler yalnızca bir kez gerçekleştiğinden (A Takımı yalnızca bir kez B Takımını oynar) zamanlaması kolaydır, çünkü eşleşmenin henüz gerçekleşmediğinden emin olmanız gerekir (girişler bu şekilde "benzersiz" dir).


1

Aşağıdaki 10 takım tek turlu robin programını oluşturdum. Yaklaşık 3 dakika sürdü.

Program bilgisi:

10 takım - 1 round robin (sadece ilk 6 hafta görüntülenir)
Sezon başlangıç ​​tarihi 1/6/15 - bitiş tarihi 3/5/15
Her Salı 2 oyun, her Perşembe 3 oyun, her hafta 5 oyun atlama tarihi yok

  • Tüm takımlar 5 zaman aralığında eşit olarak oynamak üzere dağıtılır.
  • Hepsi 9 oyun oynar.
  • Hepsi birbirini bir kez oynar.
  • Hepsi ev ve ziyaretçi olarak eşit olarak dağıtılır (5/4 veya 4/5). Not: 2. turun sonunda tüm takımlar 18 oyun oynar (9 ev sahibi ve 9 ziyaretçi olarak) ve tüm takımlarda 2 Byes bulunur.
  • Hepsi her hafta 5 zaman diliminde eşit olarak oynanacak şekilde dağıtılır.

Eski bir Honeywell ana çerçeve bilgisayarı kullandık ve tüm bunları bir araya getirmek için 3 yıldan az bir süre kullandık. Programlama yazılımımız hata ayıklandıktan sonra, aradığımız 4 ila 22 takım için dengeli kalıpları hesaplamak ve oluşturmak için milyonlarca permütasyon ve kombinasyon aramak ana çerçeve bilgisayarını saatler sürdü.

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 

Yüzlerce veya binlerce farklı lig, spor ve potansiyel durumla ilişkili genel zamanlama sorunlarını çözen bir algoritma yoktur. Bu sorunu çözmek için yaptığımız şey, programları hesaplamak için farklı bir yaklaşım kullanmaktı. Düzgün robin takım eşleşmelerini (eşleşmeleri) belirlemek çok karmaşık bir matematikle başlar, ancak bu sadece başlangıçtı. Yayınlanabilecek ve dağıtılabilecek faydalı bir dengeli program oluşturmak için diğer parçalara ihtiyaç vardır. Oyuncular, antrenörler, ebeveynler, vb. Hepsi sadece kimi oynadıklarını bilmelidir ; ama nerede oynadıkları ; ne zaman oynuyorlar ; ev ya da ziyaretçi ise ; ve birçok lig için bir oyun numarası .

Umarım bu size ve başkalarına anlamaya 3 yılımızı neyin getirdiğini anlamada yardımcı olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.