Todos los desafíos
Fácil 0 resueltos 0% de aceptación

Distribución de estados de una cadena de Markov

Propaga una distribución de probabilidad a través de la matriz de transición de una cadena de Markov durante varios pasos.

Lo que aprenderás

  • Propagar una distribución de probabilidad
  • Multiplicar por una matriz de transición
  • Ver surgir el comportamiento a largo plazo

Problema

Ver original (inglés)

Una cadena de Markov pasa de un estado a otro al azar, y el siguiente estado depende solo del actual. transition[i][j] es la probabilidad de pasar del estado i al estado j, así que cada fila suma 1.

Si p es la probabilidad de estar en cada estado ahora, la distribución un paso después es:

p_next[j] = Σ sobre i de p[i] × transition[i][j]

Implementa markov_distribution(transition, start, steps) y aplica esta actualización steps veces.

Entrada

transition: Una matriz n × n cuyas filas suman 1.

start: La distribución inicial (n valores que suman 1).

steps: Cuántos pasos dar.

Salida

Devuelve la distribución después de steps pasos.

Restricciones

1 ≤ n ≤ 50, 0 ≤ steps ≤ 1.000

0 ≤ cada probabilidad ≤ 1

Ejemplos

Ejemplo 1
Entrada:
start = [1.0, 0.0]
steps = 2
transition = [
    [0.9, 0.1],
    [0.5, 0.5]
]

Salida esperada:
expected = [0.86, 0.14]
Entrada:
std::vector<double> start = {1.0, 0.0};
long long steps = 2;
std::vector<std::vector<double>> transition = {
    {0.9, 0.1},
    {0.5, 0.5}
};

Salida esperada:
std::vector<double> expected = {0.86, 0.14};
Entrada:
double[] start = new double[] {1.0, 0.0};
long steps = 2;
double[][] transition = new double[][] {
    new double[] {0.9, 0.1},
    new double[] {0.5, 0.5}
};

Salida esperada:
double[] expected = new double[] {0.86, 0.14};

Explicación

Piensa en días soleados (0) y lluviosos (1), empezando con sol. Tras un paso: [0.9, 0.1]. Tras dos: soleado = 0.9 × 0.9 + 0.1 × 0.5 = 0.86 y lluvioso = 0.9 × 0.1 + 0.1 × 0.5 = 0.14.

Ejemplo 2
Entrada:
start = [0.25, 0.75]
steps = 3
transition = [
    [0.0, 1.0],
    [1.0, 0.0]
]

Salida esperada:
expected = [0.75, 0.25]
Entrada:
std::vector<double> start = {0.25, 0.75};
long long steps = 3;
std::vector<std::vector<double>> transition = {
    {0.0, 1.0},
    {1.0, 0.0}
};

Salida esperada:
std::vector<double> expected = {0.75, 0.25};
Entrada:
double[] start = new double[] {0.25, 0.75};
long steps = 3;
double[][] transition = new double[][] {
    new double[] {0.0, 1.0},
    new double[] {1.0, 0.0}
};

Salida esperada:
double[] expected = new double[] {0.75, 0.25};

Explicación

Esta cadena siempre cambia de estado, así que cada paso intercambia las dos probabilidades. Tras 3 intercambios: [0.75, 0.25].

Referencias

Este reto está adaptado para CodeUtility. Sigue el enunciado y las restricciones indicadas arriba.

Aprende de otros

Soluciones de la comunidad

Aún no hay soluciones publicadas. Resuelve este reto para compartir la primera.