Debreceni Egyetem
Természettudományi és Technológiai Kar
Matematikai Intézet

Szakdolgozat

Alkalmazott matematika és a
SageMathkészítette:

Szilágyi Bencetémavezető: Dr. Tengely Szabolcs

Debrecen, 2020

Tartalomjegyzék
Tartalomjegyzéki

1 Bevezető

22 PageRank algoritmus
2.1. Egyszerűsített PageRank algoritmus . . . . . . . . . . . . . . . . .
2.2. Példa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3. Egyszerűsített PageRank algoritmus matematikája . . . . . . . . .
2.4. PageRank a Premier League-re . . . . . . . . . . . . . . . . . . . .
2.5. Program és Programkód . . . . . . . . . . . . . . . . . . . . . . . .

3
3
3
4
6
8

3 Élő-pontrendszer
3.1. Általánosított Élő-pontrendszer . . . . . . . . . . . . . . . . . . . .
3.2. Az Élő-pontrendszer a labdarúgásban . . . . . . . . . . . . . . . . .
3.3. Az Élő-pontrendszer futballra alkalmazott matematikája . . . . . .
3.4. Élő-pontrendszer a Premier League-re . . . . . . . . . . . . . . . .
3.5. Program és Programkód . . . . . . . . . . . . . . . . . . . . . . . .
3.6. Eredmény meghatározás . . . . . . . . . . . . . . . . . . . . . . . .
3.7. Program és Programkód 2 . . . . . . . . . . . . . . . . . . . . . . .

16
16
17
17
19
20
22
24

Irodalomjegyzék

45iKöszönetnyilvánításElőször szeretném megköszönni a családomnak, hogy végig támogattak és biztattak a tanulmányaim során. Barátnőmnek, Mikó Anitának, hogy mindig átsegített
a nehézségeken, és nap mint nap motivál az újabb célok elérésében. Szeretném
megköszönni a barátaimnak (ide értve a teniszpályán kapott rengeteg támogatástis), akik mindig ott voltak mellettem, ha problémám volt, illetve segítettek kiszakadni a szürke hétköznapokból. Szintén szeretném megköszönni a tanáraimnak,
illetve csoporttársaimnak, hogy segítséget nyújtottak az egyetemi tanulmányaimalatt.
Ezenkívül szeretném külön megköszönni Dr. Tengely Szabolcsnak, hogy vállaltaa témavezetésem, és segített engem a teljes munkám ideje alatt; illetve Molnár
Alexandrának, akivel egymást segítve jutottunk túl a szakdolgozatírás kezdeti
nehézségein.

11. Bevezető
A szakdolgozatom a sportrangsorolással foglalkozik. Ebben a témakörben sokan
dolgoztak már, legtöbben az amerikai sportokra alkalmazták. Korábban egy volt
Debreceni Egyetemi hallgató, Félegyházi Dávid, is írt szakdolgozatot a témában,"Interaktív alkalmazások implementálása SageMath programcsomagba" címmel.
Ő a TeamRanking algoritmusoknál a Colley-módszert, a Massey-módszert, illetvea Keener-módszert vette górcső alá. A sportrangsoroláson belül a PageRank algoritmust és az Élő-pontrendszert (angolul Elo vagy ELO rangsorolás) és azok
matematikáját mutatom be. Ehhez a Premier League (Angol labdarúgó bajnokság első osztálya) 2015/2016-os és a 2019/2020-as kiírását használtam fel, mivelez egy egyenlő feltételeket felvonultató (mindenki játszik mindenkivel oda-vissza
vágós alapon) rendszer. Az algoritmusokat a SageMath nevű matematikai programcsomag segítségével állítottam elő és alkalmaztam.

22. PageRank algoritmus
A Pagerank algoritmust Page és Brin találta ki 1998-ban [1], és a Google keresőmotorjának prototípusában használták. A cél egy weboldal népszerűségének vagy
fontosságának becslése a háló összekapcsolása alapján. Ennek mögöttes oka: (i) atöbb bejövő hivatkozással rendelkező oldal fontosabb, mint a kevesebb bejövő hivatkozással ellátott oldal, (ii) szintén fontos egy olyan oldal, amelynek hivatkozása
van egy olyan oldalról, amelyről ismert, hogy nagyon fontos.

2.1. Egyszerűsített PageRank algoritmus
Az oldalak közötti kapcsolatokat egy gráf ábrázolja. Egy csúcs egy weboldalt [5]ábrázol, az A oldalról a B oldalra mutató nyíl (irányított él) azt jelenti, hogy
van egy link az A oldalról a B oldalra. A kimenő hivatkozások/linkek száma
fontos paraméter. "Egy csúcs ki-foka" jelölést használjuk az oldalon lévő kimenő
hivatkozások számának megjelölésére. Ezt a gráfot általában webgráfnak nevezik.
A gráf minden csúcsát egy oldal azonosítja. L(p)-vel jelöljük a kimenő élek számát
egy p oldalon.

2.2. Példa
Vegyünk egy öt csúcsú gráfot.

4

2

1

5

3
3

4

FEJEZET 2. PAGERANK ALGORITMUS

Az 1-es csúcsból mind a négy csúcsba mutat él. A 2-es csúcsból az egyesbeés a hármasba megy él. A 3-as csúcsból csak az ötösbe, a 4-es csúcsból csak akettesbe, míg az 5-ös csúcsból is csak a kettesbe mutat él. Így a következőket
írhatjuk fel: L(1)=4, L(2)=2, L(3)=L(4)=L(5)=1.

2.3. Egyszerűsített PageRank algoritmus matematikája
Folytatva az eddig leírtakat és a példát követve, legyen N az összes csúcs száma.
Hozzunk létre egy N × N -es mátrixot, ami legyen A. Az A mátrix az (i, j)-kelvan meghatározva, ahol

