Probabilità di knockout


9

Knockout è una partita di basket in cui i giocatori a turno sparano. Si gioca come una sequenza di contest a due giocatori, ognuno dei quali ha la possibilità di "buttare giù" uno di quei giocatori.

Supponiamo che i giocatori siano A B C De le loro possibilità di sparare e fare un canestro siano 0.1 0.2 0.3 0.4, indipendentemente dall'altro giocatore nel concorso. I due giocatori in prima linea Ae B"combattono". Poiché Ava per primo, è il difensore , in pericolo di essere eliminato, ed Bè l' attaccante , e non in pericolo di eliminazione immediata. Aspara per primo. Se Ace la fa, Aha difeso con successo e va in fondo alla linea. La linea cambierebbe in B C D A. Se Anon ce la fa, allora Bspara. Se Bce la fa, allora Aè fuori e Bva sul retro della linea, quindi la linea diventa C D B. Se nessuno dei dueAné ce la Bfa, il processo si ripete, con lo Ascatto di nuovo, fino a quando uno Ao Bfa un canestro.

Supponiamo che la linea sia cambiata in B C D A( Aera stata difesa con successo). Ora, Be C"combatti" con l' Bessere il difensore e l' Cessere l'attaccante. Questo processo si ripete fino a quando rimane una sola persona. Quella persona è il vincitore.

Il tuo compito è calcolare le probabilità di vincita di ogni persona data la possibilità che realizzeranno un paniere.

Input :

Un elenco di numeri, come ad esempio 0.1 0.2o 0.5 0.5 0.5 0.5, dove il n ° numero è la possibilità che il n ° giocatore farà un cestino. Puoi prendere questo input nel formato che preferisci, inclusi i parametri di una funzione.

Uscita :

Un elenco di numeri, dove il n ° numero è la possibilità che il n ° giocatore vincerà la partita. I tuoi numeri devono essere precisi con almeno due cifre decimali almeno il 90% delle volte. Ciò significa che è possibile utilizzare un approccio basato sulla simulazione. Tuttavia, se il tuo codice non è basato sulla simulazione (è garantito che restituisca una risposta corretta ad almeno 6 cifre decimali), togli il 30% dal tuo punteggio.

Esempio tra 0.5 0.5: chiama i giocatori Ae B. Sia pla probabilità di una vittoria. Aha la 2/3possibilità di difendersi con successo (dal momento che c'è una 1/2possibilità che Asegna, 1/4un'occasione che Amanca e Bsegna e 1/4un'occasione che manca e il processo si ripete). Se Anon riesce a difendersi, viene eliminato e Bvince. Se Adifende, allora la linea diventa B A. Poiché la situazione è simmetrica, la probabilità di Avincita è (1 - p). Noi abbiamo:

p = 2/3 * (1 - p) + 1/3 * 0. Risolvendo, otteniamo p = 2/5. L'output dovrebbe essere 2/5 3/5o 0.4 0.6.

Non sono abbastanza bravo con probabilità di fare esempi più complessi.

Se hai bisogno di più casi di test, eccone alcuni:

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)

Risposte:


4

CJam ( 84 80 caratteri * 0.7 = 56)

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

Demo online . Questa è una funzione ricorsiva che accetta una matrice di doppie e restituisce una matrice di doppie. La demo online include una piccola quantità di ponteggi per eseguire la funzione e formattare l'output per la visualizzazione.

Dissezione

Il principio di base è che se rimangono n > 1giocatori, uno di loro deve essere il prossimo ad essere eliminato. Inoltre, l'ordine della coda dopo ciò accade dipende solo dall'ordine iniziale della coda e da chi viene eliminato. Quindi possiamo effettuare nchiamate ricorsive, calcolare le probabilità di vincita per ciascun giocatore in ciascun caso, quindi dobbiamo solo ponderare in modo appropriato e aggiungere.

Etichetta le probabilità di input come [p_0 p_1 ... p_{n-1}]. Lasciate che f(a,b)denotano la probabilità che anon riesce a difendersi b. In ogni dato giro, la probabilità che adifende con successo è p_a, la probabilità che bbussa afuori è (1-p_a)*p_b, e la probabilità che si va ad un altro giro è (1-p_a)*(1-p_b). Possiamo fare una somma esplicita di una progressione geometrica o possiamo sostenere che le due progressioni geometriche sono proporzionate tra loro per ragionare su ciò f(a,b) = (1-p_a)*p_b / (p_a + (1-p_a)*p_b).

Quindi possiamo avanzare di livello fino al giro completo della linea. La probabilità che il primo giocatore venga eliminato è f(0,1); la probabilità che il secondo giocatore venga eliminato è (1-f(0,1)) * f(1,2); il terzo giocatore è (1-f(0,1)) * (1-f(1,2)) * f(2,3); ecc. fino a quando l'ultimo non viene eliminato con probabilità \prod_i (1-f(i,i+1)) * f(n-1,0). Lo stesso argomento sulle progressioni geometriche ci consente di usare queste probabilità come pesi, con la normalizzazione di un fattore di 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.