N.B.: Una catena di Markov ha uno stato corrente che cambia a ogni iterazione, attraversandola. L’input è ricevuto tutto insieme all’inizio, inizializzando la catena stessa; invece l’output è la catena stessa di stati attraversati, prodotta a ogni transizione.

Una catena di Markov a tempo discreto (DTMC) è una tupla tale che:

  • è un insieme vuoto, finito o infinito che contiene i valori dell’input che può essere ricevuto all’inizio.
  • è un insieme non vuoto, finito o infinito che contiene gli stati.
  • è un insieme non vuoto, finito o infinito che contiene i valori di output prodotti appena si arriva nei vari stati, cioè gli stati stessi.
  • La funzione definisce la probabilità di transizione da uno stato a uno stato dato un input . Essa è pari a , cioè la probabilità condizionata di passare allo stato se la DTMC ha come stato corrente . La somma delle probabilità di tutti gli stati successivi di un determinato stato è 1. Nel continuo, vale che
  • La funzione è la funzione di output, che definisce l’output prodotto dalla DTMC a un determinato passo.

La probabilità di un cammino su una catena di Markov è il prodotto delle probabilità di ogni transizione del cammino.

Una rete di catene di Markov è essa stessa una catena di Markov.

Notazione

Avendo una catena , è il suo input, il suo stato corrente e il suo output.

Esempio di catena di Markov

  • Per calcolare la probabilità che il processo termina in esattamente mesi, bisogna trovare a mano tutti i cammini che durano mesi, calcolarne le probabilità (prodotto delle probabilità di ogni transizione del cammino) e sommarle.
  • Si può anche fare l’inverso, cioè calcolare la probilità incognita di una singola transizione fra due stati in modo che il processo termina in esattamente mesi è almeno così:
    1. si trova il cammino che dura mesi,
    2. si risolve . Questo può servire a capire quando “deve essere bravo” il team che si occupa di un determinato stato del design del progetto.

Implementazione mia in Python

import random
 
def traverse(graph, start, end):
    output = []
    current = start
    i = 0
    while current != end:
        i += 1
        print(f'{i}. {current}')
        output.append(graph[current]['months'])
        current = random.choices(
            population=[next for next, p in graph[current]['next']],
            weights=[p for next, p in graph[current]['next']],
            k=1
        )[0]
    return output
 
 
graph = {
    'Requirements definition': {
        'months': 2,
        'next': [
            ('System development', 0.7),
            ('Requirements definition', 0.3),
        ]
    },
    'System development': {
        'months': 4,
        'next': [
            ('System development', 0.2),
            ('Requirements definition', 0.2),
            ('System testing', 0.6)
        ]
    },
    'System testing': {
        'months': 2,
        'next': [
            ('System development', 0.2),
            ('Requirements definition', 0.1),
            ('System testing', 0.1),
            ('END', 0.6)
        ]
    }
}
 
output = traverse(graph, 'Requirements definition', 'END')
print(f'\nmonths: {output}')
print(f'sum: {sum(output)}')

Output che mi è capitato:

1. Requirements definition
2. Requirements definition
3. System development
4. System development
5. System testing
6. System testing
7. System development
8. System testing
9. System development
10. System testing

months: [2, 2, 4, 4, 2, 2, 4, 2, 4, 2]
sum: 28

Istogramma dei risultati di un milione di catene

import matplotlib.pyplot as plt
 
n = 1_000_000
samples = [
    sum(traverse(graph, 'Requirements definition', 'END'))
    for _ in range(n)
]
 
plt.hist(samples, bins=50, color='skyblue', edgecolor='black')
plt.xlabel('Months')
plt.ylabel('Frequency')
plt.show()
 

Media = ~18.09 mesi per un progetto completo.

Tempo di soggiorno nella catena di Markov

A stati numerabili

Consideriamo un modello semplificato della catena di Markov, cioé una tupla dove è un’insieme numerabile non vuoto di stati e è la probabilità di transizione della catena di Markov, che soddisfa la condizione .

Ad esempio, possiamo definire una catena di Markov

N.B.:

A stati finiti

Nella catena , se ha cardinalità finita, può essere rappresentata come una matrice che chiamiamo la matrice di transizione , indicizzata da sulle colonne e sulle righe, definita come , ovvero la probabilità che dallo stato si transiti nello stato . La colonna rappresenta lo stato da cui si parte e la riga rappresenta lo stato prossimo a cui si arriva.

Segue che:

La rappresentazione della transizione come una matrice ci permette di calcolare la distribuzione di probabilità dalla distribuzione in un singolo passaggio usando un prodotto vettore-matrice:

Per modellare un processo stocastico temporale, possiamo usare:

Dove è l’istante corrente, il prossimo, lo stato all’istante e lo stato all’istante .


Un self-loop è una transizione da uno stato a se stesso. La sua probabilità è denotata .

La distribuzione della probabilità di salto da , denotata è la probabilità che si facciano self-loop da in prima di prendere una transizione da a .

Quindi:

N.B.: .

Tempo di soggiorno

Il tempo atteso di soggiorno nello stato , denotato è il valore atteso del numero di self-loop fatti prima di lasciare :

todo