(
aij =

1
L(j)

ha van egy él j és i között,0

egyébként .

A példában az A mátrix 5 × 5-ös mátrix:



0

1
4
1
4
1
4
1
4

1
2

0
0 0
1
2 0
0 0
0 1

0
1
0
0
0


0
1


0

0
0

Az egyes oszlopokban az értékek összege egyenlő. Általában egy mátrixot oszlopsztochasztikusnak tekintünk, ha az értékei nem-negatívak, és az egyes oszlopokösszege egyenlő 1-gyel. Az A mátrix oszlopsztochasztikus mátrixot hoz létre,feltéve, hogy minden csúcsnak van legalább egy kimenő éle.
Az egyszerűsített PageRank algoritmus:• Inicializálja az x-et N × 1-es oszlopvektorba nem-negatív komponensekkel,
majd ismétlődően kicseréli x-et Ax-re, amíg az konvergál.
Az x-et nevezzük a PageRank vektornak. Ezt inicializáljuk egy oszlopvektornak,
amelynek komponensei egyenlőek egymással.
A példában az x vektor komponensei az x1 , x2 , x3 , x4 és az x5 . Így az x akövetkezőképpen néz ki:

2.3. EGYSZERŰSÍTETT PAGERANK ALGORITMUS MATEMATIKÁJA

5   x1
1
x  1
 2     x = x3  = 1   x4  1x5
1
Ebben az esetben az algoritmus gyorsan konvergál, így hamar megkapjuk a végeredményt. Ezt a következő módon számolhatjuk ki [3]:A Pi csúcs PageRank értékét r(Pi )-vel jelöljük, ami az összes olyan csúcs PageRank értékének az összege, amelyekből mutat él Pi -re.
Ekkorr(Pi ) =X r(Pj )|Pj |(2.3.1)

Pj ∈BPiahol BPi a Pi -re mutató élek száma és |Pj | a kimenő élek száma a Pj csúcsból.
A probléma az egyenlettel, hogy az r(Pj ) értékei, és a Pi csúcsba menő élekhez
tartozó csúcsok PageRank értékei ismeretlenek. Ennek megoldására Brin és Page
iteratív eljárást alkalmazott. Vagyis azt feltételezik, hogy a csúcsok egyenlő PageRank értékekkel rendelkeznek (Mondjuk 1/n. ahol n a csúcsok száma). Ezután
az egyenlet szabályát követjük r(Pi ) kiszámításához minden egyes Pi csúcsra. A
szabályt egymás után alkalmazzuk az előző iteratív értéket r(Pj )-re cserélve.
Még egy jelölés az iteratív eljárás meghatározása céljából:Legyen rk + 1(Pi ) a (Pi ) csúcs PageRank értéke k+1 iterációnál.

rk+1 (Pi ) =X rk (Pj )|Pj |(2.3.2)

Pj ∈BPiEzt a folyamatot az r0 (Pi )=1/n értékkel kezdjük meg az összes Pi csúcson és
megismételjük annak a reményében, hogy a PageRank értékei néhány lépés utánvéges értékhez fog konvergálni.
Én a példa PageRank értékeinek kiszámításához a SageMath programot hívtam segítségül, amibe alapból be van építve az algoritmus. Íme a végeredmény:

6

FEJEZET 2. PAGERANK ALGORITMUS

Csúcs

PageRank érték

1
2
3
4
5

0.16784207409035679
0.32433429197730995
0.20350851483455765
0.06566644074420083
0.2386486783535748

A példánkban szereplő gráf esetén a 2-es csúcs rendelkezik a legnagyobb
PageRank értékkel.

2.4. PageRank a Premier League-reEbben a részben bemutatom, miként alkalmaztam a PageRank algoritmust a Premier League-re. A bajnokságban húsz csapat szerepel, és mindenki játszik mindenkivel oda-vissza vágós alapon. Az eredmények alapján létrehoztam egy gráfota SageMath program segítségével. Minden egyes mérkőzés esetében a vesztes csapat csúcsából indult él a győztes csapat csúcsáéba, illetve döntetlen esetén mindkét
egyesület kapott egy-egy élt. Alapesetben a győzelemért járó él súlyozása 3, míga döntetlenért járó élé 1 volt. Ezt utána továbbfejlesztettem a lőtt gólok súlyával.
A legvégén pedig hozzáadtam az alábbi értékek súlyát is:• hazai kaput nem találó lövés súlya• vendég kaput nem találó lövés súlya• hazai kaput találó lövés súlya• vendég kaput találó lövés súlya• hazai szabálytalanság súlya• vendég szabálytalanság súlya• hazai sárga lap súlya• vendég sárga lap súlya• hazai piros lap súlya• vendég piros lap súlya.
Végezetül pedig kiszámoltam az egyes csapatok PageRank értékeit a SageMath
segítségével.

2.4. PAGERANK A PREMIER LEAGUE-RE

Íme a létrehozott gráf:

7

8

FEJEZET 2. PAGERANK ALGORITMUS

2.5. Program és Programkód
A SageMath [6] matematikai programcsomagban elkészült interaktív alkalmazás
az alapesetre nézve. A programkód:html("<h2 align=center>PageRank (Alapeset)</h2>")@interact(layout=[[’gys’],[’gs’],[’ds’]])def sliders(gys=slider(1,5,1, label=’Győzelem súlya’,default=3),
ds=slider(0,2,0.5.n(digits=2), label=’Döntetlen súlya’,default=1)):
import networkx as nx
import matplotlib.pyplot as plt
from sage.graphs.graph_plot import GraphPlot
options = {’vertex_size’: 2500,’layout’: ’circular’,}
G20=nx.DiGraph()y=[]import csv
a = csv.reader(open(’season-1516_csv.csv’))elek1=[]
elek2=[]
elek3=[]
for k in a:
if k[2]!=’HomeTeam’:
y=y+[k[2]]if k[6]==’H’:
etemp=[s for s in elek1 if s[0]==k[3] and s[1]==k[2]]if etemp==[]:
elek1=elek1+[(k[3],k[2],gys)]else:
suly=etemp[0][2]+gys
elek1=elek1+[(k[3],k[2],suly)]
elif k[6]==’A’:
etemp=[s for s in elek1 if s[0]==k[2] and s[1]==k[3]]if etemp==[]:
elek1=elek1+[(k[2],k[3],gys)]else:
suly=etemp[0][2]+gys
elek1=elek1+[(k[2],k[3],suly)]
else:
etemp=[s for s in elek1 if (s[0]==k[2] and s[1]==k[3])]if etemp==[]:
elek1=elek1+[(k[2],k[3],ds)]

2.5. PROGRAM ÉS PROGRAMKÓD

else:
suly=etemp[0][2]+ds
elek1=elek1+[(k[2],k[3],suly)]
etemp=[s for s in elek1 if (s[0]==k[3] and s[1]==k[2])]if etemp==[]:
elek1=elek1+[(k[3],k[2],ds)]
else:
suly=etemp[0][2]+ds
elek1=elek1+[(k[3],k[2],suly)]G20.add_nodes_from(y)G20.add_weighted_edges_from(elek1)
pr = nx.pagerank_numpy(G20, alpha=0.99)
T=list(pr)T2=[(k,pr[k]) for k in T]
T3=sorted(T2, key=lambda tup: -tup[1] )T2.sort()
TU=[(T2[k][0],T2[k][1],T3[k][0],T3[k][1]) for k in
[0..len(T2)-1]]
pretty_print(table(rows=TU,frame=True))

9

10

FEJEZET 2. PAGERANK ALGORITMUS

A futási kép:2.5. PROGRAM ÉS PROGRAMKÓD

A futási kép a gólok súlyával bővítve:

11

12

FEJEZET 2. PAGERANK ALGORITMUS

A teljes bővített esethez tartozó programkód:html("<h2 align=center>PageRank (Teljes bővített esetben)</h2>")@interact(layout=[[’gys’],[’gs’],[’ds’],[’hkntl’,’vkntl’],[’hktl’,’vktl’],[’hsz’,’vsz’],[’hs’,’vs’],[’hp’,’vp’]])def sliders(gys=slider(1,5,1, label=’Győzelem súlya’,default=3),
gs=slider(0,1.5,0.25.n(digits=2), label=’Gólok súlya’,default=0.5),
ds=slider(0,2,0.5.n(digits=2), label=’Döntetlen súlya’,default=1),
hkntl=slider(0,0.2,0.025.n(digits=2),
label=’Hazai kaput nem találó lövés súlya’,default=0.05),
vkntl=slider(0,0.2,0.025.n(digits=2),
label=’Vendég kaput nem találó lövés súlya’,default=0.05),
hktl=slider(0,0.2,0.05.n(digits=2),
label=’Hazai kaput találó lövés súlya’,default=0.1),
vktl=slider(0,0.2,0.05.n(digits=2),
label=’Vendég kaput találó lövés súlya’,default=0.1),
hsz=slider(0,0.2,0.025.n(digits=2),
label=’Hazai szabálytalanság súlya’,default=0.05),
vsz=slider(0,0.2,0.025.n(digits=2),
label=’Vendég szabálytalanság súlya’,default=0.05),
hs=slider(0,0.2,0.05.n(digits=2),
label=’Hazai sárga lap súlya’,default=0.1),
vs=slider(0,0.2,0.05.n(digits=2),
label=’Vendég sárga lap súlya’,default=0.1),
hp=slider(-2,2,1, label=’Hazai piros lap súlya’,default=1),
vp=slider(-2,2,1, label=’Vendég piros lap súlya’,default=1)):
import networkx as nx
import matplotlib.pyplot as plt
from sage.graphs.graph_plot import GraphPlot
options = {’vertex_size’: 2500,’layout’: ’circular’,}
G20=nx.DiGraph()y=[]import csv
a = csv.reader(open(’season-1516_csv.csv’))elek1=[]
elek2=[]
elek3=[]
for k in a:
if k[2]!=’HomeTeam’:
y=y+[k[2]]if k[6]==’H’:

2.5. PROGRAM ÉS PROGRAMKÓD

13

etemp=[s for s in elek1 if s[0]==k[3] and s[1]==k[2]]if etemp==[]:
elek1=elek1+[(k[3],k[2],gys+gs*(Integer(k[4])Integer(k[5]))+hkntl*(Integer(k[11])-Integer(k[13]))-vkntl*(Integer(k[12])-Integer(k[14]))+hktl*(Integer(k[13]))-vktl*(Integer(k[14]))-hsz*(Integer(k[15]))+vsz*(Integer(k[16]))-hs*(Integer(k[19]))+vs*(Integer(k[20]))-hp*(Integer(k[21]))+vp*(Integer(k[22])))]else:
suly=etemp[0][2]+(gys+gs*(Integer(k[4])-Integer(k[5]))+hkntl*(Integer(k[11])-Integer(k[13]))-vkntl*(Integer(k[12])-Integer(k[14]))+hktl*(Integer(k[13]))-vktl*(Integer(k[14]))-hsz*(Integer(k[15]))+vsz*(Integer(k[16]))-hs*(Integer(k[19]))+vs*(Integer(k[20]))-hp*(Integer(k[21]))+vp*(Integer(k[22])))
elek1=elek1+[(k[3],k[2],suly)]
elif k[6]==’A’:
etemp=[s for s in elek1 if s[0]==k[2] and s[1]==k[3]]if etemp==[]:
elek1=elek1+[(k[2],k[3],gys+gs*(Integer(k[4])-Integer(k[5]))-hkntl*(Integer(k[11])-Integer(k[13]))+vkntl*(Integer(k[12])-Integer(k[14]))-hktl*(Integer(k[13]))+vktl*(Integer(k[14]))+hsz*(Integer(k[15]))-vsz*(Integer(k[16]))+hs*(Integer(k[19]))-vs*(Integer(k[20]))+hp*(Integer(k[21]))-vp*(Integer(k[22])))]else:
suly=etemp[0][2]+(gys+gs*(Integer(k[5])-Integer(k[4]))-hkntl*(Integer(k[11])-Integer(k[13]))+vkntl*(Integer(k[12])-Integer(k[14]))-hktl*(Integer(k[13]))+vktl*(Integer(k[14]))+hsz*(Integer(k[15]))-vsz*(Integer(k[16]))+hs*(Integer(k[19]))-vs*(Integer(k[20]))+hp*(Integer(k[21]))-vp*(Integer(k[22])))
elek1=elek1+[(k[2],k[3],suly)]
else:
etemp=[s for s in elek1 if (s[0]==k[2] and s[1]==k[3])]if etemp==[]:
elek1=elek1+[(k[2],k[3],ds+gs*((Integer(k[4])+Integer(k[5]))/2))]
else:
suly=etemp[0][2]+ds+gs*((Integer(k[4])+Integer(k[5]))/2)
elek1=elek1+[(k[2],k[3],suly)]
etemp=[s for s in elek1 if (s[0]==k[3] and s[1]==k[2])]if etemp==[]:
elek1=elek1+[(k[3],k[2],ds+gs*((Integer(k[4])+Integer(k[5]))/2))]
else:

14

FEJEZET 2. PAGERANK ALGORITMUS

suly=etemp[0][2]+ds+gs*((Integer(k[4])+Integer(k[5]))/2)
elek1=elek1+[(k[3],k[2],suly)]G20.add_nodes_from(y)G20.add_weighted_edges_from(elek1)
pr = nx.pagerank_numpy(G20, alpha=0.99)
T=list(pr)T2=[(k,pr[k]) for k in T]
T3=sorted(T2, key=lambda tup: -tup[1] )T2.sort()
TU=[(T2[k][0],T2[k][1],T3[k][0],T3[k][1]) for k in
[0..len(T2)-1]]
pretty_print(table(rows=TU,frame=True))2.5. PROGRAM ÉS PROGRAMKÓD

A teljes bővített esethez tartozó futási kép:15

3. Élő-pontrendszer
Az Élő-pontrendszert [7] Élő Árpád Imre [8] (nemzetközileg ismertebb az Arpad
Elo név) alkotta meg, aki magyar származású, de amerikai sakkozó, fizikaprofesszor és sportvezető volt. Élő a sakkban addig használt (Harkness-rendszer),a játékosok teljesítményére vonatkozó, értékelési rendszer modernizálásának és
igazságosabbá tételének céljából alkotta meg a módszerét. Először az 1960-asévekben kezdték el alkalmazni az Egyesült Államokban, majd később (1970) a
Nemzetközi Sakkszövetség is bevezette. Élő egy könyvet is írt e témában, ami amai napig alapműnek számít a sakkjátékosok értékelésében. Ez a könyv a The
Rating of Chessplayers, Past and Present címen jelent meg 1978-ban New Yorkban. Élő Árpád pontrendszere még most is használtban van.
A rendszer, a korábban használt szisztémát, ami majdhogynem szubjektíven
odaítélt pontszámokról szólt, próbálta úgy meghatározni, hogy az független legyenmindentől, csak a teljesítmény számítson egy adott versenyen. Ezt statisztikai
módszerrel kívánta elérni. Ennek lényege, hogy az elkövetkező játszma végkimenetelét, a játékosok addig elért eredményeiből származtatott játékerőt képviselő változó határozza meg. Ezt a változót normális eloszlású (Gauss-eloszlás) valószínűségi változónak nevezzük. Értelemszerűen, ha egy játékos úgy nyer, hogy egy
nálánál magasabb rangsoroltat győz le, akkor nagyobb mértékben nő a pontszáma, mintha alacsonyabb pontszámút ver meg. A vereségre hasonló hatással van,tehát, ha jobb ellenféltől kap ki valaki, akkor kevésbé csökken az értéke, mintha
rosszabbtól. Döntetlennél, ha a két játékos közel azonos erejű, akkor nem változik semmi, más esetben viszont az erősebb pontokat bukik, míg a gyengébb
pontokat nyer. Így az Élő-pontszámok segítségével könnyen kalkulálható volt egy
várható eredmény minden sakkjátszma előtt. A játékosok nagyon kedvelték ezt
az új módszert, mert így hamar ki tudták számolni az új pontszámaikat.

3.1. Általánosított Élő-pontrendszer
Később a sakkban is egyre többen próbálták továbbfejleszteni az alapváltozatot. Ehhez nagy segítség volt a számítógép bevonása, mivel így bonyolultabb
modelleket is létre lehetett hozni, amikből lényegesen nehezebb számítások adódtak, de így már tudták kezelni azokat. Ilyenek voltak Mark Glickman, illetve
16

17

3.2. AZ ÉLŐ-PONTRENDSZER A LABDARÚGÁSBAN

Trueskill modelljei, sőt utóbbi rendszere már nemcsak a sakkban volt használható, hanem egyéb sportokban is. Megjelent például a golfban, góban, teniszben,
csapatsportokban, de még a számítógépes játékokban is így határozzák meg arangsorokat.

3.2. Az Élő-pontrendszer a labdarúgásban
Először Buchdahl (2003) használta jelentősen a labdarúgásra. A témában Lars
Magnus Hvattum és Halvard Arntzen 2010-ben megalkotott egy átfogó tanulmányt [2]. A szerzők ugyan nem nyújtottak elegendő összehasonlítást más modellekkel, de Robbcrechts és Davis (2018) nemrégiben készített munkája bebizonyította, hogy a módszer megalapozott. Az egyik legfrissebb tanulmány [4], ami ezzel
foglalkozik, az 2019-ben jelent meg Hubáček, Šourek és Železný reprezentálásában.
Napjainkban a fogadóirodák, illetve bukmékerek is használják a sportfogadás
területén, a mérkőzések végkimenetelének meghatározására. A FIFA (Nemzetközi
Labdarúgó Szövetség) vezet egy Élő-ranglistát, ami a nemzeti labdarúgó-válogatottak alternatív ranglistája, és minden lejátszott mérkőzés után frissül. Ennek
szintén az Élő-pontrendszer az alapja.

3.3. Az Élő-pontrendszer futballra alkalmazott matematikája
A már korábban említett tanulmány (Hvattum és Arntzen) segítségével szeretném
bemutatni az Élő-rangsorolás matematikáját a labdarúgásra.
A korábban lejátszott mérkőzések eredményei alapján minden csapathoz hozzárendelhető ELO rangsor (más néven Élő-pontszám), amely a csapat aktuáliserősségét mutatja. Legyen l0H és l0A a mérkőzés kezdetén lévő értéke a hazai és
idegenbeli csapatnak. Definiáljunk egy olyan pontozási rendszert, ahol a győzelem
1 pontot ad, a döntetlen 0,5-öt, míg a vereség 0 pontot. Az ELO számításai azt
feltételezik, hogy a szóban forgó mérkőzésen átlagosan a hazai és a vendégcsapatnak γ H és γ A pontokat kell szereznie, ahol

γH =

1

(3.3.1)AH
1 + c(l0 −l0 )/dγA = 1 − γH =1HA
1 + c(l0 −l0 )/d

Most adjuk meg a hazai csapat aktuális pontját:.

(3.3.2)

18

FEJEZET 3. ÉLŐ-PONTRENDSZER

α

H

=




1

ha a hazai csapat nyer,

0.5 ha a meccs döntetlen,
0
egyébként.

Ekkor a vendég csapat aktuális pontja αA = 1 − αH . Az Élő-pontszám frissül ameccs után, és a hazai csapat új pontszáma a következő:l1H = l0H + k(αH − γ H ).

(3.3.3)A vendég csapat új pontszáma l1A , amit ugyanúgy kell kiszámolni, mint a hazait.
A pontszám követi a csapatot, és frissül minden mérkőzés után.
Vegyük figyelembe, hogy az ELO rangsorok kiszámításához egy adott mérkőzés
után szükség van néhány kezdeti érték megadására, minden csapat számára. Addig nem lehet várni, hogy az értékek megbízhatóak legyenek, míg elegendő számú
korábbi mérkőzések eredményét nem veszik figyelembe.
Az eddig leírt módszerre úgy hivatkozunk, mint alapvető ELO rangsorolás. Ennekegy érdekes változata, amikor úgy frissítjük a k változót, hogy az függ a gólkülönbségtől. Így egy 3-0-ás győzelem nagyobb pontot fog generálni, mint egy 2-1-es.
Erre egy lehetőség, hogy a (3.3.3) egyenletbe a k helyére a következő kifejezéstírjuk:

k = k0 (1 + δ)λ ,(3.3.4)ahol δ az abszolút gólkülönbség, és adottak a k0 > 0 és λ > 0 állandó paraméterek.
Ezt a megközelítést a cél alapú ELO rangsorolásnak nevezik.
Az alapvető ELO rangsorolási módszerben három paraméter található, c, d és
a k. Amíg c és d könnyen értelmezhető úgy, hogy megfelelő értékeket adjon arangsorolásnál, addig a k meghatározásánál óvatosnak kell lenni. Ha a k értéketúl alacsony, akkor nem fogja kellő képen változtatni a csapatok Élő-pontszámot,viszont ha túl nagy a k értéke, akkor megbízhatatlan lesz a rangsorolás, mert nagy
mértékben fognak változni a pontszámok egyes mérkőzések után. A cél alapú ELO
rangsorolásnál négy paraméter van, mivel k helyett k0 és λ lesz. A paraméterek
megadásánál a c = 10-et és a d = 400-at alkalmazzuk. A k értékét úgy kapjuk
meg, hogy a λ-t 0-nak vesszük az alapestben, ekkor k = 20-at kapunk. A másik
verzióban a λ = 1-et tekintjük és a k0 = 10-et, ahonnan kapjuk a k = 10(1 + δ)-t.

3.4. ÉLŐ-PONTRENDSZER A PREMIER LEAGUE-RE

19

3.4. Élő-pontrendszer a Premier League-reÉn a Premier League 2019/2020-as idényének a 28. fordulóig lejátszott mérkőzéseinek az eredményeit használtam fel Élő-rangsorolásom létrehozásához. Az eredmény megkapásához az előbb leírt modellt használtam, azon belül is a cél alapú
ELO rangsorolást, némi módosítással. Annyi a változás, hogy a k értéke ugyan
20-ról indul, de változtatható, illetve a gólkülönbséget egy ’gólkülönbségi osztó’bevezetésének segítségéve számolom, ami szintén változtatható érték (alapbeállításban 300). Ez úgy van megvalósítva, hogy veszem az alapvető ELO rangsorolást, és hozzáadom a gólkülönbségért járó pontokat is, amit úgy számolok ki
a hazai csapatra, hogy veszem az adott mérkőzésen rúgott góljainak a számát,és megszorzom a vendégcsapat Élő-pontszámának és a ’gólkülönbségi osztónak’ ahányadosával. Az idegenben játszó együttes gólkülönbségért járó pontjait analóg
módon számoljuk. A c és d paramétereket nem változtattam, azokat én is 10-nek
és 400-nak definiáltam, illetve minden csapat 1500-as Élő-pontszámmal kezdett abajnokságban. A program minden meccs után felülírta az Élő-pontszámokat, ésa végén az aktuálisakat írta ki.

20

FEJEZET 3. ÉLŐ-PONTRENDSZER

3.5. Program és Programkód
A programkód:html("<h2 align=center>ÉLŐ pontszámítás</h2>")@interact(layout=[[’K’],[’gk’]])def sliders(K=slider(10,30,1, label=’gólkülönbségi szorzó’,default=20),gk=slider(0,800,50, label=’gólkülönbségi osztó’,default=300)):cs=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]!=’HomeTeam’:
cs=cs+[k[3]]L0=list(Set(cs))
L=sorted(L0)H=[[k,1500] for k in L]
A=[[k,1500] for k in L]
c=10
d=400
import csv
a = csv.reader(open(’E0.csv’))
y=[]
YH=[]
for k in a:
if k[3]!=’HomeTeam’:
y=y+[k[3]]lh=H[L.index(k[3])][1]la=A[L.index(k[4])][1]hg=k[5]ag=k[6]
if k[7]==’H’:
x=1
z=0
YH=1/(1+c^((la-lh)/d))
YA=1-YH
elif k[7]==’A’:
x=0
z=1
YH=1/(1+c^((la-lh)/d))

