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