Simulando espero

Hace unos días me acordé de este problemita posteado hace mucho tiempo acá 
En un vuelo completamente vendido hay n asientos. Los pasajeros van subiendo uno detrás del otro al avión. En el primer lugar sube una vieja loca que en lugar de tomar su asiento elige aleatoriamente un lugar donde sentarse. El resto de los pasajeros siguen subiendo de a uno. Si su asiento está libre, lo toman. Si está ocupado, eligen entre aquellos que estén libres de manera aleatoria. ¿Cuál es la probabilidad de que el último pasajero pueda sentarse en su lugar?
El caso más simple, obviamente, sería un avión de dos asientos. La cosa es simple: la vieja loca elige al azar. Hay dos posibilidades: o bien, se sienta en su asiento o no. En caso de que se siente en su asiento, el pasajero “U” –último- se sentará en su asiento. En la segunda opción, no. La probabilidad es 0.5. Ahora, ¿qué pasa si n empieza a aumentar?
Nunca les tuve demasiada paciencia a estos “acertijos” de probabilidad. Pero este tenía una característica atractiva: parecía a priori relativamente fácil de programar y resolver vía simulación. En realidad resultó no ser tan fácil –llevó una tarde con ayuda de mi hermano-, pero se pudo. La idea era tratar de armar un algoritmo simple para resolverlo con la menor reflexión “analítica” posible.
Imaginemos que nos tomamos un Boeing 737 de Aerolíneas de 128 asientos (n=128). La vieja loca elige al azar (supongamos, por simplicidad, que el primer asiento es suyo y que todos los pasajeros ingresan en orden de acuerdo a sus asientos). En principio, hay dos posibilidades: o elige su asiento o no. Pero después se complica…
Bueno, acá está el código en R y algunas salidas para diferentes valores de n. Todas son con 60.000 repeticiones (sí, estaba al pedo y quería ver cuánto tardaba en colgar la máquina; fueron 500.000).

sims<-100000 # Nro. de simulaciones
p<-128 # Nro. de pasajeros
result<-vector()
correcto<-0
incorrecto<-0

for (s in 1:sims){

        asientos<-seq.int(1,p,1) #setea el vector de asientos totales
        vieja<-sample(asientos,1) # la vieja selecciona un asiento entre 1 y el total de asientos al azar
        asientos<-subset(asientos,asientos!=vieja) #se excluye de próximas selecciones el asiento
                for (i in 2:p){
                if (is.element(i,asientos)==FALSE){ # se busca si el asiento esta disponible en el vector
                        pasajero<-sample(asientos,1) # pasajero selecciona asiento al azar e/disp.
                        asientos<-subset(asientos, asientos!=pasajero)} # se excluye asiento seleccionado
                else {
                        pasajero<-i # si el asiento esta disponible, entonces, 
                        asientos<-subset(asientos, asientos!=i)} # el pasajero selecciona asiento

        }
        if (pasajero==p) {
                correcto=correcto+1
                result[s]<-pasajero
        }
        if (pasajero!=p) {
                incorrecto=incorrecto+1
                result[s]<-pasajero
        }
}

table(result)
## result
##     1   128 
## 50068 49932
cat("Prob(Ultimo pasajero en su asiento)=", correcto/sims, "\n")
## Prob(Ultimo pasajero en su asiento)= 0.49932
cat("Prob(Ultimo pasajero NO en su asiento)=", incorrecto/sims, "\n")
## Prob(Ultimo pasajero NO en su asiento)= 0.50068

n
Pr(“U” en asiento correcto)
Pr(“U” en asiento incorrecto)
32
0.49895
0.50105
64
0.50162
0.49838
96
0.50237
0.49763
128
0.49983
0.50017

Para n=32, además, hay solamente dos resultados posibles en las 60.000 repeticiones: o bien, “U” se sienta en el asiento 1 (el de la vieja) o el 32 (suyo). Lo mismo pasa para n=64: o bien, se sienta en el 1 o en el 64 (el suyo) y así para todos los n.
La cosa es interesante: independientemente de la cantidad de asientos hay un 50% de probabilidades de que “U” se siente en su asiento. Es más, el último pasajero solamente tendrá dos opciones: o bien se sienta en su asiento o bien se sienta en el de la vieja…

En fin… una aproximación muy poco analítica (y sin fórmulas) en una tarde aburrida.

PS: me acabo de dar cuenta de que le robé el título a Andy Tow... 



Comentarios

Entradas populares de este blog

El último teorema de Fermat y la unidad de la ciencia

Inferencia ecológica (o una introducción a algunos posts que se vendrán)

Cortame la boleta...