3.5. PROGRAM ÉS PROGRAMKÓD

21

YA=1-YH
else:
x=0.5
z=0.5
YH=1/(1+c^((la-lh)/d))
YA=1-YH
H[L.index(k[3])][1]=round(lh+K*(x-YH))+round(ZZ(hg)*la/gk)
A[L.index(k[4])][1]=round(la+K*(z-YA))+round(ZZ(ag)*lh/gk)#print("H=",H)#print("A=",A)
HR=sorted(H, key=lambda tup: -tup[1] )AR=sorted(A, key=lambda tup: -tup[1] )T=[(H[k][0],H[k][1],HR[k][0],HR[k][1],A[k][0],A[k][1],AR[k][0],AR[k][1]) for k in [0..len(H)-1]]
pretty_print(table(rows=T,frame=True))

22

FEJEZET 3. ÉLŐ-PONTRENDSZER

A futási kép az alapbeállításokkal:

A táblázat első oszlopa az otthon lejátszott meccsek Élő-pontszámat tartalmazza
csapatokra lebontva és névsor szerint rendezve. A második oszlop szintén a hazai Élő-pontszámok, csak most érték szerint rangsorolva. A harmadik és negyedik
oszlop pedig, az idegenben lejátszott mérkőzések Élő-pontszámat mutatja hasonló
rendezésben, mint az első két oszlopban.

