Solución:
Aquí está mi intento, agradecería comentarios:
Sea $ p $ la probabilidad de que el jugador A gane un solo punto.
(1) El jugador A puede ganar después de 40-0, con probabilidad $ p ^ 4 $
(2) El jugador A puede ganar después de 40-15 con probabilidad $ {4 choose 1} times p ^ 4 (1-p) $
(3) El jugador A puede ganar después de 40-30 con probabilidad $ {5 choose 2} times p ^ 4 (1-p) ^ 2 $
(4) El jugador A puede alcanzar el deuce, con probabilidad $ {6 choose 3} times p ^ 3 (1-p) ^ 3 $, y una vez que se alcanza el deuce, el jugador A ganará con una probabilidad de $ frac { p ^ 2} {1-2p (1-p)} $ (http://www.austinrochford.com/posts/2013-04-25-probability-and-deuces-in-tennis.html)
Por lo tanto, la probabilidad de que el jugador A gane el juego está dada por,
$$ P (Win) = p ^ 4 + {4 choose 1} cdot p ^ 4 (1-p) + {5 choose2} cdot p ^ 4 (1-p) ^ 2 + {6 choose 3} cdot frac {p ^ 5 (1-p) ^ 3} {1-2p (1-p)} $$
Numéricamente, este problema es fácil usando cadenas de Markov. Es un poco complicado crear la matriz de transición. Pegaré un código R que creé solo por diversión.
transition_matrix <- function(p_win) {
half_states <- c(0, 15, 30, 40)
state <- function(own, opp) paste0(half_states[own], "https://foroayuda.es/", half_states[opp])
states <- c(state(expand.grid(1:4, 1:4)[, 1], expand.grid(1:4, 1:4)[, 2]), 'won', 'lost')
tm <- array(0, dim = c(length(states), length(states)))
colnames(tm) <- states
rownames(tm) <- states
rex <- '^([0-9]+)/([0-9]+)$'
for (s in states) {
if (grepl(rex, s)) {
own <- which(half_states == gsub(rex, '\1', s))
opp <- which(half_states == gsub(rex, '\2', s))
stopifnot(length(own) == 1, length(opp) == 1)
if (own < 4) {
j_win <- which(states == state(own + 1, opp))
} else {
if (opp < 4) {
j_win <- which(states == 'won')
} else {
j_win <- which(states == '40/30')
}
}
if (opp < 4) {
j_lost <- which(states == state(own, opp + 1))
} else {
if (own < 4) {
j_lost <- which(states == 'lost')
} else {
j_lost <- which(states == '30/40')
}
}
stopifnot(length(j_win) == 1, length(j_lost) == 1)
i <- which(rownames(tm) == s)
tm[i, j_win] <- p_win
tm[i, j_lost] <- 1 - p_win
} else {
if (s == 'won') tm['won', 'won'] <- 1 else tm['lost', 'lost'] <- 1
}
}
tm
}
Por ejemplo, transition_matrix (0.3) es:
0/0 15/0 30/0 40/0 0/15 15/15 30/15 40/15 0/30 15/30 30/30 40/30 0/40 15/40 30/40 40/40 won lost
0/0 0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
15/0 0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
30/0 0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
40/0 0 0.0 0.0 0.0 0.0 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0
0/15 0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
15/15 0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0
30/15 0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0 0.0 0.0
40/15 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.3 0.0
0/30 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0 0.0
15/30 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0 0.0
30/30 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0
40/30 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.7 0.3 0.0
0/40 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.0 0.7
15/40 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7
30/40 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.7
40/40 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.3 0.0 0.0 0.7 0.0 0.0 0.0
won 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0 0.0
lost 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 1.0
>
Ahora, lo que buscas es el resultado tras jugar infinitos puntos. Para propósitos prácticos, multiplicar la matriz por sí misma 20 veces es como jugar 2 ^ 20 == 1,048,576 puntos. Puede esperar que todos los caminos se ‘ganen’ o ‘pierdan’ después de esa cantidad de puntos.
for (time in 1:20) tm <- tm %*% tm
Y lo que obtienes es la probabilidad de ganar para cada posible estado inicial, no solo 0/0.
> tm[1:16, c('won', 'lost')]
won lost
0/0 0.099211034 0.9007890
15/0 0.210981724 0.7890183
30/0 0.412168966 0.5878310
40/0 0.710224138 0.2897759
0/15 0.051309310 0.9486907
15/15 0.124758621 0.8752414
30/15 0.284431034 0.7155690
40/15 0.586034483 0.4139655
0/30 0.019831034 0.9801690
15/30 0.056327586 0.9436724
30/30 0.155172414 0.8448276
40/30 0.408620690 0.5913793
0/40 0.004189655 0.9958103
15/40 0.013965517 0.9860345
30/40 0.046551724 0.9534483
40/40 0.155172414 0.8448276
>
Además, puede resolver el problema inverso usando optimizar ()
sq_error <- function (p_win, p_win_game) {
tm <- transition_matrix(p_win)
for (time in 1:20) tm <- tm %*% tm
(tm['0/0', 'won'] - p_win_game)^2
}
p_win <- optimize(function(p) sq_error(p, p_win_game = 0.3), c(0, 1))$minimum
> p_win
[1] 0.4166342