Ich könnte mir vorstellen, dass diese Tabelle nicht ausreicht, um den Ausgang komplexerer Kämpfe vorherzusagen.
Wie würdest du die Tabelle zum Beispiel bei 20R 140M 40B vs. 200WH anwenden?
Ich könnte mir vorstellen, dass diese Tabelle nicht ausreicht, um den Ausgang komplexerer Kämpfe vorherzusagen.
Wie würdest du die Tabelle zum Beispiel bei 20R 140M 40B vs. 200WH anwenden?
In dem Fall muss folgendes geschehen:
Abfrage ob (Anzahl WH) * (Tötungsverhältnis WH-B) > 40
- Falls ja:
- Man kann das ganze ja Umdrehen, nämlich 40 / (Tötungsverhältnis WH-B) = nötige Anzahl zum Töten der B.
- Dann läuft der Kampf mit 200WH minus der nötigen Anzahl WH weiter.
- Falls nein, wird einfach der Schaden wie oben beschrieben abgezogen.
Danke, hab noch nicht soweit gedacht, aber ich implementiers ja auch nicht.
EDIT: Ich mach mal noch ein Zahlenbeispiel
Tötungsverhältnisse(wieder nur wahllose Zahlen):
R/M/B-WH ist immer 1
WH-B = 0,6
WH-R = 0,2
WH-M = 0,1
1. Runde, 1. Phase:
200WH * 0,6 = 120 > 40B
Also: 40B/0,6 = 67
133WH * 0,2 = 26,6 > 20R
Also: 20R/0,2 = 100
33WH * 0,1 = 3,3 < 140M
Überlebende 1. Phase: 136,7M vs. 200WH
1.Runde, 2. Phase
137M*1 = 137 < 200WH
(Hier wird aufgerundet, da der M ja noch lebt!)
Überlebende 2. Phase: 136,7M vs. 63WH
2. Runde, 1. Phase:
63WH * 0,1 = 6,3 < 136,7M
Überlebende 1. Phase: 130,4M vs. 63WH
2.Runde, 2. Phase
131M*1 = 131 > 63WH => Gegner tot
Geändert von soegal (08.03.11 um 16:27 Uhr)
"Parmesan und Partisan, wo sind sie geblieben? Partisan und Parmesan, alles wird zerrieben..."
- Matthias Beltz -
Von der Idee her ist das eigentlich nicht schlecht. Du wirst allerdings Probleme bekommen, wenn du viel weniger (10-20) oder viel mehr (190-200) Einheiten anstelle der 100 Einheiten mitnimmst, mit denen du die Werte in der Tabelle bestimmt hast.
Nimmst du mehr Einheiten mit, nähert sich der ermittelte Wert dem Wert, der sich nach unendlich vielen Wiederholungen einstellt, da mehr Einheiten die Abweichungen verringern. Nimmst du weniger mit, sind die Abweichungen aber extrem groß.
Beispiel Würfeln: Bei unendlichen vielen Würfen ist die Wahrscheinlichkeit für eine der 6 Seiten 1/6. Würfelst du nur einmal, bekommst du für eine Seite den Wert 1 und für alle anderen Seiten eine 0.
Ich habe mal ein paar Werte ermittelt:
Jeweils 200 Wiederholungen und mit 100 vs. 100 Einheiten über 1 Kampfrunde.Code:R M C S E B LB A K PL SL WH RB SW WL R 0,490 0,430 0,825 0,295 1,000 1,000 M 0,835 0,490 0,880 0,330 1,000 1,000 C 0,225 0,150 1,000 0,105 0,835 0,835 S E B LB A K PL 0,460 0,365 0,785 SL 0,725 0,460 0,860 WH 0,185 0,130 1,000 RB 0,735 0,455 0,905 SW 0,725 0,450 0,175 WL 0,725 0,710 0,175
Beispiel: 100R vs. 100Pl: 0,490
Nehme ich aber beispielsweise 50R vs. 100Pl lande ich bei 0.5, mit 20R vs. 100Pl lande ich bei 0.525 und mit 10R vs. 100Pl sogar bei 0.55.
Das ergibt schon einen großen Unterschied, der mit Sicherheit nicht unwesentlich für die Berechnung ist.
Nichtsdestotrotz ist die Tabelle sehr interessant. So erkennt man direkt Stärken und Schwächen der einzelnen Einheiten gegenüber den verschiedenen Einheitentypen.
Geändert von Asipak (08.03.11 um 17:36 Uhr)
Also das einfachste wäre natürlich eine Formel in die man alles reinpackt und am Ende kommt der "Erwartungswert" raus. Leider ist das Kampfsystem doch etwas komplexer, so daß die Möglichkeit vorerst flach fällt.
Um die Waldraud doch noch erfolgreich totzuoptimieren, gibt es denke ich 2 Optionen:
1. Man differenziert die Kosten weiter, so daß der Algorithmus weiter läuft. Die Frage ist, ob man damit immer die optimale Lösung findet, also sich die Suche hin zum globalen Maximum bewegt. Da bietet es sich wie vorgeschlagen an den ausgeteilten Schaden zu berücksichtigen. Wenn ich heute dazu komme, teste ich das mal.
2. Man geht bei alles gleiche Kosten zum Bruteforce über. Das heißt eine Breitensuche im n-Dimensionalen ausgehend von einer Ecke. Vorteil man findet die optimale Lösung zu 100%. Nachteil kann sehr lange dauern, besonders, wenn viele Einheitentypen gewählt sind.
Gegen die Waldraud bringt es übrigens auch nichts alle "Ecken" (200R / 200M / 200B ..) zu berechnen, da diese ebenfalls 202 als Kosten haben. Habe ich schon probiert.
Nochmal zum Thema Geschwindigkeit. Das rührt weder daher das euer Rechner langsam ist oder dergleichen. Die Implementierung ist absolut auf Codelesbarkeit getrimmt und liest sich wie die Erklärung in der Wiki. Das nützt einem Nutzer natürlich recht wenig. Es ist allerdings kein Problem das ganze enorm zu beschleunigen. Kommt wie angekündigt auch noch. Und beim Webbasierten Simulator wird das ganze auf dem Webserver ausgeführt, d.h euer Rechner macht da gar nix außer das Ergebnis anzeigen.
@PeterPollack
Ja natürlich nicht, deswegen ja auch der Vorschlag mit dem Sampeln. Diesen habe ich auch nur gemacht, da eine Optimierung bei über 1 Sekunde pro Durchlauf einfach nicht zumutbar ist. Wenn du mehrere Durchläufe pro Sekunde hinkriegst, ist diese Vereinfachung ja nicht nötig.
Dann wohl lieber mit weiteren, (optionalen) Kosten über den Schaden. Mir fällt grad kein Grund ein, warum das nicht auch zu einer guten Lösung führen sollte. Du musst ja nichtmal die Kostenfunktion ändern, sondern nur den jeweils nächsten Knoten nehmen, bei dem der höchste Schaden angerichtet wird. Da du in 20er Schritten voran gehst, sollt sich der Schaden von Knoten zu Knoten doch deutlich unterscheiden.2. Man geht bei alles gleiche Kosten zum Bruteforce über. Das heißt eine Breitensuche im n-Dimensionalen ausgehend von einer Ecke. Vorteil man findet die optimale Lösung zu 100%. Nachteil kann sehr lange dauern, besonders, wenn viele Einheitentypen gewählt sind.
Ich hatte nur die Soldaten im Kopf, mit denen gehts ja. Dachte nur, dass es allgemein vielleicht besser wäre, andere Ecken mit einzubeziehen. Dass es nur eine Hilfskrücke ist und keine gute Lösung für das globale Optimum, ist mir auch bewusst.Gegen die Waldraud bringt es übrigens auch nichts alle "Ecken" (200R / 200M / 200B ..) zu berechnen, da diese ebenfalls 202 als Kosten haben. Habe ich schon probiert.
@Asipak
Hmmm, die Abweichung ist schon groß, aber das bedeutet "nur" einen Unterschied von ca. 0,5 Einheiten(z.B. 10*0,49 = 4,9; 10*0,55 = 5,5). Man müsste es sich mal genauer durch rechnen, aber intuitiv würde ich mal sagen, dass der Unterschied im Endergebnis nicht so groß ist. Vor allem, da ja nur in 20er Schritten optimiert wird, also die Differenz zwischen zwei Knoten meist recht deutlich ausfällt und daher die kleine Abweichung vielleicht nicht so stark reinspielt. Wie gesagt, müsste man mal ausprobieren.
EDIT: @Asipak
Für meine Beispielrechnung ist das Tötungsverhältnis gegen WH immer 1, da ich die beiden Kamfphasen getrennt habe. Aber für einen Vergleich der Einheitentypen und deren Eignung, ist es natürlich so, wie du es gemacht hast, besser.
Geändert von soegal (08.03.11 um 19:13 Uhr)
"Parmesan und Partisan, wo sind sie geblieben? Partisan und Parmesan, alles wird zerrieben..."
- Matthias Beltz -
Wie wärs denn einfach alle Ecken zu berechnen, und dann die beste Ecke als Startwert zu nehmen? D.h. nicht einfach immer 200R als Startwert nehmen, sondern auch 200M, 200B, etc. durchrechnen und dann entscheiden welchen Startwert man dann nimmt.
Das würde die eigentliche Simulation zwar um 10sek (grober Schätzwert) verlängern, würde aber je nach Gegnerkonstellation manchmal sogar schneller zum Ziel führen.
Momentan sehe ich dabei nur das Problem zu entscheiden welcher Startwert am günstigsten ist. Hier hilft vielleicht dann doch die oben angesprochene Kreuztabelle. Oder man entscheidet bei Unentschieden doch nach angerichtetem Schaden.
Heute hab ich die Zeit gefunden, die Kostenfunktion von Einheiten auf Lebenspunkte umzustellen. Das Ergebnis ist wie gewünscht und er findet nun auch die Optimale Lösung für Waldraud unabhängig der gewählten Einheitentypen. Die Idee von NudeRaider war also nicht die schlechteste. Als nächstes steht dann die Geschwindigkeit auf dem Plan, wenn nicht noch jemand was schwerwiegendes findet.
Prima. Übrigens als ich noch mit der alten Version ohne Optimierer die Waltraud simuliert habe, habe ich auch verschiedene Einheiten Kombinationen ausprobiert und dann geschaut wieviel HP Waltraud noch übrig hatte um zu beurteilen ob ich mich einer Lösung nähere. Also lag dieser Vorschlag auch für dein Programm nahe.Hieraus lässt sich denke ich gleich die nächste Optimierung ableiten: Erst einmal nur 1 Kampf simulieren und wenn die optimale Lösung (für den jeweiligen Durchgang) sich deutlich genug von der zweitbesten unterscheidet dann braucht man gar keine 20 Simulationen.
Hmmm... während ich das schreibe zweifle ich selbst daran, weil meine Intuition sagt mir, dass dabei die Chance zu hoch ist einen statistischen Ausreißer zu erwischen der die Optimierung verfälscht.
Andere Idee: Nicht Brute-forcen, sondern das statistische Mittel errechnen. Da du ja sowieso immer in 20-Einheiten Schritten arbeitest müsste das sehr gut klappen.
Beispiel: Statt 20x folgendes zu simulieren und dann das statistische Mittel zu errechnen ...
... machst du eine einzelne Rechnung daraus indem du eine vorab ausgerechnete Tabelle auswertest:Code:FOR (i++ = 0; Anz_Rekruten) chance = rand(0,1) IF (chance > 0.8) HP_Raider[n] = HP_Raider[n] - 15 ELSE HP_Raider[n] = HP_Raider[n] - 30 IF (HP_Raider[n] <= 0) n++ END FOR Raiders_dying = n
In dem Array Tabelle steht dann in Spalte 0, Zeile 13 wieviele Raufbolde im statistischen Mittel von 1 Rekruten getötet werden: Laut meinen Rechnungen müssten das 0,270 sein, Asipaks Simulationen haben 0,295 ergeben und meine Simulationen 0,282. Da müsste man nochmal drüber nachdenken wie man die Tabelle mit brauchbaren Werten erstellt. Zumindest habe ich festgestellt, dass die Rechnung doch schon nicht mehr ganz so simpel ist und bin mir daher nicht ganz sicher nicht doch etwas übersehen zu haben.Code:Raiders_dying = ABRUNDEN( Anz_Rekruten * Tabelle(0,13) )
Wenn du's perfekt machen willst nimmst du auch noch den Schaden eines angeschlagenen Raufbolds mit, aber ich denke das ist für die Optimierungsrechnung gar nicht notwendig.
Geändert von NudeRaider (10.03.11 um 02:00 Uhr)
Hallo Peter,
mit Abstand der Beste Simulator, den ich bislang nutzen durfte. Ich bin sehr sehr sehr zufrieden damit. Vor allem aber, ist das genau der Ansatz des Simulators, den ich suchte. Weltklasse. Alle Daumen hoch !
Vielen Dank für die Arbeit und die Mühe !!
LG
Mera
Hallo!
Erstmal Super Simulator, ist mir von allen Kampfsimulatoren der liebste.
Aber:
Er zeigt an, dass man mit 1 Reiter 2 Wachhunde besiegen kann (und zwar immer (100 Simulationen))
Selbstverständlich habe ich nicht nur die Wachhunde beim Gegner eingegeben sondern auch die anderen (z.B. 50 WH, 110 RB, 40WL)
Das ist aber nicht der Fall. Es wird immer nur ein Wachhund besiegt.
Alle anderen Simulatoren zeigen auch nur 1 besiegten Wachhund an
Er zeigt an: General1 verursacht 120 Schaden an Wachhund2(-115HP)
Das scheint wohl nicht zu stimmen, da der General wohl vorher schon besiegt wird, und nicht nachher wie im Simulator angegeben
Ansonsten ist er immer sehr genau
Gruß Tom