3.6. Eredmény meghatározás
Ebben a részben a bajnokságból hátralévő mérkőzések végkimenetelét próbáltam meghatározni az Élő-pontrendszer segítségével. Itt a korábban alkalmazott
programot fejlesztettem tovább. Az előzőleg kiszámolt Élő-pontokat vettem figyelembe, valamint minden csapatnál az otthon illetve idegenben elért góljainak
a listáját. Egy adott meccs eredményét úgy konstruáltam, hogy összehasonlítottam a hazai csapat aktuális Élő-pontszámát a vendég csapat aktuális Élőpontszámával. Ha a hazaiaké lényegesen nagyobb (alapesetben a különbség 75
pontnál nagyobb), akkor valószínűleg ők fognak győzni. A konkrét eredményhez, vettem a csapatok átlag gólszámát (mindkét esetben), és az otthon játszó
együttesnél kitoltam a határokat felfelé, míg az idegenben játszónál csökkentettem, és a program ezen intervallumokból generál egy-egy számot. Ha a vendégeké
a lényegesen nagyobb, akkor ugyanez az eljárás, csak pepitában. Ha a két Élőpontszám viszonylag közel van egymáshoz (a különbség 75 ponton belül van),3.6. EREDMÉNY MEGHATÁROZÁS

23

