Not logged inCSS-Forum
Forum CSS-Online Help Search Login
CSS-Shop Impressum Datenschutz
Up Topic Hauptforen / CSS-Forum / Turnier Spieler Platz Wahrscheinlichkeit - Simulation
- - By Benno Hartwig Date 2013-11-04 18:28
Tom hatte in dem inzwischen geschlossenen Thread 'Turnier Spieler Platz Wahrscheinlichkeit' die Frage gestellt:

Zitat:
Gibt es ein Programm welches berechnen kann mit welcher Wahrscheinlichkeit Spieler X bei einem Turnier auf Platz 1, 2, 3, ...10 kommen kann?

Z.B.:
10 Spieler jeder gegen jeden.
Erster Spieler 1000 ELO.
Zweiter Spieler 1050 ELO.
...1100.
...1150 usw.

Nach 1, 2, 3, usw. Partien hat Spieler X ...Siege, ...Unentschieden, ...Niederlagen und eine Wahrscheinlichkeit von ...% auf Platz 1, 2, 3,-10.

Und das auch mit verschiedenen Feinwertungen als Option?
Ohne die Schach-ELO-Grundsatzdebatte des geschlossenen Threads wieder aufwärmen zu wollen, will ich hier die Frage doch noch rein mathematisch beantworten, einfach als Ergebnis einer stochastischen Simulation. Was dieses Ergebnis dann ggf. mit Wettkämpfen zu tun haben könnte, oder mit Wahrscheinlichkeiten für einzelne Ergebnisse, kann dann ja jeder für sich entscheiden.

Das Script simuliert jeder-gegen-jeden-Turniere, jeweils ausgewertet nach Sonneborn-Berger. Die jeweilige Teilnehmer-Spielstärke wird durch eine Zahl beschrieben (und ich würde sie schon gern 'ELO'-Zahl nennen ). Diese 'ELO'-Zahlen sind gleichmäßig so verteilt, wie es Tom skizzierte.

Die Ergebniswahrscheinlichkeiten der einzelnen Partie hängen dann von der Differenz dieser 'ELO'-Zahlen ab, gemäß der der ELO-Systematik zugrunde liegenden Formel:
Erwartung = 1 / (1 + 10^((ELO2-ELO1)/400))
Die Remis-Wahrscheinlichkeit schätze ich (frech und etwas willkürlich) so, dass ich bei gleicher ELO-Zahl eine Wahrscheinlichkeit (z.B. 0,6) zugrunde lege, und mit steigender Überlegenheit einer Seite nimmt die Remiswahrscheinlichkeit dann linear ab. (ggf. verbesserungswürdig? Mag sein.)

Diese Simulation lasse ich dann recht oft Durchlaufen (z.B. 100.000 mal, dauert ca. eine Minute), und das Script zählt mit, wie oft jeder Spieler auf welchem Platz landete.

Das Ergebnis für 10 Teilnehmer und 1 Mio Durchläufe bei maximaler Remiswahrscheinlichkeit 0,6 poste ich mir gleich als Atwort.
Und auch das Skript selbst mit einer kleinen Anleitung.

Wer Lust hat kann dann selbst mit anderen Teilnehmerzahlen experimentieren, anderen 'ELO'-Verteilungen, anderen Remis-Wahrscheinlichkeiten (Bei Blitz-Turnieren und schwächeren Teilnehmern treten ggf. doch deutlich weniger Remisen auf)

Benno

Parent - - By Benno Hartwig Date 2013-11-04 18:51
Eine Simulation über 1.000.000 Durchläufe bei 10 Teilnehmern mit den 'ELO'-Werten 1000, 1050, 1100,... 1450 und der maximalen Remiswahrscheinlichkeit 0,6 ergab

