Probabilidades de eliminación

9

Knockout es un juego de baloncesto donde los jugadores se turnan para disparar. Se juega como una secuencia de concursos de dos jugadores, cada uno de los cuales tiene la posibilidad de "noquear" a uno de esos jugadores.

Supongamos que los jugadores son A B C Dy sus posibilidades de disparar y hacer una canasta son 0.1 0.2 0.3 0.4respectivamente, independientemente del otro jugador en el concurso. Los dos jugadores al frente de la línea, Ay B"pelea". Desde el Aprincipio, él es el defensor , está en peligro de ser eliminado y Bes el atacante , y no está en peligro de eliminación inmediata. Adispara primero. Si Alo logra, se Aha defendido con éxito y va al final de la línea. La línea cambiaría a B C D A. Si Ano lo logra, Bdispara. Si Blo logra, entonces Aestá fuera y Bva al final de la línea, por lo que la línea se convierte C D B. Si ningunoAni Blo hace, el proceso se repite, con Adisparar de nuevo, hasta que Ao Bhace una cesta.

Supongamos que la línea cambia a B C D A( Ahabía defendido con éxito). Ahora, By C"pelea", con Bser el defensor y Cser el atacante. Este proceso se repite hasta que solo quede una persona. Esa persona es la ganadora.

Su tarea es calcular las probabilidades de que cada persona gane dada la posibilidad de que hagan una canasta.

Entrada :

Una lista de los números, tales como 0.1 0.2o 0.5 0.5 0.5 0.5, donde el n º número es la posibilidad de que el n º jugador hará una cesta. Puede tomar esta entrada en cualquier formato que desee, incluidos los parámetros de una función.

Salida :

Una lista de los números, donde el n º número es la posibilidad de que el n º jugador ganará el juego. Sus números deben tener una precisión de al menos dos decimales al menos el 90% del tiempo. Esto significa que puede usar un enfoque basado en simulación. Sin embargo, si su código no se basa en la simulación (se garantiza que devolverá una respuesta correcta al menos con 6 decimales), elimine el 30% de su puntaje.

Ejemplo entre 0.5 0.5: Llamar a los jugadores Ay B. Sea pla probabilidad de que A gane. Atiene una 2/3posibilidad de defenderse con éxito (ya que existe la 1/2posibilidad de que Aanote, una 1/4oportunidad que Afalla y Banota, y una 1/4posibilidad de que ambos pierdan y el proceso se repita). Si Ano puede defenderse, es noqueado y Bgana. Si Adefiende, entonces la línea se convierte B A. Como la situación es simétrica, la probabilidad de Aganar es (1 - p). Obtenemos:

p = 2/3 * (1 - p) + 1/3 * 0. Resolviendo, llegamos p = 2/5. La salida debe ser 2/5 3/5o 0.4 0.6.

No soy lo suficientemente bueno con la probabilidad de hacer ejemplos más complejos.

Si necesita más casos de prueba, aquí hay algunos:

0.1 0.2 0.3 0.4 --> 0.01 0.12 0.25 0.62
0.99 0.99 --> 0.5 0.5 (it's not exact, but if you round to two decimal places, you get 0.5 and 0.5)
soktinpk
fuente

Respuestas:

4

CJam ( 84 80 caracteres * 0.7 = 56)

{_,({_,,{_2$m<(;(+Q0\)\++m>\}%)_(+.{X2$-*_@+/}1\{1$*\1$-}%)1\-f/.f*:.+}{,da}?}:Q

Demo en línea . Esta es una función recursiva que toma una matriz de dobles y devuelve una matriz de dobles. La demostración en línea incluye una pequeña cantidad de andamios para ejecutar la función y formatear la salida para su visualización.

Disección

El principio básico es que si quedan n > 1jugadores, uno de ellos debe ser el siguiente en ser eliminado. Además, el orden de la cola después de que eso suceda depende solo del orden inicial de la cola y de quién queda fuera de combate. Por lo tanto, podemos hacer nllamadas recursivas, calcular las probabilidades de ganar para cada jugador en cada caso, y luego solo tenemos que pesar adecuadamente y sumar.

Etiquetaré las probabilidades de entrada como [p_0 p_1 ... p_{n-1}]. Deje f(a,b)denotar la probabilidad contra la que ano se defiende b. En cualquier ronda, la probabilidad de que adefiende con éxito es p_a, la probabilidad de que blos golpes ahacia fuera es (1-p_a)*p_b, y la probabilidad de que se va a otra ronda es (1-p_a)*(1-p_b). Podemos hacer una suma explícita de una progresión geométrica o podemos argumentar que las dos progresiones geométricas son proporcionales entre sí para razonar eso f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b).

Entonces podemos subir un nivel a rondas completas de la línea. La probabilidad de que el primer jugador sea noqueado es f(0,1); la probabilidad de que el segundo jugador sea noqueado es (1-f(0,1)) * f(1,2); el tercer jugador es (1-f(0,1)) * (1-f(1,2)) * f(2,3); etc hasta que el último sea eliminado con probabilidad \prod_i (1-f(i,i+1)) * f(n-1,0). El mismo argumento sobre progresiones geométricas nos permite usar estas probabilidades como pesos, con normalización por un factor de 1 / \prod_i f(i, i+1 mod n).

{                   e# Define a recursive function Q
  _,({              e# If we have more than one person left in the line...
    _,,{            e#   Map each i from 0 to n-1...
      _2$m<         e#     Rotate a copy of the probabilities left i times to get [p_i p_{i+1} ... p_{n-1} p_0 ... p_{i-1}]
      (;(+          e#     i fails to defend, leaving the line as [p_{i+2} ... p_{n-1} p_0 ... p_{i-1} p_{i+1}]
      Q             e#     Recursive call
      0\)\++        e#     Insert 0 for the probability of i winning and fix up the order
      m>\           e#     Rotate right i times and push under the list of probabilities
    }%
    )               e#   Stack: [probs if 0 knocked out, probs if 1 knocked out, ...] [p_0 p_1 ...]
    _(+.{           e#   Duplicate probs, rotate 1, and pointwise map block which calculates f(a,b)
      X2$-*_@+/     e#     f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b)  TODO is the d necessary?
    }
    1\{1$*\1$-}%    e#   Lift over the list of f(a,b) a cumulative product to get the weights  TODO is the d necessary?
    )1\-f/          e#   Normalise the weights
    .f*             e#   Pointwise map a multiplication of the probabilities for each case with the corresponding weight
    :.+             e#   Add the weights across the cases
  }{,da}?           e# ...else only one left, so return [1.0]
}:Q
Peter Taylor
fuente