akkor a két csapat átlagban szerzett góljai számának a halmazát azonos mértékben módosítom, és innen kapjuk a végkimenetelt. A program minden mérkőzés
után frissül, azaz az eredmények hozzáadódnak a szerzett gólok listájához, és újátlagok keletkeznek, valamint az Élő-pontok is újra számolódnak.

24

FEJEZET 3. ÉLŐ-PONTRENDSZER

3.7. Program és Programkód 2
A programkód:

cs=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]!=’HomeTeam’:
cs=cs+[k[3]]L0=list(Set(cs))
L=sorted(L0)e=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[0]:e=e+[ZZ(k[5])]E0=list(Set(e))
E=sorted(E0)e1=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[1]:e1=e1+[ZZ(k[5])]E01=list(Set(e1))
E1=sorted(E01)e2=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[2]:e2=e2+[ZZ(k[5])]E02=list(Set(e2))
E2=sorted(E02)e3=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:3.7. PROGRAM ÉS PROGRAMKÓD 2

if k[3]==L[3]:e3=e3+[ZZ(k[5])]E03=list(Set(e3))
E3=sorted(E03)e4=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[4]:e4=e4+[ZZ(k[5])]E04=list(Set(e4))
E4=sorted(E04)e5=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[5]:e5=e5+[ZZ(k[5])]E05=list(Set(e5))
E5=sorted(E05)e6=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[6]:e6=e6+[ZZ(k[5])]E06=list(Set(e6))
E6=sorted(E06)e7=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[7]:e7=e7+[ZZ(k[5])]E07=list(Set(e7))
E7=sorted(E07)e8=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[8]:

