Vaka Çalışması · Spor & federasyonlar
TBF: hakem ve değerlendirici atamasını kural, adalet ve öneri üzerine kuran karar destek sistemi
Türkiye Basketbol Federasyonu Merkez Hakem Kurulu'nun haftalık hakem atama işini, federasyon kurallarını ve hakemler arası adaleti gözeten karma tamsayılı optimizasyona çeviren sistem. Sistem öneri üretir; kurul inceler, elle düzenler, kesinleştirir. Hakem ataması üretimde pilotta, değerlendirici ataması ikinci problem olarak eklendi, çok kullanıcılı web arayüzü devam ediyor.
- Öneri
- Karar
- 9
- Hard kural
- Kayan
- Ufuk
- 280+
- Test
Sistem önerir, MHK kesinleştirir
Asla ihlal edilmez — uygunlukta ya da modelde
Uzun pencere çözülür, ilk hafta kesinleşir
Bağımsız kısıt denetçisi + regresyon
Problem
Merkez Hakem Kurulu her hafta yüzlerce maça, yüzlerce hakem arasından üçer kişilik ekipler atamak zorunda. Elle yapıldığında dört şey aynı anda bozuluyor:
- Adalet ölçülemiyor. Kimin kaç maç aldığı, kimin ne kadar yol yaptığı sezon boyunca takip edilemiyor; şikâyetler öznel kalıyor.
- Kural ihlali gözden kaçıyor. Mazeret, ceza, şehir kısıtı, aynı takımı üst üste yönetme yasağı, aynı gün iki maç — hepsi aynı anda elde tutulamıyor.
- Maç zorluğu ile ekip gücü eşleşmiyor. Büyük maça zayıf üçlü, küçük maça gereğinden güçlü üçlü gidebiliyor.
- İş çok uzun sürüyor. Bir haftalık atama saatler alıyor; fikstür değişince baştan yapılıyor.
Tasarımın ilk ilkesi: kontrol kurulda
Sistem karar vermez, öneri üretir. Akış üç adım: sistem çözer ve öneri üretir; kurul inceler, gerekirse tek tek elle değiştirir — her değişiklik hard kısıtlara karşı anında doğrulanır, ihlal varsa gerekçesiyle uyarılır; kurul kesinleştirir. Kesinleşen bir maç bir daha otomatik değiştirilemez ve sonraki çözümlere geçmiş olarak girer. Her önerinin gerekçesi kayıtlıdır: hangi kural, hangi değer.
Bu ilke teknik bir tercih değil, kabulün ön koşuluydu. Bir hakem kurulu “algoritma böyle dedi” diyemez; “şu kurala göre, şu değerle” diyebilmeli.
Model
Karar değişkeni ikili: hakem r maç m’de görevli mi. Model klasman bazında kurulur — A, B ve C ayrı çözülür, havuzlar karışmaz.
Hard kısıtların çoğu modelde değil, uygunlukta. Mazeret, ceza, lig yetkisi, şehir kısıtı, kesinleşmiş başka bir atamayla dolu gün, rotasyon penceresinde kesinleşmiş görev — bunlar (hakem, maç) çifti daha değişken bile üretilmeden elenir. Modelde kalanlar: maça tam üç hakem, üçlü puan tabanı, gün aralığı, pencere içi rotasyon, aylık üst sınır.
Amaç fonksiyonu ağırlıklı toplamı minimize eder ve öncelik sırası bilinçli olarak iyi ayrışmıştır: maç sayısı eşitliği ≫ ligler arası eşitlik ≫ farklı lig ≫ puan uyumu ≫ seyahat. Maç sayısı ve seyahat kümülatif hesaplanır — sezon başından bugüne kesinleşmiş geçmiş artı pencere; adalet haftalık değil sezonluk bir kavramdır.
Maçın gerektirdiği taban puan üç şeyin en büyüğüdür: iki takımın puan toplamı, maça özel önem tabanı (derbi, kupa, averaj) ve kullanıcı tanımlı asgari. Üçlünün bu tabanı aşan kısmı “fazlalık” olarak cezalandırılır — güçlü hakem israfı.
İki hafta, iki çözücü, üç güvenlik ağı
İki hafta kavramı. Federasyonun fikstür tur numaraları ligler arasında hizalı değildir; bazı ligler bay geçer, farklı başlar. Sistem bu yüzden Cuma–Perşembe takvim haftasını türetir ve pencere, rotasyon, kayan ufuk gibi tüm zaman kısıtlarını onun üzerinden çalıştırır; lig haftası yalnız gösterimde kalır.
İki çözücü. Aynı model hem açık kaynak CBC (PuLP) hem OR-Tools CP-SAT ile kurulu; varsayılan mod ikisini de çalıştırıp çözücüden bağımsız kanonik amaca göre iyisini seçer. Durum etiketleri dürüsttür: zaman limitinde kesilen çözüm “Optimal” değil “Feasible (zaman limiti)” olarak raporlanır — kullanıcı “Optimal” yazısına aşırı güvenmesin diye.
Üç güvenlik ağı. Çözmeden önce fizibilite teşhisi — blok varsa çözücü hiç çalışmaz, hangi maçta neden tıkandığı anlaşılır dille söylenir. Veri kalitesi uyarıları — puanı sıfır hakem, eksik mesafe, boş lig yetkisi gibi sessizce devre dışı kalan kuralları görünür kılar. Ve üretilen çözümün modelden bağımsız bir denetçiyle hard kısıtlara karşı yeniden denetlenmesi; aynı denetçi test paketinde veritabanını doğrudan okuyarak çalışır.
Kayan ufuk
Uzun bir pencere çözülür, yalnız ilk hafta(lar) kesinleştirilir, pencere ileri kaydırılır. Bir çalışma, pencere + öneriler + künye (parametreler, çözücü, kanonik puan) olarak kalıcıdır; aynı haftalar için birden çok rakip çalışma yan yana tutulabilir. Fikstür değiştiğinde yalnız etkilenen haftalar yeniden çözülür.
İkinci problem: değerlendirici ataması
Her maça hakem üçlüsüne ek olarak bir değerlendirici (gözlemci) atanması ayrı bir optimizasyon problemi olarak kuruldu: önce hakem ataması kesinleşir, sonra değerlendirici çözümü onun üzerine oturur. Kurallar farklı — puan–lig eşleşmesi, haftada en fazla bir görev, yerellik önceliği ve mesafe maliyeti, sezon sonunda dengeli dağılım. Kapsanamayan maç çözümsüzlük üretmez, yüksek cezayla raporlanır; adalet kuralı değiştirilebilir ayrı bir modülde durur, modele gömülmez. Federasyona sorulacak açık kurallar bir soru setinde toplandı; cevap gelmeden de uygulamaya başlanabildi çünkü kararların tamamı parametre ya da değiştirilebilir modül olarak kuruldu.
Sistem ve durum
Veri PostgreSQL’de; iş mantığı bir Python paketi (cozucu) olarak sunum katmanından ayrı — arayüz veritabanına konuşmaz, her şey servis katmanından geçer. İlk sürüm Streamlit arayüzüyle bulutta çalıştı ve pilota girdi; bağımsız bir denetim raporuyla düzeltmeler uygulandı. Üçüncü faz, federasyonun kendi sunucusunda Docker Compose ile koşan kimlik doğrulamalı bir web uygulaması (FastAPI + React): asenkron çözüm akışı, elle düzenleme, çalışma yönetimi, kesinleştirme, rapor ekranları, kullanıcı yönetimi ve denetim izi tamamlandı; fikstür revizesi ve federasyon ERP’siyle entegrasyon sırada.
Sistem 280’den fazla testle korunuyor; bağımsız hard-kısıt denetçisi her çözümü veritabanından okuyarak yeniden denetliyor.
Modelin kurulumu
| Amaç | Yön | Çatışma |
|---|---|---|
| Maç sayısı eşitsizliği (en çok – en az) | ↓ | En ağır terim — adalet, sezon geneli kümülatif; yeni haftalar geçmişle birlikte sayılır |
| Ligler arası dağılım sapması ve aynı ligde yığılma | ↓ | Bir hakemin klasman içindeki liglere dengeli gitmesi, kısa vadede maç eşitliğiyle çelişebilir |
| Puan fazlalığı — üçlünün taban üstündeki puanı | ↓ | Güçlü hakemi küçük maça göndermek israftır; ama adalet için bazen gerekir |
| Seyahat eşitsizliği (km) | ↓ | En hafif terim — mesafe verisi eksikse modelden tamamen çıkarılır |
Kısıtlar
- Her maça tam üç hakem; üçlünün toplam puanı maçın gerektirdiği tabanın altına inemez
- Mazeret, ceza, Eurolig görevi ve idari yasak olan tarihte atama yok — çift daha üretilmeden elenir
- Hakemin lig yetkisi olmalı; B ve C klasmanında kendi şehrinin takımına atanamaz
- İki maç arasında asgari gün aralığı; aynı takımı rotasyon penceresi içinde iki kez yönetemez
- Takvim ayı başına maç üst sınırı — kesinleşmiş geçmiş sayıma dahil
- Kesinleşmiş maçlar modele girmez; öneriler hipotez, kesinler gerçektir
- Değerlendirici yalnız hakemi kesinleşmiş maçlara, haftada en fazla bir kez, puan–lig eşleşmesiyle atanır
- Kapsanamayan maç çözümsüzlük üretmez — yüksek cezayla raporlanır