Code:
Anzahl der Platzbelegungen
Sp \ Platz     1      2      3      4      5      6      7      8      9     10
-------------------------------------------------------------------------------
   1 1000     12     78    409   1941   7086  21840  57129 127726 257806 525973
   2 1050     68    378   1747   6408  19784  51180 112424 208431 324442 275138
   3 1100    306   1549   6050  18345  48492 106510 192558 276617 223254 126319
   4 1150   1352   5984  18483  47898 104515 188969 262929 201958 118302  49610
   5 1200   5436  18869  48865 105155 188878 260171 193917 111006  50962  16741
   6 1250  17971  50842 108191 191797 260222 191712 107345  48937  18142   4841
   7 1300  51256 116533 199463 263737 191407 105522  47835  17773   5354   1120
   8 1350 126152 221327 278177 194780 106429  48062  17990   5545   1321    217
   9 1400 273340 326937 209404 112305  50900  19106   6009   1610    355     34
  10 1450 524107 257503 129211  57634  22287   6928   1864    397     62      7

Schaetzung der Wahrscheinlichkeiten in %
Sp \ Platz     1      2      3      4      5      6      7      8      9     10
-------------------------------------------------------------------------------
   1 1000      0   0,01   0,04   0,19   0,71   2,18   5,71  12,77  25,78   52,6
   2 1050   0,01   0,04   0,17   0,64   1,98   5,12  11,24  20,84  32,44  27,51
   3 1100   0,03   0,15    0,6   1,83   4,85  10,65  19,26  27,66  22,33  12,63
   4 1150   0,14    0,6   1,85   4,79  10,45   18,9  26,29   20,2  11,83   4,96
   5 1200   0,54   1,89   4,89  10,52  18,89  26,02  19,39   11,1    5,1   1,67
   6 1250    1,8   5,08  10,82  19,18  26,02  19,17  10,73   4,89   1,81   0,48
   7 1300   5,13  11,65  19,95  26,37  19,14  10,55   4,78   1,78   0,54   0,11
   8 1350  12,62  22,13  27,82  19,48  10,64   4,81    1,8   0,55   0,13   0,02
   9 1400  27,33  32,69  20,94  11,23   5,09   1,91    0,6   0,16   0,04      0
  10 1450  52,41  25,75  12,92   5,76   2,23   0,69   0,19   0,04   0,01      0

Anzahl Durchlaeufe: 1000000


Die 5984 in der ersten Tabelle bedeutet beispielsweise:
Der Spieler '4' mit 'ELO'-Wert 1150 hat genau 5984 mal den Tabellenplatz 2 belegt.
Die 2. Tabelle erklärt dann, dass dies also mit der geschätzten Wahrscheinlichkeit 0,6% auftritt

Es ist eine Simulation, insofern sind die Werte nicht exakt. Die Genauigkeit lässt sich aber abschätzen, wenn man die Werte für gleiche Wahrscheinlichkeiten vergleicht (hier also "Der Stärkste wird 1." (52,41%) und "Der Schwächste wird letzter" (52,6%). Einigermaßen genau ist es wohl schon)

Dass der Stärkste nicht 1. wird, passiert doch recht häufig. Es passiert sogar tatsächlich (wenn auch nur sehr selten), dass er letzter wird.

Das Script kann auch Turniere mit größeren Teilnehmerzahlen simulieren (mehrere Hundert)). Nur geht die Teilnehmerzahl quadratisch in die Laufzeit ein, sodass man in erträglicher Zeit nur deutlich weniger Turniere simuliert bekommt.

Benno
Parent - - By chess player Date 2013-11-05 08:19
Hallo Benno,

eine sehr schöne Zahlenspielerei!

Nur dass es für mich völlig unwahrscheinlich ist, dass ein 1450er Spieler in so einem Spielerfeld sieben mal letzter werden soll.
Welche Parameter müssten verändert werden damit so ein Ereignis nicht mehr vorkommen kann?

Anzahl der Platzbelegungen
Sp \ Platz     1      2      3      4      5      6      7      8      9     10
-------------------------------------------------------------------------------
10 1450 524107 257503 129211  57634  22287   6928   1864    397     62      7
Parent - - By Benno Hartwig Date 2013-11-05 13:58 Edited 2013-11-05 14:01
[quote="chess player"]Nur dass es für mich völlig unwahrscheinlich ist, dass ein 1450er Spieler in so einem Spielerfeld sieben mal letzter werden soll.
Welche Parameter müssten verändert werden damit so ein Ereignis nicht mehr vorkommen kann?[/quote]Sofern man davon ausgeht, dass auch der stärkste Spieler die einzelne Partie mit einer Wahrscheinlichkeit >0 gegen den schwächsten verlieren kann (das ELO-System geht AFAIK davon aus!), wird die Wahrscheinlichkeit dafür, dass der Stärkste letzter wird, auch immer >0 sein.

Wenn du genügend derartige Turniere veranstaltest, dann wird solch ein Ereignis irgendwann zu erwarten sein.
Nur ist diese Wahrscheinlichkeit sooo klein, dass sie für den praktischen Betrieb mit 0 gleichgesetzt werden kann. 7 auf eine Million bedeutet ja auch, wenn ich 1000 Turniere mache habe ich nur die Wahrscheinlichket 0,007 dass das auch nur in einem Turnier irgendwann passiert.

Wenn du die ELO-Differenzen aber verkleinerst (20, oder 10 oder so), dann wird die Wahrscheinlichkeit für "Der Stärkste wird letzter" auch deutlich steigen.

Benno
Parent - By chess player Date 2013-11-06 08:39
Zitat:
Wenn du die ELO-Differenzen aber verkleinerst (20, oder 10 oder so), dann wird die Wahrscheinlichkeit für "Der Stärkste wird letzter" auch deutlich steigen.


Gilt diese Aussage auch dann noch wenn zwischen dem Elostärksten und Eloschwächsten
die oben genannte Elodifferenz von 450 Punkten bestehen bleibt?
Nur dann ist so eine Aussage sinnvoll.
Parent - By Benno Hartwig Date 2013-11-04 19:08
Und hier noch das Script, bei mir gespeichert als 'Platzwahrscheinlicheit.vbs'

Code:
' #########################################################################
' # Platzwahrscheinlichkeit.vbs                                           #
' # Simulation zur Abschaetzung der Wahrscheinlichkeiten fuer das         #
' # Belegen einzelner Plätze in anz-rundigen jeder-gegen-jeden-Turnieren  #
' #########################################################################

' #### Simulationsparameter
' #########################################################################

' # Anzahl Teilnehmer und Runden
anz=10

' # Anzahl Simulationsdurchlaeufe
durchlaeufe=3000

' # Remisbreite bei gleichstarken Spielern
maxremis=0.6

' # regelmaessiger ELO-Abstand der Spieler
elodiff=50

' #########################################################################

' # Fortschrittsanzeige-Intervall
anzeigeintervall=100

dim staerke(1000)
dim erg(1000,1000)
dim punkte(1000)
dim SB(1000)
dim platz(1000)
dim anzplatz(1000,1000)
dim anzdl

set FSO=createObject ( "Scripting.FileSystemObject")
set aus=FSO.openTextfile("Platzwahrscheinlichkeit.txt",2,true)

init

for a=1 to durchlaeufe
if a mod anzeigeintervall= 0 then
   wscript.stdout.write a & chr(13)
end if
do_turnier
sort
update
' show_turnier
' wscript.echo
next
show_anzahl
show_wahrsch
aus.close
wscript.echo "fertig"

function init
randomize
for i=1 to anz
  staerke(i)=1000+(i-1)*elodiff
  for j=1 to anz
   anzplatz(i,j)=0
  next
next
anzdl=0
end function

function do_turnier
for i=1 to anz-1
  for j=i+1 to anz
   partie i,j
  next
