26 Ağustos 2026 · Tamsayı programlama
TFF Fantezi Lig kadrosunun tamsayı programı olarak kurulması
Yasal bir fantezi kadrosu, beklenen puana göre sıralanmış bir alışveriş listesi değildir. Bütçe, mevki sayıları ve kulüp tavanı aynı anda sağlanmak zorundadır. Bu yazı, bu seçimin neden 0–1 tamsayı programı olarak yazıldığını ve sıralı (açgözlü) taramanın nerede yetersiz kaldığını adım adım açıklar.
1. Problemin tanımı
TFF Fantezi Lig’de menajer her hafta on beş kişilik bir kadro kurar.
Bu kadronun bir kısmı ilk on bir, kalanı yedektir. Puan, TFF’nin resmî
kalemlerinden gelir: dakika, gol, asist, temiz sayfa, kart, penaltı ve
benzeri. Bu yazının konusu o kalemlerin tahmini değildir. Tahmin
edilmiş bir beklenen puan vektörü p verilmiş kabul edilir.
Soru, bu vektör altında yasal bir kadronun nasıl seçileceğidir.
Yasal olmanın anlamı nettir. Toplam harcama 100 milyon TL’yi geçmez. Mevki sayıları sabittir: iki kaleci, beş savunmacı, beş orta saha, üç forvet. Aynı kulüpten en fazla üç oyuncu alınır. İlk on bir, ligin izin verdiği bir dizilişe oturur. Sakat, cezalı veya kadro dışı oyuncular aday kümesine girmez. Bu maddeler ayrı ayrı “sağlanmış” görünebilir; asıl iş, hepsinin aynı çözümde bir arada durmasıdır.
2. Sıralı seçim neden yetmez
En yalın sezgi şudur: oyuncuları p değerine göre büyükten
küçüğe diz, fiyat yettiği sürece kadroya ekle. Bu, klasik açgözlü
(greedy) taramadır. Listenin başı dolu görünür. Kırılma, kuralın
sıralı değil eşzamanlı olmasından gelir.
Somut bir tablo yeter. Üç yüksek puanlı forvet aynı kulüptendir ve listenin tepesindedir. Algoritma üçünü de alır. Kulüp tavanı dolar. Daha ucuz, farklı kulüpten, beklenen puanı biraz daha düşük bir forvet — ki kadroyu yasal tutacak olan odur — artık giremez. Kaleci sırası geldiğinde hem kota hem kalan bütçe daralmış olabilir. On dört oyuncuya 98 milyon harcanmış, on beşinci yasal aday dışarıda kalmış olabilir. Algoritma “kötü isim” seçmemiştir. Erken adımlar, sonraki adımların fizibilitesini tüketmiştir.
Bu, sırt çantası (knapsack) ve atama problemlerinin bildik özelliğidir. Ağırlık ve değer birlikte düşünülmediğinde yerel en iyi, küresel yasal çözümü garantilemez. Fantezi kadrosunda ağırlık tek değildir: fiyatın yanında mevki kotası ve kulüp tavanı da birer kapasitedir. Üç kapasite birden sıralı taramayla idare edilemez.
3. Karar değişkenleri ve amaç
Aday kümesindeki her oyuncu i için bir ikili değişken
tanımlanır: xᵢ ∈ {0, 1}. Değer 1 ise oyuncu on beşli
kadrodadır. Amaç, beklenen puanların toplamını büyütmektir:
max Σ p[i] * x[i]
p[i] burada bir tahmin katsayısıdır. Form, fikstür zorluğu
ve sezon istatistiğinden gelebilir. Model, bu katsayıların nereden
geldiğini bilmek zorunda değildir; onları doğrusal bir amaçta kullanır.
Katsayı yanlışsa çözüm yasal kalır, kalitesi düşer. Yasallık ile isabet
ayrı katmanlardır.
4. Doğrusal kısıtlar
Bütçe tek bir eşitsizliktir. Mevki kotaları eşitliktir: ilgili küme
üzerindeki toplam tam o sayıya eşit olur. Kulüp tavanı her kulüp için
bir üst sınırdır. Hepsi x cinsinden doğrusaldır.
Σ fiyat[i] * x[i] <= 100
Σ x[i] (i ∈ kaleci) = 2
Σ x[i] (i ∈ savunma) = 5
Σ x[i] (i ∈ orta saha) = 5
Σ x[i] (i ∈ forvet) = 3
Σ x[i] (i ∈ kulüp[k]) <= 3
x[i] ∈ {0, 1}
Eşitlik yerine “en fazla” yazmak, kadroyu eksik bırakır. TFF on beş
kişilik kadro ister. Bu yüzden mevki satırları = ile
kurulur. Kulüp satırı <= kalır; üçten az oyuncu almak
serbesttir, üçten fazla yasaktır.
İlk on bir, kadronun bir alt kümesidir. Bunun için ikinci bir ikili
aile kullanılır: yᵢ ≤ xᵢ ve Σ yᵢ = 11.
Diziliş, y üzerinde ek eşitlik veya eşitsizliklerdir.
Ligin izin verdiği kalıplar (örneğin en az bir kaleci, en az üç
savunmacı, en az bir forvet) bu alt kümede aranır. Böylece “kadro
yasal, ilk on bir ise değil” durumu modelin dışında kalmaz.
5. Kaptan ve otomatik yedek
Kaptan da ikili bir değişkendir. Tam bir kişi seçilir:
Σ cᵢ = 1. Kaptan kadroda olmayan biri olamaz:
cᵢ ≤ xᵢ. TFF’de kaptanın puanı iki kat sayıldığı için
amaçta kaptan, ilgili pᵢ kadar ekstra katkı getirir. Bu
katkı, kaptanın ilk on birde olma koşuluyla birlikte yazılır; yedekte
oturan kaptan, haftanın puanını ikiye katlamaz.
Otomatik yedek, TFF’nin sırayla uyguladığı bir ikame kuralıdır. Oynamayan bir ilk on birlinin yerine, diziliş bozulmayacak şekilde yedekten oyuncu girer. Kaleci yalnız kaleciyle değişir. Bu kural, kadro seçildikten sonra aynı çözümün üzerinde hesaplanır. Piyasayı yeniden sıralı taramaz. Modelin ürettiği 15’li yasal değilse yedek sırası da yasal olmaz; bu yüzden ikame, asıl programın yerine geçmez.
6. Çözüm ve fizibilite
Amaç ve kısıtlar doğrusal, değişkenler ikilidir. Bu sınıf, tamsayı doğrusal program (ILP) olarak çözülür. Uygulamada PuLP, açık kaynak CBC çözücüsünü çağırır. Çözücü ya yasal bir 15’li döndürür ya da modelin fizibil olmadığını bildirir.
Fizibil olmama, kuralın “esnetilmesi” için gerekçe değildir. Sakat ve cezalı listesi güncel değilse, fiyat dosyası eksikse veya kulüp tavanı aday kümesini boğuyorsa girdi ayıklanır ve model yeniden kurulur. Kısıt silinmez. Aksi halde üretilen kadro, ligde oynatılamaz.
Sıralı tarama bu çerçevede hâlâ işe yarar. Aday listesini kısaltır, çözümü insan gözüyle kontrol ettirir, fiyat şokunda hangi ismin düştüğünü gösterir. Asıl karar mercii değildir. Karar, eşzamanlı kısıtların kesişiminde alınır.
7. Kapsam
Üretilen kadrolar istatistiksel tahmindir. Beklenen puan isabetsizse sıralama değişir; yasallık değişmez. Bu ayrım bilinçli tutulur: önce oynanabilir kadro, sonra tahmin kalitesi. Proje TFF’nin resmî bir ürünü değildir.
Uygulama: tff-fantezi-lig-optimizer · blog