Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Allgemeines (OffTopic) » Funktion für Treffwahrscheinlichkeit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
06.06.2011, 23:45 Uhr
Lensflare



Hallo.

Ich rätsele gerade an der Implementierung einer Funktion.

Diese Funktion soll die Wahrscheinlichkeit berechnen für einen Treffer bei einem Wurf wenn die Treffsicherheit der werfenden Person bekannt ist und die Ausweichwahrscheinlichkeit der anderen Person bekannt ist, auf die geworfen wird.

float p(float treff, float ausweich);

"treff" = Treffsicherheit der werfenden Person. von 0.0 bis 1.0
"ausweich" = Ausweichsicherheit der Person auf die geforfen wird. von 0.0 bis 1.0

Die Bedingungen sind folgende (geordnet nach Priorität, absteigend):

p(0, a) = 0.0 //bei 0% Treffsicherheit kann man nicht treffen
p(1, a) = 1.0 //bei 100% Treffsicherheit kann man nicht verfehlen

p(a, 0) = 1.0 //bei 0% Ausweichsicherheit wird man immer getroffen
p(a, 1) = 0.0 //bei 100% Ausweichsicherheit wird man nie getroffen

p(a, a) = 0.5 //wenn beide Personen gleich gut, dann Chance auf Treffer = 50%

Alle anderen werte sollten dazwischen liegen.
also zB:
p(x<a, a) < 0.5 //Wenn Werfer schlechter als Ausweicher, dann Chance auf Treffer < 50%
p(a, y<a) > 0.5 //Wenn Ausweicher schlechter als Werfer, dann Chance auf Treffer > 50%

Ich hoffe, dass es nicht zu verwirrend ist.

Bisher hab ich es nur geschafft die letzte Bedingung zu erfüllen und die Werte dabei ungefähr in die richtige Richtung laufen zu lassen:

float p(float treff, float ausweich) {
return 0.5f+(x-y)*0.5f;
}

Der Plot sieht so aus:
www.wolframalpha.com/input/?i=plot%28z%3D0.5%2B%28x-y%29*0.5%29++%28x+from+0+to+1.0%2C+y+from+0+to+1.0%29

Das erfüllt leider noch nicht die Bedingenen für Annäherung an die 0 und 1 Grenzen.

Ich hoffe ihr könnt mir helfen.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.06.2011, 08:20 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja deine bedingungen schließen sich aus:

z.b

p(1, 1) = ???
p(0, 0) = ???

das sind sonderfälle die getrennt behandelt werden müssen in deiner funktion - was macht man wenn man der eine nicht trifft aber der andere immer getroffen werden müsste, bzw andersrum!
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
07.06.2011, 09:20 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Das ganze hört sich für mich ziemlich unlogisch an, denn so wie es beschrieben ist würde man nur einen Parameter brauchen da sich die Ausweichchance immer aus aus der Trefferchance ergibt bzw. andersherum.

Was wäre denn bei p (0.7,0.7)?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
07.06.2011, 09:53 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


ja stimmt, eigentlich ist ja logischerweise

t + a = 1.0
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
07.06.2011, 13:50 Uhr
ao

(Operator)


Die Begrifflichkeiten sind nicht klar, finde ich.

"Wahrscheinlichkeit zu treffen" - schließt das den Ausweichversuch der anderen Person schon ein oder ist es die Wahrscheinlichkeit für einen Treffer, wenn das Ziel sich nicht bewegt?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
07.06.2011, 18:41 Uhr
Lensflare



Ihr habt Recht. Die Begrifflichkeiten sind irreführend.

Also die beiden Parameter sollen eigentlich nicht die Wahrscheinlichkeit zu treffen bzw auszuweichen darstellen sondern eher die Fähigkeit der Person wiederspiegeln. Auf einer Skala von 0 bis 1.

Falls es einfacher ist, könnte man die Funktion so definieren, dass die Parameter im Bereich 0<param<1 sind (also 0 und 1 ausgeschlossen). Und für jeden Sonderfall später einzeln entscheiden.
Ich glaube dann gibt es keine Widersprüche.

@Guybrush Threepwood:
p(0.7,0.7) = 0.5 //beide gleich gut, Chance = 50%

Ich versuchs etwas anders zu beschreiben:
Also wenn beide Parameter gleich sind, soll 0.5 rauskommen. Dises Ergebnis soll kleiner werden, wenn "treff" kleiner wird oder wenn "ausweich" größer wird. Analog dazu soll es größer werden wenn "treff" größer wird oder "ausweich" kleiner wird.

Bis zu diesem Punkt erfüllt meine derzeitige Implementierung die Anforderungen.

float p(float treff, float ausweich) {
return 0.5f+(treff-ausweich)*0.5f;
}

Was mir daran nicht gefällt, ist was mit dem Ergebnis passiert, wenn einer der Parameter sich 0 oder 1 nähert.