next
end function

function update
for i=1 to anz
  anzplatz(i,platz(i))=anzplatz(i,platz(i))+1
next
anzdl=anzdl+1
end function

function sort
' ##### Punkte bestimmen
for i=1 to anz
  punkte(i)=0
  for j=1 to anz
   punkte(i)=punkte(i)+erg(i,j)
  next
next
' ##### Sonneborn-Berger bestimmen
for i=1 to anz
  SB(i)=0
  for j=1 to anz
   if erg(i,j)=2 then
    SB(i)=SB(i)+punkte(j)
   end if
   if erg(i,j)=1 then
    SB(i)=SB(i)+punkte(j)/2
   end if
  next
next
' ##### Platz bestimmen
for i=1 to anz
  g=0
  for j=1 to anz
   if besser(i,j) then
    g=g+1
   end if
  next
  platz(i)=anz-g
next
end function

function besser(i,j)
if punkte(i)>punkte(j) then
  besser=true
elseif punkte(i)=punkte(j) then
  if SB(i)>SB(j) then
   besser=true
  elseif SB(i)=SB(j) and i>j then
   besser=true
  else
   besser=false
  end if
else
  besser=false
end if
end function

function show_turnier
for i=1 to anz
  s= formr(i,2) & formr(staerke(i),5)
  for j=1 to anz
   s = s & formr(erg(i,j),2)
  next
  s = s & formr(punkte(i),5) & formr(platz(i),3) & formr(SB(i),5)
  wscript.echo s
next
end function

function show_anzahl
aus.writeline "Anzahl der Platzbelegungen"

s="Sp\Platz"
for j=1 to anz
  s = s & formr(j,7)
next
aus.writeline s
aus.writeline string(9+anz*7,"-")

for i=1 to anz
  s= formr(i,3) & formr(staerke(i),5)
  for j=1 to anz
   s = s & formr(anzplatz(i,j),7)
  next
  aus.writeline s
next
aus.writeline "Anzahl Durchlaeufe: " & anzdl
aus.writeline
end function

function show_wahrsch
aus.writeline "Schaetzung der Wahrscheinlichkeiten in %"

s="Sp\Platz"
for j=1 to anz
  s = s & formr(j,7)
next
aus.writeline s
aus.writeline string(9+anz*7,"-")

for i=1 to anz
  s= formr(i,3) & formr(staerke(i),5)
  for j=1 to anz
   s = s & formr(round(anzplatz(i,j)/anzdl*100,2),7)
  next
  aus.writeline s
next
aus.writeline "Anzahl Durchlaeufe: " & anzdl
aus.writeline
end function

function formr(s,n)
formr=right(space(22)&s,n)
end function

function partie(i,j)
erf=1/(1+10^((staerke(i)-staerke(j))/400))
if erf <=0.5 then
  arembrh=erf*maxremis
else
  arembrh=(1-erf)*maxremis
end if
p1=erf-arembrh
p2=erf+arembrh

r=rnd
if r>p2 then
  erg(i,j)=2
  erg(j,i)=0
elseif r<=p1 then
  erg(i,j)=0
  erg(j,i)=2
else
  erg(i,j)=1
  erg(j,i)=1
end if
end function


und ein Start-Batch, bei mir gespeichert als: Platzwahrscheinlicheit.bat

Code:
@echo off
echo %date% %time%
cscript /nologo Platzwahrscheinlicheit.vbs
echo %date% %time%
notepad Platzwahrscheinlichkeit.txt
pause


Gestartet wird das Script per Doppelklich auf den Starter-Batch.
Das Ergebnis wird dann abgelegt in: Platzwahrscheinlichkeit.txt
Up Topic Hauptforen / CSS-Forum / Turnier Spieler Platz Wahrscheinlichkeit - Simulation

Powered by mwForum 2.29.3 © 1999-2014 Markus Wichitill