25

26

FEJEZET 3. ÉLŐ-PONTRENDSZER

e8=e8+[ZZ(k[5])]E08=list(Set(e8))
E8=sorted(E08)e9=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[9]:e9=e9+[ZZ(k[5])]E09=list(Set(e9))
E9=sorted(E09)e10=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[10]:e10=e10+[ZZ(k[5])]E010=list(Set(e10))E10=sorted(E010)
e11=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[11]:e11=e11+[ZZ(k[5])]E011=list(Set(e11))
E11=sorted(E011)
e12=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[12]:e12=e12+[ZZ(k[5])]E012=list(Set(e12))E12=sorted(E012)
e13=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[13]:e13=e13+[ZZ(k[5])]3.7. PROGRAM ÉS PROGRAMKÓD 2

E013=list(Set(e13))
E13=sorted(E013)
e14=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[14]:e14=e14+[ZZ(k[5])]E014=list(Set(e14))
E14=sorted(E014)
e15=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[15]:e15=e15+[ZZ(k[5])]E015=list(Set(e15))
E15=sorted(E015)
e16=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[16]:e16=e16+[ZZ(k[5])]E016=list(Set(e16))
E16=sorted(E016)
e17=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[17]:e17=e17+[ZZ(k[5])]E017=list(Set(e17))
E17=sorted(E017)
e18=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[18]:e18=e18+[ZZ(k[5])]E018=list(Set(e18))

27

28

FEJEZET 3. ÉLŐ-PONTRENDSZER

E18=sorted(E018)
e19=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[3]==L[19]:e19=e19+[ZZ(k[5])]E019=list(Set(e19))
E19=sorted(E019)
EJ0=[e,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19]
EJ=[E,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,
E18,E19]
HG=[[L[k],EJ[k]] for k in [0..19]]e=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[0]:e=e+[ZZ(k[6])]E0=list(Set(e))
E=sorted(E0)e1=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[1]:e1=e1+[ZZ(k[6])]E01=list(Set(e1))
E1=sorted(E01)e2=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[2]:e2=e2+[ZZ(k[6])]E02=list(Set(e2))
E2=sorted(E02)e3=[]

3.7. PROGRAM ÉS PROGRAMKÓD 2

import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[3]:e3=e3+[ZZ(k[6])]E03=list(Set(e3))
E3=sorted(E03)e4=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[4]:e4=e4+[ZZ(k[6])]E04=list(Set(e4))
E4=sorted(E04)e5=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[5]:e5=e5+[ZZ(k[6])]E05=list(Set(e5))
E5=sorted(E05)e6=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[6]:e6=e6+[ZZ(k[6])]E06=list(Set(e6))
E6=sorted(E06)e7=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[7]:e7=e7+[ZZ(k[6])]E07=list(Set(e7))
E7=sorted(E07)e8=[]import csv

29

30

FEJEZET 3. ÉLŐ-PONTRENDSZER

a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[8]:e8=e8+[ZZ(k[6])]E08=list(Set(e8))
E8=sorted(E08)e9=[]import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[9]:e9=e9+[ZZ(k[6])]E09=list(Set(e9))
E9=sorted(E09)e10=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[10]:e10=e10+[ZZ(k[6])]E010=list(Set(e10))E10=sorted(E010)
e11=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[11]:e11=e11+[ZZ(k[6])]E011=list(Set(e11))
E11=sorted(E011)
e12=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[12]:e12=e12+[ZZ(k[6])]E012=list(Set(e12))E12=sorted(E012)
e13=[]
import csv
a = csv.reader(open(’E0.csv’))3.7. PROGRAM ÉS PROGRAMKÓD 2

for k in a:
if k[4]==L[13]:e13=e13+[ZZ(k[6])]E013=list(Set(e13))
E13=sorted(E013)
e14=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[14]:e14=e14+[ZZ(k[6])]E014=list(Set(e14))
E14=sorted(E014)
e15=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[15]:e15=e15+[ZZ(k[6])]E015=list(Set(e15))
E15=sorted(E015)
e16=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[16]:e16=e16+[ZZ(k[6])]E016=list(Set(e16))
E16=sorted(E016)
e17=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[17]:e17=e17+[ZZ(k[6])]E017=list(Set(e17))
E17=sorted(E017)
e18=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:

31

32

FEJEZET 3. ÉLŐ-PONTRENDSZER