Beispiel:
p(0, 0.2) == 0.4

Der Werfer hat hier eine Fähigkeit von 0 und hat trotzdem eine relativ hohe Chance zu treffen.
Das ist meiner Meinung nach unlogisch.
Deswegen habe ich mir diese Bedingungen überlegt (aber noch keine Implementierung gefunden):

"treff" geht gegen 0 => ergebis geht gegen 0
"treff" geht gegen 1 => ergebis geht gegen 1
"ausweich" geht gegen 0 => ergebnis geht gegen 1
"ausweich" geht gegen 1 => ergebnis geht gegen 0

Wie findet ihr das? Oder was würdet ihr anders machen?
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 07.06.2011 um 18:45 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
07.06.2011, 20:30 Uhr
0xdeadbeef
Gott
(Operator)


Ich schlage etwas wie

C++:
chance = pow((exp(treff) / exp(ausweich) - 1 / M_E) / (M_E - 1 / M_E), skalierung);


vor, wobei skalierung eine Konstante ist, die die Steigung beeinflusst. Mit skalierung == 1 ist:

treff = 0, ausweich = 0 -> chance = 0.268941
treff = 0, ausweich = 1 -> chance = 0
treff = 1, ausweich = 0 -> chance = 1
treff = 1, ausweich = 1 -> chance = 0.268941

Für chance = 0.5 bei treff == ausweich setze skalierung auf 0.527805834243015 bzw.

C++:
skalierung = log(.5) / log((1 - 1 / M_E) / (M_E - 1 / M_E));



und einer schönen, stetigen Steigung dazwischen, die du gnuplot mit

Code:
splot [0:1] [0:1] (exp(x)/exp(y) - 1/exp(1))/(exp(1) - 1/exp(1))


entlocken kannst.

Ansonsten denkbar: sqrt(treff * (1 - ausweich)) - das geht gegen Null, wenn ausweich gegen 1 oder treff gegen 0 geht. Mit der Bedingung p(a, a) = 0.5 ist das allerdings nicht zu vereinbaren. Graph:


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 07.06.2011 um 21:30 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
07.06.2011, 21:28 Uhr
Lensflare



@0xdeadbeef:
für skalierung = 0.527805834243015 sind die Funktionswerte
www.wolframalpha.com/input/?i=plot%28pow%28%28exp%28x%29%2Fexp%28y%29+-+1%2Fexp%281%29%29%2F%28exp%281%29+-+1%2Fexp%281%29%29%2C0.527805834243015%29%29+%28x+from+0+to+1%2C+y+from+0+to+1%29

ziemlich ähnlich denen von meiner aktuellen Implementierung
0.5+(treff-ausweich)*0.5
www.wolframalpha.com/input/?i=plot%280.5%2B%28x-y%29*0.5%29+%28x+from+0+to+1%2C+y+from+0+to+1%29

Ich sehe da leider keinen Vorteil.

So langsam bemerke ich auch, dass der der Widerspruch nicht nur bei den Randwerten 1 und 0 existiert, sondern schon bei der Annäherung an diese Werte.

Das

Zitat:

"treff" geht gegen 0 => ergebis geht gegen 0
"treff" geht gegen 1 => ergebis geht gegen 1
"ausweich" geht gegen 0 => ergebnis geht gegen 1
"ausweich" geht gegen 1 => ergebnis geht gegen 0


scheint mir jetzt gar nicht umsetzbar zu sein.
Zumindest nicht wenn zusätzlich p(a,a)==0.5 gelten soll.
--
Wenn das Gehirn so einfach wäre, dass wir es verstehen könnten, wären wir so einfach, dass wir es nicht verstehen könnten.
(Emerson Pugh Trost)

Dieser Post wurde am 07.06.2011 um 21:31 Uhr von Lensflare editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.06.2011, 09:54 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


Nur mal so als kurzer Gedanke, was wäre denn wenn ganz einfach zuerst die Trefferwahrscheinlichkeit anhand der Trefferfähigkeit ermittelst und diese dann um die Ausweichwahrscheinlichkeit welche du mit der Ausweichfähigkeit verringerst?

Im einfachsten Fall wäre das ja dann treff-ausweich aber je nach Rahmenbedingung könnte man das ja noch etwas ausbauen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
08.06.2011, 10:22 Uhr
ao

(Operator)


treff - ausweich kann negativ werden, und bei treff == ausweich ergibt sich ein sicheres Danebenschießen, das ist nicht plausibel, oder?

Ich halte deadbeefs Vorschlag für gut: treff * (1 - ausweich)

Die Randforderung p(a, a) = 0.5 ist mMn fraglich. Überleg mal, was das bedeutet für a = 0.01 (sehr schlechter Schütze, sehr träges Ziel). Ist 50 Prozent Trefferwahrscheinlichkeit da sinnvoll?

Dieser Post wurde am 08.06.2011 um 10:23 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Allgemeines (OffTopic) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: