...ein bisschen was...
OK. Ab sofort kann ich wieder ruhiger schlafen und muss mir keine Gedanken mehr machen, dass sich bei mir zu viele Dartsets angesammelt hätten. ![]()
...ein bisschen was...
OK. Ab sofort kann ich wieder ruhiger schlafen und muss mir keine Gedanken mehr machen, dass sich bei mir zu viele Dartsets angesammelt hätten. ![]()
Bei Humphries sieht das immer so unglaublich leicht aus, wie er wirft.
Das ist die Streeuung der Leg-Averages von 100000 Legs bei Average=40
Schön normalverteilt.
Nun dachte ich an einen Fehler im Programm, als ich die Verteilung bei Average=120 gesehen habe:
40 1
50 4
60 55
70 190
80 760
90 1649
100 16236
110 23637
120 31537
130 23892
140 0
150 1841
160 198
170 0
Alles anzeigen
Warum gab es keine Averages im Bereich 140-150?
Dann würde mir aber klar, warum. ![]()
Bei einem guten Dartsspieler ist das Trefferbild wohl durchaus gut mit einer Gaußverteilung zu beschreiben. Sein Wurf ist gut genug, dass er technisch in der Lage ist, das anvisierte Ziel zu treffen. Aber Unsauberkeiten führen zu einer statistischen Streuung, die gut mit einer Gaußverteilung abgebildet werden kann.
Für einen schlechten Darter (Anfänger) gilt das nicht notwendigerweise. Hier ist das Trefferbild, aufgrund der unsauberen Technik, innerhalb eines Zielbereiches eher gleichverteilt. Nach außen hin fällt es dann natürlich auch ab. Aber nun hat man nicht mehr eine Verteilung um einen Punkt, sondern um einen Bereich
Man kann das modellieren, indem man der Normalverteilung zusätzlich noch eine zufällige Verschiebung überlagert, die unterhalb einer bestimmten Spielstärke einsetzt und dann mit sinkendem Level ansteigt.
Das scheint mir auch genau das zu sein, was in der Realität passiert. Die statistischen Abweichungen werden zusätzlich von einer einigermaßen gleichverteilten Streuung aufgrund schlechter Technik überlagert.
Also: Streuung = normale Wurfstreuung (Gauß. Haben alle) + Instabilität des Wurfzentrums (Gleichverteilt. Stärker je schlechter)
Das ist also kein mathematischer Cheat, sondern hat m.E. Fundament.
Das würde beide Probleme beheben, die ich beim Bot, bei geringer Spielstärke bemerkt habe:
1) Zu viele extrem weite Ausreißer über das normale Maß hinaus. (Die durch den "long tail", beim unverhältnismäßigen Anstieg der Standardabweichung resultieren, die bei der reinen Gaußverteilung nötig ist, um den Average entsprechend zu senken)
2) Andererseits das m.E. doch noch zu häufige Treffen in die T20. (Weil diese das Zentrum der Verteilung war)
Mal sehen was rauskommt. ![]()
Und bevor jemand fragt: Warum machst du das?
Na, just for fun ![]()
Interessant, was man alles so lern, wenn man sich mit sowas beschäftigt. ![]()
Der spielt prima, aber bei niedrigem Spiellevel wirkt das Ganze immer noch ein klein wenig unrealistisch. Die Gaußverteilung lies sich da irgendwie nicht gut in Einklang bringen mit den Averages und der Streuung.
Nun ist mir auch der Grund klar:
Ich habe die Quellenangabe zu einer Studie gefunden, die genau das belegt:
Ryan J. Tibshirani: "Where to aim on a dartboard"
Sie zeigt genau das: Gute Spieler zeigen eine klare Gaußkurve um das Ziel herum. Schlechte Spieler haben eine Trefferwolke, die im inneren Bereich flach und fast gleichmäßig verteilt ist. Erst am Rand dünnt es aus. In einem realistischen Bot sollte man das also im unteren Niveaubereich berücksichtigen.
Die Studie selbst habe ich noch nicht gefunden.
Ich hoffe die KI hat die Quelle nicht einfach erfunden. ![]()
![]()
Es gibt bei der Simulation auch einen hübschen, klaren Zusammenhang zwischen der Standardabweichung, nach der das Programm die Streuung der Würfe berechnet und dem resultierenden Average.
Ich habe für jede Standardabweichung in Millimeterschritten je 5000 Legs spielen lassen und dann den Gesamt-Average aus diesen Legs bestimmt.
Ist ein schöner hyperbolischer Zusammenhang: ![]()
Damit kann ich stufenlos aus dem gewünschten Level die nötige Standardabweichung errechnen und der Bot spielt dann im Mittel auch genau diesen Average und nicht irgendeine vage Spielstufe.
Wenn Du Deinen Bot mit einer bestimmten Einstellung lange genug auf die Felder werfen lässt, kannst Du hinterher sagen: Mit den Einstellungen trifft er ein Tripple zu x%, ein Single zu y% und ein Doppel zu z%. Und genau solche prozentualen Wahrscheinlichkeiten nutzen viele Dartbots (ich kenne drei, die mehr oder weniger den gleichen Algorithmus mit den gleichen Prozentwerten für bestimmte Stufen verwenden. Ich bin mir nicht sicher, ob Du solch einen Bot in Bezug auf eine "natürliche Simulation" von Deinem Bot unterscheiden könntest. Es ist halt nur viel einfacher, da Du keine Position berechnen musst und auf das Board mappen.
Ja, das kann man natürlich auch machen. Ist im Prinzip, das was ich mache, nur halt nicht bei jedem Wurf, sondern nur einmal vorher für viele Würfe und die Ergebnisse dann in Wahrscheinlichkeitstabellen gepackt.
Das sollte im Prinzip das gleiche Verhalten liefern und sich nicht groß unterscheiden.
Aber die zweidimensionale Gaußverteilung braucht man dort natürlich anfangs auch, um diese Tabellen überhaupt statistisch sinnvoll generieren zu können. Allerdings nicht notwendigerweise für das ganze Brett, da ja alle 20 Segmente die gleiche Stuktur haben.
Beim Runterscoren spielt er momentan tatsächlich nur auf T20. (Wie ich, lol) Ab 170 dann nach einer Standard-Checkouttabelle.
Aber ich kann natürlich auch noch ein bisschen Varianz reinbringen oder auch Botprofile (Solide, Hasadeur, 19-Werfer, Hin- und Herwechsler)
Hübsch, wenn der Bot auf niedrigem Level im Madhouse verzweifelt: ![]()
>bot 30
...
16 8 13 BUST
8 0 13 BUST
8 13 BUST
8 4 0 2
2 20 BUST
2 0 1 BUST
2 0 0 0
2 0 18 BUST
2 20 BUST
2 1 BUST
2 2 CHECK!
sdev=57 avrg=20
Alles anzeigen
Zehndarter war auch schon dabei:
Im Prinzip ist der "Leggenerator" nun fertig.
Ich könnte nun schnell und leicht ein paar tausend Legs der verschiedenen Spielstärken produzieren, die man dann in Apps reinkippen kann. ![]()
Ja, es gibt hier sicher mehrere Wege nach Rom. ![]()
Der Vergleich mit der Lottozahlentrommel hinkt aber. Ich simuliere ja nicht den Flug des Darts, sondern lasse auch nur einen Zufallsgenerator laufen. Nur ist das hier halt nicht gleichverteilt.
Wenn man ein einigermaßen realistisches Verhalten simulieren will, dann muss man schon einen etwas differenzierteren Ansatz wählen, als nur zu würfeln.
Aber die Idee von mdt echte Legs als Basis zu nehmen ist ja auch eine gute Idee dafür.
Inzwischen spielt er auch schon: ![]()
>bot 30
501 0 20 20
461 20 20 12
409 1 1 1
406 5 60 20
321 5 20 60
236 18 15 5
198 5 10 60
123 7 18 20
78 18 0 20
40 0 0 20
20 10 20 BUST
10 10 CHECK!
sdev=30 avrg=44
Alles anzeigen
Aber mein hauptsächliches Ziel ist es ja auch nicht, einen tollen, noch nie dagewesenen Bot zu konstruieren, sondern einfach nur Spaß an der Sache und am coden. ![]()
Da ich den Thread von mdt nicht zuspammen will lagere ich das mal aus:
Ich habe keine Ahnung nach welchem Algorithmus diese Bots so programmiert sind. Ich hatte aber schon länger mal vor, eine Engine zu erstellen, die den menschlichen Dartspieler auf natürlichere Art simuliert:
Der Bot "wirft" jeden Dart auf die gleichen Segmente, auf die auch ein Mensch werfen würde, beim Scoring und bei den Checkoutwegen.
Aus dem eingestellten Level ergibt sich dann eine Standardabweichung, wie genau er trifft und aus der Streuung dann das Segment in das er tatsächlich trifft.
Das sollte eine einigermaßen natürliche wirkende Simulation ergeben.Evtl. mache ich mich da tatsächlich mal dran. Aber es wäre dann keine App, sondern nur eine Engine, die man in eine App einbauen könnte. (Eingangsargumente: Zielsegment und Level, Returnwert: Getroffenes Segment)
Allerdings werden wohl die meisten heutzutage einfach Claude mit sowas beauftragen.
Ich bin einer dieser seltenen und seltsamen Menschen, die selbst programmieren wollen, weil das Coden der eigentliche Spaß an der Sache ist.
Aussterbende Art.
Ich habe mich tatsächlich mal ans Programmieren gemacht und das geht flotter als ich dachte (und macht Spaß)
Hier mal das was der Bot in 20 Würfen scored, wenn er auf die T20 und die D16 zielt, je nachdem welche Standardabweichung (=Spielstärke) ich angegeben habe:
shoot at T20
sdev=0mm: 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60 60
sdev=5mm: 20 60 60 60 60 60 60 60 60 60 60 60 20 60 20 60 60 60 60 60
sdev=10mm: 60 20 60 60 60 20 20 60 60 60 60 20 60 20 20 20 60 60 20 20
sdev=15mm: 20 20 20 60 20 1 20 20 60 1 20 20 20 60 20 60 20 20 60 20
sdev=20mm: 60 60 1 60 20 20 20 20 60 20 20 5 60 20 60 20 1 60 60 20
sdev=25mm: 20 20 1 20 20 1 20 60 1 15 1 20 20 20 20 20 20 18 1 20
sdev=30mm: 20 60 18 60 40 60 20 60 60 60 40 5 60 20 5 1 20 60 20 1
sdev=35mm: 36 1 20 20 20 1 20 18 20 60 9 60 20 20 60 1 20 1 1 20
sdev=40mm: 18 0 20 1 15 20 10 20 0 5 20 60 5 54 20 20 14 20 5 18
sdev=45mm: 20 5 1 9 0 12 0 40 20 12 20 60 20 1 12 20 5 18 5 20
sdev=50mm: 60 1 9 15 20 5 12 0 6 1 60 5 18 5 20 4 0 5 11 40
Alles anzeigen
shoot at D16
sdev=0mm: 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32 32
sdev=5mm: 32 16 32 16 32 32 16 32 32 32 16 32 32 16 32 16 32 32 32 32
sdev=10mm: 32 32 32 0 32 32 0 16 32 16 32 32 0 32 32 32 16 32 0 32
sdev=15mm: 8 16 16 32 32 32 16 32 0 16 32 32 0 16 0 0 32 0 32 32
sdev=20mm: 32 16 8 0 0 32 32 0 16 16 0 0 32 32 32 32 16 16 32 16
sdev=25mm: 8 0 8 32 32 32 16 0 0 32 16 32 32 32 0 11 0 0 0 0
sdev=30mm: 32 32 0 0 0 32 16 16 32 0 16 16 0 0 16 11 0 16 8 16
sdev=35mm: 8 8 32 0 16 0 32 0 0 0 0 0 8 0 8 8 8 0 32 32
sdev=40mm: 0 0 0 7 8 0 32 32 16 0 0 32 11 16 16 0 32 0 16 0
sdev=45mm: 8 24 0 16 16 0 16 16 0 32 0 16 8 32 7 0 16 0 0 0
sdev=50mm: 0 0 0 11 32 0 0 16 0 0 0 0 32 0 0 0 0 0 32 0
Alles anzeigen
Sieht schon mal nach einer einigermaßen natürlichen Streuung aus.
Evtl. passe ich die Verteilungskurve noch ein wenig an und flache die Gaußkurve noch ein wenig ab, aber ich denke darauf kann man aufbauen. ![]()
Nein. Kein Disput. War alles friedlich.
Ich habe keine Ahnung nach welchem Algorithmus diese Bots so programmiert sind. Ich hatte aber schon länger mal vor, eine Engine zu erstellen, die den menschlichen Dartspieler auf natürlichere Art simuliert:
Der Bot "wirft" jeden Dart auf die gleichen Segmente, auf die auch ein Mensch werfen würde, beim Scoring und bei den Checkoutwegen.
Aus dem eingestellten Level ergibt sich dann eine Standardabweichung, wie genau er trifft und aus der Streuung dann das Segment in das er tatsächlich trifft.
Das sollte eine einigermaßen natürliche wirkende Simulation ergeben.
Evtl. mache ich mich da tatsächlich mal dran. Aber es wäre dann keine App, sondern nur eine Engine, die man in eine App einbauen könnte. (Eingangsargumente: Zielsegment und Level, Returnwert: Getroffenes Segment)
mdt
Falls du Interesse an so einer Routine (in C oder C++) hast, sag Bescheid. ![]()
Allerdings werden wohl die meisten heutzutage einfach Claude mit sowas beauftragen.
Ich bin einer dieser seltenen und seltsamen Menschen, die selbst programmieren wollen, weil das Coden der eigentliche Spaß an der Sache ist.
Aussterbende Art. ![]()
die seite (dartai.de) kann ich generell empfehlen, liefert in der Regel gute Ergebnisse, wenn es darum geht Dart-Barrels zu erkennen. Bei top marken und Modellen ist das Tool eigentlich 99,9% Sicher, bei selteneren Darts, insbesondere, wenn Spitzen getauscht sind kommts aber manchmal zu Fehlern.
Das Ding hat bei mir kaum einen Barrel erkannt, auch bei bekannteren weit entfern von "99.9%"
Auf der Suche nach dem Dart, der mir am besten liegt, habe ich ziemlich viel durchprobiert.
Verwirrend für mich war dann irgendwann die Tatsache, dass ich mit durchaus unterschiedlichen Darts zurechtkomme (und mit vielen anderen nicht), aber diesbezüglich keine klare Systematik erkennen konnte, was Gewicht und Form des Barrels angeht.
Nun habe ich gemerkt, dass alle Darts, mit denen ich gut klarkomme eine sehr ähnliche Gripstruktur haben:
1) Meist Ringgrip
2) Gleichmäßiger Grip über den ganzen Barrel. Keine Gripzonen. Auf gar keinen Fall Griffmulden.
3) Starker Grip (ca 3-3,5), aber ohne dass er zu aggressiv ist. Darts die sich anfühlen, als hätten sie Widerhaken oder ähnliches, passen nicht. Der Grip muss stark sein, aber gleichmäßig und unaufdringlich, nicht "hakelig"
Das liegt wohl alles mit daran, dass ich den Dart recht locker, ohne viel Druck der Finger, halte und werfe. Kein aktives Steuern mit der Hand, eher ein Loslassen.
Ich habe also den Eindruck, dass bei mir die Struktur/Textur der Oberfläche des Darts einer der größten Einflüsse ist, ob ich mit ihm zurechtkomme oder nicht. Deutlich mehr als die Form oder das Gewicht. (Obwohl 21g-23g durchaus eher meine Wohlfühlzone zu sein scheint)
Ich meine, hier im Forum hätte mal jemand irgendwann, irgendwo ähnliches geschrieben, konnte es aber nicht mehr finden.
Vom Spiro?
Habe ich schon. 😄
Leider neige ich dazu leicht dem Drang zu erliegen mir sofort ein Ersatzset zu besorgen, wenn es mal sehr gut läuft mit einem Dart. ("Oh, das könnte mein endgültiger Dart werden. Schnell vorsorgen, falls er mal kaputt geht")
Muss ich immer aktiv gegensteuern.
Möchte mir evtl. jemand einige meiner doppelten Sets abkaufen? 😄
Sowas ähnliches hatte ich heute auch. (Nur andersrum)
90 Rest und einfach mal mit Bullseye auf die D20 gestellt (und gecheckt) ![]()
Momentan liegt mir aber tatsächlich der 22g-Spiro besser als der 23g-Ghost. ![]()
5/5 an Sowatt
Gerne wieder. ![]()
War wohl doch nicht so wichtig. ![]()