if k[4]==L[18]:e18=e18+[ZZ(k[6])]E018=list(Set(e18))
E18=sorted(E018)
e19=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:
if k[4]==L[19]:e19=e19+[ZZ(k[6])]E019=list(Set(e19))
E19=sorted(E019)
EJA0=[e,e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19]
EJA=[E,E1,E2,E3,E4,E5,E6,E7,E8,E9,E10,E11,E12,E13,E14,E15,E16,E17,
E18,E19]
AG=[[L[k],EJA[k]] for k in [0..19]]
hcs=[]
import csv
a = csv.reader(open(’S_jo.csv’))for k in a:
if k[2]!=’Home Team’:
hcs=hcs+[k[2]]vcs=[]
import csv
a = csv.reader(open(’S_jo.csv’))for k in a:
if k[3]!=’Away Team’:
vcs=vcs+[k[3]]ph=[[hcs[k],vcs[k]] for k in [0..len(hcs)-1]]
html("<h2 align=center>ÉLŐ pontszámítás</h2>")@interact(layout=[[’K’],[’gk’]])def sliders(K=slider(10,30,1, label=’gólkülönbségi szorzó’,default=20),
gk=slider(0,800,50, label=’gólkülönbségi osztó’,default=300)):cs=[]
import csv
a = csv.reader(open(’E0.csv’))3.7. PROGRAM ÉS PROGRAMKÓD 2

33

for k in a:
if k[3]!=’HomeTeam’:
cs=cs+[k[3]]L0=list(Set(cs))
L=sorted(L0)H=[[k,1500] for k in L]
A=[[k,1500] for k in L]
c=10
d=400
#K=20
import csv
a = csv.reader(open(’E0.csv’))
y=[]
YH=[]
for k in a:
if k[3]!=’HomeTeam’:
y=y+[k[3]]lh=H[L.index(k[3])][1]la=A[L.index(k[4])][1]hg=k[5]ag=k[6]
if k[7]==’H’:
x=1
z=0
YH=1/(1+c^((la-lh)/d))
YA=1-YH
elif k[7]==’A’:
x=0
z=1
YH=1/(1+c^((la-lh)/d))
YA=1-YH
else:
x=0.5
z=0.5
YH=1/(1+c^((la-lh)/d))
YA=1-YH
H[L.index(k[3])][1]=round(lh+K*(x-YH))+round(ZZ(hg)*la/gk)
A[L.index(k[4])][1]=round(la+K*(z-YA))+round(ZZ(ag)*lh/gk)
print(H)print(A)
HR=sorted(H, key=lambda tup: -tup[1] )34

FEJEZET 3. ÉLŐ-PONTRENDSZER

AR=sorted(A, key=lambda tup: -tup[1] )T=[(H[k][0],H[k][1],HR[k][0],HR[k][1],A[k][0],A[k][1],AR[k][0],AR[k][1]) for k in [0..len(H)-1]]#pretty_print(table(rows=T,frame=True))
HG0=[[L[k],EJ0[k]] for k in [0..19]]
AG0=[[L[k],EJA0[k]] for k in [0..19]]
dPL={L[0]:[HG0[0],AG0[0]],L[1]:[HG0[1],AG0[1]],L[2]:[HG0[2],AG0[2]],L[3]:[HG0[3],AG0[3]],L[4]:[HG0[4],AG0[4]],L[5]:L[8]:[HG0[8],AG0[8]],L[9]:[HG0[9],AG0[9]],L[10]:[HG0[10],AG0[10]],L[11]:[HG0[11],AG0[11]],L[12]:[HG0[12],AG0[12]],
L[13]:[HG0[13],AG0[13]],L[14]:[HG0[14],AG0[14]],L[15]:AG0[7]],L[18]:[HG0[18],AG0[18]],L[19]:[HG0[19],AG0[19]]}
szamossaghg2=[len(dPL[L[k]][0][1]) for k in [0..19]]
szamossagag2=[len(dPL[L[k]][1][1]) for k in [0..19]]
osszeghg2=[sum([ZZ(s) for s in dPL[L[k]][0][1]]) for k in [0..19]]
osszegag2=[sum([ZZ(s) for s in dPL[L[k]][1][1]]) for k in [0..19]]
atlagh2=[[L[k],((osszeghg2[k]/szamossaghg2[k]).round("toward"))]for k in [0..19]]
atlaga2=[[L[k],((osszegag2[k]/szamossagag2[k]).round("toward"))]for k in [0..19]]
hgol=[]
vgol=[]
H=[[’Arsenal’, 1646], [’Aston Villa’, 1579], [’Bournemouth’,1565], [’Brighton’, 1591], [’Burnley’, 1602], [’Chelsea’,1594], [’Crystal Palace’, 1559], [’Everton’, 1624],[’Leicester’, 1661], [’Liverpool’, 1775], [’Man City’, 1713],[’Man United’, 1663], [’Newcastle’, 1583], [’Norwich’, 1549],[’Tottenham’, 1664], [’Watford’, 1556], [’West Ham’, 1562],
A=[[’Arsenal’, 1565], [’Aston Villa’, 1514], [’Bournemouth’,1492], [’Brighton’, 1532], [’Burnley’, 1561], [’Chelsea’,1655], [’Crystal Palace’, 1553], [’Everton’, 1567],[’Leicester’, 1660], [’Liverpool’, 1733], [’Man City’, 1710],[’Man United’, 1563], [’Newcastle’, 1518], [’Norwich’, 1470],[’Tottenham’, 1573], [’Watford’, 1518], [’West Ham’, 1522],
c=10
d=400
cs=[]
import csv
a = csv.reader(open(’E0.csv’))for k in a:3.7. PROGRAM ÉS PROGRAMKÓD 235

if k[3]!=’HomeTeam’:
cs=cs+[k[3]]L0=list(Set(cs))
L=sorted(L0)for h in [0..len(ph)-1]:
for k in [0..len(H)-1]:
for i in [0..len(H)-1]:
if ph[h][0]==H[k][0] and ph[h][1]==A[i][0]:b=ZZ(H[k][1])-ZZ(A[i][1])#print(b)#print H[k][0],A[i][0]if b>75:#print(1)hgol=hgol+[ZZ.random_element(((ZZ(atlagh2[k][1]))*(1/2)).round("toward"),2*ZZ(atlagh2[k][1])+1)]
vgol=vgol+[ZZ.random_element(0,((ZZ(atlaga2[i][1]))*(3/2)+1).
round("toward"))]elif b<-75:#print(2)hgol=hgol+[ZZ.random_element(0,((ZZ(atlagh2[k][1]))*(3/2)+1).
round("toward"))]vgol=vgol+[ZZ.random_element(((ZZ(atlaga2[i][1])*((1/2)).round("toward"),2*ZZ(atlaga2[i][1])+1)]
else:#print(3)hgol=hgol+[ZZ.random_element((ZZ(atlagh2[k][1])*(1/2)).round("toward"),(ZZ((atlagh2[k][1]))*(3/2)+1).
round("toward"))]vgol=vgol+[ZZ.random_element((ZZ(atlaga2[i][1])*(1/2)).round("toward"),((3/2)*ZZ(atlaga2[i][1])+1).round("toward"))]lh=H[L.index(ph[h][0])][1]la=A[L.index(ph[h][1])][1]
if ZZ(hgol[h])>ZZ(vgol[h]):
x=1
z=0

