Intelligenza Artificiale

A un certo punto non fu più la biologia a dominare il destino dell'uomo, ma il prodotto del suo cervello: la cultura.
Cosicché: "Le uniche leggi della materia sono quelle che la nostra mente deve architettare e le uniche leggi della mente sono architettate per essa dalla materia".
JAMES CLERK MAXWELL

Value Function Iteration


Codice Python di Iterazione

Value Iteration

Ecco un esempio di applicato a una griglia (4X 4) (un ambiente comune nei problemi di Reinforcement Learning).
Le azioni disponibili sono su, giù, sinistra, destra.
Utilizziamo la funzione di Bellman per calcolare i valori ottimali degli stati e derivare la politica ottimale.


import numpy as np

# Parametri della griglia
rows, cols = 4, 4  # Griglia 4x4
gamma = 0.9        # Fattore di sconto
theta = 1e-4       # Soglia di convergenza

# Azioni possibili
actions = {
    'up': (-1, 0),
    'down': (1, 0),
    'left': (0, -1),
    'right': (0, 1)
}

# Funzione per verificare se uno stato è valido nella griglia
def is_valid_state(state):
    r, c = state
    return 0 <= r < rows and 0 <= c < cols

# Funzione di transizione (stato successivo e probabilità)
def transition(state, action):
    r, c = state
    dr, dc = actions[action]
    next_state = (r + dr, c + dc) if is_valid_state((r + dr, c + dc)) else state
    return next_state

# Inizializzazione della funzione di valore
V = np.zeros((rows, cols))

# Ricompense: obiettivo a (3, 3), buca a (1, 1)
rewards = np.zeros((rows, cols))
rewards[3, 3] = 1    # Obiettivo
rewards[1, 1] = -1   # Buca

# Value Iteration
while True:
    delta = 0
    new_V = V.copy()
    for r in range(rows):
        for c in range(cols):
            state = (r, c)
            if state in [(3, 3), (1, 1)]:  # Stati terminali
                continue
            # Calcola il valore massimo usando la funzione di Bellman
            action_values = []
            for action in actions:
                next_state = transition(state, action)
                prob = 1.0  # Azioni deterministiche
                reward = rewards[next_state]
                action_values.append(prob * (reward + gamma * V[next_state]))
            new_V[state] = max(action_values)
            delta = max(delta, abs(new_V[state] - V[state]))
    V = new_V
    if delta < theta:
        break

# Derivare la politica ottimale
policy = np.full((rows, cols), '', dtype=object)
for r in range(rows):
    for c in range(cols):
        state = (r, c)
        if state in [(3, 3), (1, 1)]:  # Stati terminali
            policy[state] = 'TERMINAL'
            continue
        action_values = {}
        for action in actions:
            next_state = transition(state, action)
            prob = 1.0  # Azioni deterministiche
            reward = rewards[next_state]
            action_values[action] = prob * (reward + gamma * V[next_state])
        best_action = max(action_values, key=action_values.get)
        policy[state] = best_action

# Stampa i risultati
print("Funzione di valore ottimale:")
print(np.round(V, 2))

print("\nPolitica ottimale:")
for row in policy:
    print(row)


Spiegazione del codice


1. Parametri della griglia:
- La griglia è (4 X 4) con stati rappresentati come coordinate ((r, c)).
- Azioni: Su ((-1, 0)), giù ((+1, 0)), sinistra ((0, -1)), destra ((0, +1)).

2. Funzione di transizione:
- La funzione `transition(state, action)` restituisce lo stato successivo dato lo stato attuale e l'azione.
Se l'azione porta fuori dalla griglia, si rimane nello stato corrente.

3. Funzione di valore:
- La funzione di valore ( V(s)) viene inizializzata a zero per tutti gli stati.
- Gli stati terminali (((3, 3)) e ((1, 1))) non vengono aggiornati.

4. Value Iteration:
- Per ogni stato, si calcolano i valori attesi delle azioni utilizzando l'equazione di Bellman: \[ V(s) = \max_{a} \sum_{s'} P(s'|s, a) \cdot \left[ R(s, a) + \gamma V(s') \right] \]
- In questo caso, le azioni sono deterministiche, quindi ( P(s'|s, a) = 1 ).
5. Politica ottimale:
- Dopo la convergenza di ( V(s) ), si calcola la politica ottimale ( pi(s) ) scegliendo l'azione che massimizza il valore atteso.

6. Risultati:
- La funzione di valore ( V(s) ) e la politica ottimale ( pi(s) ) vengono stampate.

Esempio di output


Funzione di valore ottimale:
[[0.53 0.59 0.66 0.73]
 [0.48 0.   0.73 0.81]
 [0.43 0.53 0.66 0.9 ]
 [0.39 0.48 0.59 1.  ]]

Politica ottimale:
['right' 'right' 'right' 'down']
['up' 'TERMINAL' 'right' 'down']
['up' 'right' 'right' 'down']
['up' 'up' 'up' 'TERMINAL']

Conclusioni


- La funzione di valore mostra i valori ottimali ( V^*(s) ) per ogni stato.
- La politica ottimale indica l'azione migliore da intraprendere in ogni stato per raggiungere l'obiettivo massimizzando la ricompensa.
- Questo approccio può essere esteso a griglie più grandi o ambienti più complessi.