Vaka Çalışması · Spor & federasyonlar
TBF: hakem ve değerlendirici ataması için 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 bir karma tamsayılı optimizasyon problemi olarak kurduk. Sistem öneri üretiyor; kurul öneriyi inceliyor, gerekirse elle düzenleyip kesinleştiriyor. Değerlendirici ataması ikinci bir problem olarak eklendi. Sistem 2026–27 sezonundan bu yana federasyonun kendi sunucusunda canlıda ve kurul hakem ve değerlendirici atamalarını kimlik doğrulamalı bir web uygulamasından yapıyor.
- Öneri
- Karar
- 9
- Hard kural
- Kayan
- Ufuk
- 1.400+
- Test
Sistem önerir, MHK kesinleştirir
Uygunlukta ya da modelde, asla ihlal edilmez
Uzun pencere çözülür, ilk hafta kesinleşir
Arka uç + ön yüz; bağımsız kısıt denetçisi
Problem
Merkez Hakem Kurulu her hafta yüzlerce maça, yüzlerce hakem arasından üçer kişilik ekipler atamak zorunda. Bu iş elle yapıldığında dört sorun çıkıyor:
- Adalet ölçülemiyor. Kimin kaç maç aldığı, kimin ne kadar yol yaptığı sezon boyunca takip edilemiyor; şikayetler ö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ç gibi kuralların hepsini aynı anda akılda tutmak mümkün değil.
- Maç zorluğu ile ekip gücü eşleşmiyor. Büyük maça zayıf bir üçlü, küçük maça gereğinden güçlü bir üçlü gidebiliyor.
- İş çok uzun sürüyor. Bir haftalık atama saatler alıyor; fikstür değişince baştan yapılıyor.
Son karar kurulda
Sistem yalnızca öneri üretir, kararı kurul verir. Akış üç adımdan oluşuyor. Sistem çözer ve bir öneri üretir. Kurul öneriyi inceler, gerekirse atamaları 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ı verilir. Son olarak kurul atamaları kesinleştirir. Kesinleşen bir maç bir daha otomatik olarak değiştirilemez ve sonraki çözümlere geçmiş olarak girer. Her önerinin gerekçesi, yani hangi kurala ve hangi değere dayandığı kayıtlıdır.
Bu ilke, sistemin kurulda kabul görmesinin ön koşuluydu. Bir hakem kurulu bir atamayı “algoritma böyle dedi” diye savunamaz; dayandığı kuralı ve değeri gösterebilmesi gerekir.
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 uygunluk aşamasında uygulanıyor. Mazeret, ceza, lig yetkisi, şehir kısıtı, kesinleşmiş başka bir atamayla dolu gün, rotasyon penceresinde kesinleşmiş görev: bu durumlardaki (hakem, maç) çiftleri daha değişken üretilmeden elenir. Modelde kalanlar şunlar: 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ı bir toplamı minimize eder. Ağırlıkları bilinçli olarak birbirinden çok farklı tuttuk; öncelik sırası şöyle: 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, yani sezon başından bugüne kesinleşmiş geçmiş ve pencere birlikte sayılır. Adaleti haftalık değil, sezon ölçeğinde ele alıyoruz.
Maçın gerektirdiği taban puan üç değerin 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 puanı “fazlalık” olarak cezalandırılır, çünkü güçlü hakemi gereğinden küçük bir maça göndermek israf.
Takvim haftası, çözücüler ve denetimler
Takvim haftası. Federasyonun fikstür tur numaraları ligler arasında hizalı değildir; bazı ligler bay geçer, bazıları farklı tarihte başlar. Sistem bu yüzden Cuma–Perşembe arası bir takvim haftası 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 modda ikisi de çalışır ve çözücüden bağımsız bir kanonik amaca göre iyi olan seçilir. Zaman limitinde kesilen bir çözüm “Optimal” olarak değil, “Feasible (zaman limiti)” olarak raporlanır; kullanıcı “Optimal” etiketine gereğinden fazla güvenmesin diye.
Üç ayrı denetim. İlki, çözmeden önce yapılan fizibilite teşhisi: bir tıkanma varsa çözücü hiç çalışmaz ve hangi maçta neden tıkandığı anlaşılır bir dille gösterilir. İkincisi veri kalitesi uyarıları. Puanı sıfır hakem, eksik mesafe, boş lig yetkisi gibi durumlarda sessizce devre dışı kalan kuralları görünür kılar. Üçüncüsü, üretilen çözümün modelden bağımsız bir denetçiyle hard kısıtlara karşı yeniden kontrol edilmesi. Aynı denetçi test paketinde de veritabanını doğrudan okuyarak çalışır.
Kayan ufuk
Uzun bir pencere çözülür, yalnız ilk hafta(lar) kesinleştirilir, sonra pencere ileri kaydırılır. Her çalışma pencere, öneriler ve künyesiyle (parametreler, çözücü, kanonik puan) birlikte saklanı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ını ayrı bir optimizasyon problemi olarak kurduk. Önce hakem ataması kesinleşir, 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ı modele gömülmedi, değiştirilebilir ayrı bir modülde duruyor. Federasyona sorulacak açık kuralları bir soru setinde topladık. Kararların tamamı parametre ya da değiştirilebilir modül olarak kurulduğu için cevaplar gelmeden de uygulamaya başlayabildik.
Sistem ve durum
Veri PostgreSQL’de. İş mantığı bir Python paketi (cozucu) olarak sunum katmanından ayrı duruyor; arayüz veritabanıyla doğrudan konuşmuyor, her şey servis katmanından geçiyor. İlk sürüm Streamlit arayüzüyle bulutta çalıştı ve pilota girdi; ardından bağımsız bir denetim raporundaki düzeltmeler uygulandı.
Bugün çalışan sürüm, 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 izinin yanında fikstür, sezonluk puan ve kişi verisini düzenleme ekranları da var. Sistem Eylül 2026’da canlıya alındı; gecelik yedekten geri yükleme federasyon sunucusunda prova edildi. 2026–27 sezonunda federasyonun yayımladığı maç programları sisteme işleniyor, kurul hakem ve değerlendirici atamalarını buradan yapıyor. Sırada federasyonun Basketbol Yönetim Sistemi’yle (BYS) entegrasyon var.
Canlı kullanım, test ortamında görünmeyen ihtiyaçları da ortaya çıkardı. Çözümden sonra puanı değişen bir hakemin mevcut öneriye nasıl yansıyacağı ve iki maç arasında hakemlerin tek adımda yer değiştirmesi bunlardan ikisi. İkisi de kurulun günlük kullanımında fark edildi ve yol haritasına alındı.
Sistem arka uç ve ön yüzde toplam 1.400’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 boyunca kümülatif hesaplanır; 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; bu çiftler 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ş de sayılır)
- Kesinleşmiş maçlar modele girmez, sabit kabul edilir; yalnız öneriler yeniden çözülür
- 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