36

FEJEZET 3. ÉLŐ-PONTRENDSZER

YH=1/(1+c^((la-lh)/d))
YA=1-YH
elif ZZ(hgol[h])<ZZ(vgol[h]):x=0z=1
YH=1/(1+c^((la-lh)/d))
YA=1-YH
else:
x=0.5
z=0.5
YH=1/(1+c^((la-lh)/d))
YA=1-YH
H[L.index(ph[h][0])][1]=round(lh+K*(x-YH))+round(ZZ(hgol[h])*la/gk)
A[L.index(ph[h][1])][1]=round(la+K*(z-YA))+round(ZZ(vgol[h])*lh/gk)
print hgol
print vgol
print (H)print (A)html("<h2 align=center>Az új Élő-pontszámok</h2>")
HR=sorted(H, key=lambda tup: -tup[1] )AR=sorted(A, key=lambda tup: -tup[1] )T=[(H[k][0],H[k][1],HR[k][0],HR[k][1],A[k][0],A[k][1],AR[k][0],AR[k][1]) for k in [0..len(H)-1]]
pretty_print(table(rows=T,frame=True))
html("<h3 align=center>27. forduló</h3>")
T2=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [0..0]]pretty_print(table(rows=T2,frame=True))
html("<h3 align=center>28. forduló</h3>")
T3=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [1..10]]
pretty_print(table(rows=T3,frame=True))
html("<h3 align=center>29. forduló</h3>")
T4=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [11..20]]
pretty_print(table(rows=T4,frame=True))
html("<h3 align=center>30. forduló</h3>")
T5=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [21..30]]
pretty_print(table(rows=T5,frame=True))
html("<h3 align=center>31. forduló</h3>")
T6=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [31..40]]
pretty_print(table(rows=T6,frame=True))3.7. PROGRAM ÉS PROGRAMKÓD 237

html("<h3 align=center>32. forduló</h3>")
T7=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [41..50]]
pretty_print(table(rows=T7,frame=True))
html("<h3 align=center>33. forduló</h3>")
T8=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [51..60]]
pretty_print(table(rows=T8,frame=True))
html("<h3 align=center>34. forduló</h3>")
T9=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [61..70]]
pretty_print(table(rows=T9,frame=True))
html("<h3 align=center>35. forduló</h3>")
T10=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [71..80]]
pretty_print(table(rows=T10,frame=True))
html("<h3 align=center>36. forduló</h3>")
T11=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [81..90]]
pretty_print(table(rows=T11,frame=True))
html("<h3 align=center>37. forduló</h3>")
T12=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [91..100]]pretty_print(table(rows=T12,frame=True))
html("<h3 align=center>38. forduló</h3>")
T13=[(ph[k][0],hgol[k],vgol[k],ph[k][1]) for k in [101..110]]pretty_print(table(rows=T13,frame=True))

38

FEJEZET 3. ÉLŐ-PONTRENDSZER

A 27. fordulóból hátra lévő mérkőzés eredménye:

Illetve a további fordulók eredménye:3.7. PROGRAM ÉS PROGRAMKÓD 2

39

40

A futási kép az alapbeállításokkal:

A bajnokság végén kapott Élő-pontszámok.

FEJEZET 3. ÉLŐ-PONTRENDSZER

41

3.7. PROGRAM ÉS PROGRAMKÓD 2

A korábban lejátszott mérkőzések végkimeneteleiből és az általam generált
eredményekből készült bajnoki tabella (egyben végeredmény):Helyezés
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

Csapatok
Liverpool
Man City
LeicesterChelsea
Tottenham
Man United
ArsenalSheffield United
WolvesEvertonBurnleySouthampton
Crystal Palace
Newcastle
West Ham
Brighton
Bournemouth
Watford
Aston Villa
Norwich

LM
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38
38

GY
35
25
24
19
16
14
13
12
11
13
13
12
10
11
11
7
8
6
8
5

D
3
6
7
8
13
13
15
14
16
9
9
10
15
12
6
16
12
13
7
11

V
0
7
7
11
9
11
10
12
11
16
16
16
13
15
21
15
18
19
23
22

LG
102
99
87
62
48
52
51
33
44
43
36
38
32
32
43
40
36
30
39
27

KG
22
39
37
45
43
37
47
36
42
55
52
53
49
51
63
54
60
60
71
63

GK
80
60
50
17
5
15
4
-3
2
-12
-16
-15
-17
-19
-20
-14
-24
-30
-32
-36

Pontszám
108
81
79
65
61
55
54
50
49
48
48
46
45
45
39
37
36
31
31
26

42

FEJEZET 3. ÉLŐ-PONTRENDSZER

Illetve még néhány újabb szimuláció után kapott Élő-pontszámok és tabellák:

3.7. PROGRAM ÉS PROGRAMKÓD 2

43

44

FEJEZET 3. ÉLŐ-PONTRENDSZER

Irodalomjegyzék[1] Sergey Brin and Lawrence Page. The anatomy of a large-scale hypertextual web
search engine. Computer Networks, 30:107–117, 1998.
[2] Lars Magnus Hvattum and Halvard Arntzen. Using elo ratings for match result
prediction in association football. International Journal of Forecasting, 26(3):460 –
470, 2010. Sports Forecasting.
[3] Amy N. Langville and Carl D. Meyer. Google’s PageRank and beyond: the science of
search engine rankings. Princeton University Press, Princeton, NJ, 2012. Paperback
edition of the 2006 original.
[4] Gustav Šourek Ondřej Hubáček and Filip Železný. Score-based soccer match outcome
modeling - an experimental review. In MathSport International 2019 Conference,
pages 164–172, Athens, Greece, July 2019.
[5] Kenneth
Shum.
Notes
on
pagerank
algorithm,
http://home.ie.cuhk.edu.hk/ wkshum/papers/pagerank.pdf.

March

2013.

[6] W. A. Stein et al. Sage Mathematics Software (Version 9.0). The Sage Development
Team, 2020. http://www.sagemath.org.
[7] Wikipédia. Élő-pontrendszer – wikipédia, 2018. https://hu.wikipedia.org/wiki/%C3%89l%C5%91-pontrendszer.
[8] Wikipédia. Élő Árpád – wikipédia, 2018. https://hu.wikipedia.org/wiki/%C3%
89l%C5%91_%C3%81rp%C3%A1d.

45