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ì:
- si trova il cammino che dura mesi,
- 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 :