Le macchine sono state create per fare calcoli, gestire dati e “pensare”. La cosa in comune tra tutte le macchine è l’approccio analitico al problema. Boole creò una sorta di logica, detta algebra di boole, che fa da fondamenta tra matematica e macchina. Si basa su due soli simboli 1 e 0, e introduce anche i connettivi logici. Oltre a Boole, anche Alan Turing costruisce la sua macchina, e John von Neumann idealizza una architettura. Grazie a questi sviluppi, negli anni 40 si sente la necessità di creare calcolatori general purpose, e si deve pensare a come programmarli. Qui nasce il concetto di algoritmo come serie di passi finiti come soluzione ad un problema. Successivamente si introducono i primi linguaggi ad alto livello. Con i progetti che diventavano sempre più grandi e ingestibili si iniziò a dividere il software in due parti, ovvero il main e le subroutine, e successivamente si introdussero i linguaggi ad oggetti.

Si creò anche un’altro concetto di computer, ovvero un sistema che apprende e interagisce da solo, che varia nel tempo e basato su sistemi naturali.

I sistemi dinamici sono sistemi che cambiano nel tempo seguendo precise leggi, attraverso gli attrattori che eseguono le elaborazioni. Lo spazio degli stati è un iperspazio sui cui assi sono riportati i valori delle variabili del sistema. I punti fissi sono stati che non cambiano nel tempo.

Agenti

Dal latino agentis. Un agente è qualcuno che agisce in nome di qualcun altro, con il potere di agire su delega.

Agenti autonomi

Un agente ha uno scopo preciso, è delegato, e sa cosa deve fare (ha il potere e permesso di agire). È un’entità computazionale autonoma collocata in un ambiente, che:

  • è in grado di percepire anche solo parzialmente l’ambiente in cui si trova
  • ha solo una rappresentazione parziale dell’ambiente
  • è in grado di agire nel suo ambiente
  • è guidato da una serie di tendenze
  • può interagire direttamente con altri agenti, portando alla creazione di strutture di più alto livello
  • possiede abilità e può fornire servizi
  • può essere in grado di riprodurre se stesso

Un agente è un’unità computazionale (programma software, robot) che può essere in grado di percepire ed agire nel suo ambiente e ha un comportamento autonomo che almeno parzialmente dipende dalla sua esperienza personale.

Gli stati di un agente possono essere costanti o variabili nel tempo.

Un agente è descritto da due paradigmi:

Paradigma debole

Un agente è un sistema:

  • autonomo
  • reattivo (percepisce l’ambiente e reagisce ai cambiamenti)
  • proattivo (comportamento diretto ad obiettivi)
  • abilità sociale (comunicazione con altri agenti/umani)

Paradigma forte

Alle proprietà del paradigma debole, si aggiungono proprietà più “umane”:

  • conoscenza
  • intenzioni
  • emozioni
  • senso di obbligo
  • scopi

Di un agente si guarda:

  • mobilità in un ambiente
  • verdicità, correttezza nel riprodurre le informazioni
  • benevolenza, correttezza nelle azioni
  • razionalitò, coerenza tra azioni e obiettivi

Esistono diverse classi di agenti:

  • Logic-based: decisione realizzata tramite deduzioni logiche
  • Reactive: decisione realizzata tramite forme di mappatura diretta della situazione all’azione
  • Belief-desire-intention (BDI): decisione dipende dalle manipolazioni delle strutture dati che rappresentano aspettative, desideri e intenzioni dell’agente
  • Layered: decisione realizzata attraverso vari livelli, ciascuno dei quali è più o meno esplicitamente dotato di capacità cognitive riguardo l’ambiente

Gli agenti vengono descritti tramite un comportamento teleonomico (diretto verso uno scopo) oppure riflessivo (regolato sulle proprie percezioni).

Si possono suddividere in agenti cognitivi, e agenti reattivi (embodied). Gli agenti cognitivi hanno una rappresentazione esplicita del mondo, e possono reagire basandosi su rappresentazioni del mondo, memorizzare situazioni da analizzare, pianificare il proprio comportamento, prevedere le conseguenze delle proprie azioni e costruire piani per ottimizzare il lavoro.

Gli agenti reattivi/embodied, invece, si basano su una rappresentazione simbolica del mondo, e possono reagire ad eventi, non possiedono piani prestabiliti e possono far emergere comportamenti complessi anche se modellati con regole semplici.

Sistemi multiagente

Un sistema multiagente è un sistema dove più agenti comunicano tra loro. Questi sistemi esistono perché un solo agente in grandi ambienti non è abbastanza, e le informazioni che può memorizzare sono limitate. Gli agenti embedded sono utilizzati nei sistemi di controllo automatici multi-agente, dove gli agenti si coordinano per svolgere il lavoro.

Swarm intelligence

La swarm intelligence è un gruppo di componenti espressi da un grande numero di individui, che collettivamente esegue un compito, e dove nessun singolo individuo può essere definito intelligente. L’intelligenza collettiva emerge dalle interazioni tra gli agenti, e quindi è il sistema che nel complesso lavora in modo intelligente. L’intelligenza è quindi valutata ad alto livello. In questo gruppo, gli individui non hanno una visione globale dell’ambiente in cui sono.

Sistema adattivo Spessosi basa su scelte casuali degli individui, in modo da raggiungere schemi di auto organizzazione, di sfuggire ai minimi locali e di reagire ai cambiamenti ambientali. Per questo nessuna configurazione è quella finale.

Un sistema parte da una situazione di disordine, per poi arrivare in una situazione di ordine dopo un certo tempo. I sistemi di swarm intelligence si possono auto organizzare e possono cambiare il comportamento globale per reagire agli stimoli ambientali. Ci possono essere 3 meccanismi:

  • individui: percepiscono l’ambiente e reagiscono ad un semplice meccanismo azione-reazione
  • interazioni: comunicazioni indirette
  • ambiente: ambiente in cui vivono gli individui e con cui possono interagire- Può avere proprietà proprie e processi attivi in grado di modificare le proprie caratteristiche

In un sistema così si possono trovare:

  • retroazioni positive di attivazione o rinforzo, per le quali il comportamento di un individuo può sollecitare altri individui a comportamenti simili, affinchè molti individui si comportino in maniera organizzata.
  • retroazioni negative di controllo o inibizione, per le quali il comportamento di un singolo può evitare che altri individui convergano sul medesimo comportamento così da impedire che il sistema raggiunga un equilibrio stabile.

Per raggiungere l’auto organizzazione sono necerrarie grandi masse di individui, in modo da esplorare vaste zone e tollerare malfunzionamenti locali. Dal momento che gli individui interagiscono in modo locale, si perde la definizione di risultato e la configurazione finale non può essere predetta.

  • Sincronizzazione: lucciole
  • Ordinamento: ant sorting
  • Procacciamento delle risorse: ant foraging
  • Movimento librato: boids/stormi
  • Costruzione magazzini: termiti

Algoritmi genetici

Possono essere usati per cercare il valore massimo di una data funzione, o quando non è nota la funzione da analizzare.

Gli algoritmi genetici si ispirano ai sistemi naturali, che sono in grado di apprendere e di evolversi. Il nome genetico è dato dal fatto che questi algoritmi implementano meccanismi concettualmente simili a quelli dei processi biochimici scoperti dalla genetica.

Le specie apprendono implicitamente alcune caratteristiche del proprio ambiente, ma i cambiamenti che vengono acquisiti durante la vita non sono ereditabili. Le specie si evolvono perché ci sono differenze casuali negli individui e l’ambiente favorisce i portatori di caratteri vantaggiosi.

Due specie che occupano lo stesso territorio, competono per le stesse risorse e per questo una delle due prima o poi sparirà o si evolverà.

Se tutti i discendenti si riproducessero, le risorse finite finirebbero in breve tempo.

diploidismo.

I geni vengono trasmessi in maniera discreta. Il DNA è costituito da una sequenza di nucleotidi, che a loro volta contengono una base azotata (A, C, G, T), e contiene le informazioni per sintetizzare l’RNA e le proteine, che svolgono un ruolo strutturale e controllano le attività chimiche nella cellula.

Meccanismi casuali determinano le mutazioni, e prevale l’ipotesi di cambiamenti graduali.

Evoluzione ed apprendimento sono molto simili:

  • evoluzione: una specie apprende le caratteristiche dell’ambiente in modo implicito.
  • apprendimento: processo di generazione di diversi comportamenti alternativi e di selezione di quelli più adatti.

fitness

La fitness di un individuo è definita come il numero di discendenti fertili. Un vantaggio in termini di fitness tra due popolazioni nello stesso ambiente causa la colonizzazione. La fitness media cresce al crescere del numero di iterazioni e tende a raggiungere quella dell’individuo migliore. Quando si avvicina sufficientemente, l’algoritmo può essere arrestato.

Un insieme di soluzioni è detto popolazione. Una sequenza di 0 e 1 è detta cromosoma. Ogni cromosoma codifica un particolare insieme di valori, e ad ogni insieme di valori è associata la fitness.

È necessario codificare soluzioni come individui, e utilizzare come fitness di un individuo una misura di qualità della soluzione che esso rappresenta. Per imitare la selezione naturale si esegue:

  1. valutare gli individui della popolazione
  2. selezionare i più adatti
  3. ricombinarli
  4. mutarli
  5. generare la nuova popolazione

Quando si mescolano le soluzioni esistenti, si crea una nuova soluzione detta crossover. Questa soluzione può essere di gran lunga migliore delle due di partenza, ma non può generare tratti non presenti in nessuno dei due genitori. Questo crossover permette di esplorare aree anche molto distanti dallo spazio di ricerca di partenza, ma è limitato.

È proprio per le limitazioni del crossover che esiste la mutazione puntuale, che altera alcuni tratti di un individuo. Si può applicare in due diversi modi:

  • la soluzione crossover viene mutata in una posizione casuale
  • un genitore viene mutato e poi si genera il figlio

Uno schema è un insieme di individui che hanno una parte in comune, ed è definito da una stringa di lunghezza L di elementi appartenenti all’alfabeto {1, 0, #} (esempio: {#111##10, 1101#1#0}), dove # è indifferente.

Il crossover può eliminare uno schema buono, ed è per questo che si preferiscono schemi corti con fitness elevata. Senza crossover, gli individui si replicherebbero senza mutazioni, e si arriverebbe ad avere una popolazione di individui tutti uguali, detta convergenza prematura.

Rallentare la convergenza:

  • scegliere i genitori in proporzione alla fitness. Può però far scomparire gli individui più performanti e convergere prematuramente se un individuo è di molto superiore alla media.
  • elitismo: si garantisce la sopravvivenza di individui con fitness più alta.
  • torneo: si scelgono n individui (uno può essere scelto più volte) con fitness alta. Tra questi n individui si prende quello con la fitness più alta, e si itera fino a generare n nuovi individui.

Crossover ad un punto si considerano due soluzioni adatte. Si tagliano in un punto casuale, così da avere due teste e due code, e si ricombinano scambiandole.

Reti neurali

Le reti neurali, come i sistemi dinamici e i software, si dividono in fase di input e fase di output. Le reti neurali si basano su un modello computazionale che a sua volta si basa sulla manipolazione di simboli fisici. I primi erano sistemi simbolici, con regole del tipo “se… allora…”, ma erano fragili alla presenza di contraddizioni.

Come altri componenti nel campo dell’intelligenza artificiale, anche le reti neurali si ispirano alla biologia. In particolare si ispirano a studi sul funzionamento del cervello, dove si scoprì che il modello un neurone un concetto era sbagliato. Il neurone infatti trasmette un impulso lungo l’assone se la somma dei suoi ingressi supera una certa soglia. Se arrivano molti input in un breve periodo ad un neurone, questo “spara”. Inizialmente si propose un modello semplificato dove il neurone viene aggiornato a tempi discreti, così da descriverlo con una logica booleana dove non si considera l’affievolimento graduale del segnale, ma piuttosto si ha 1 dove spara o 0. Ogni neurone spara se supera la soglia minima. Il modello di neurone a soglia può calcolare ogni funzione logica finita.

Con l’aggiunta di elementi simili ai neuroni, si dimostrò che era possibile calcolare ogni funzione logica, risultato molto interessante perché significava creare un sistema capace di apprendere automaticamente quali sono i giusti valori di connessione e soglie. Il probelma era che non non si sapeva come costruirlo.

Alla base delle reti neurali c’è il riconoscimento dei pattern. Il modello di Hopfield è un tipo di rete neurale artificiale che simula le capacità del cervello umano di ricordare le cose o di ricostruire le immagini distorte. Ogni neurone è numerato da 1 a N, e ha un peso. Questo modello separa la parte di apprendimento e quella di riconoscimento. L’apprendimento modifica i pesi dei neuroni, e deve fare in modo che la rete vada in una direzione utile. Per l’apprendimento di un pattern, se due neuroni sono entrambi accesi o spenti deltaW(differenza di peso) = +1, mentre se uno è acceso e l’altro spento, deltaW = -1. Nella fare di riconoscimento, invece, la rete evolve mantenendo costanti le connessioni.

Percettroni

Il modello di Hopfield può memorizzare meno pattern rispetto ad altri modelli, dal momento ha interferenze tra pattern diversi (permette di apprendere pattern simili tra loro) e manca la distinzione tra input e output dei neuroni. L’apprendimento è quindi limitato.

Le reti a strati sono una alternativa al modello di Hopfield. Sono composte da uno strato di neuroni in ingresso e uno in uscita. Il neurone booleano può essere usato per distinguere gli input in due classi. I neuroni in ingresso presentano valori continui, mentre quelli in uscita hanno valori booleani.

L’apprendimento nelle reti a strati è simile a quello di Hopfield. Ogni neurone ha un peso iniziale casuale. Avendo una serie di esempi con la corretta classificiazione, in corrispondenza di un certo caso in ingresso, la rete fornisce una classificazione (sopra o sotto soglia). Se la classificazione è sbagliata si modificano i pesi. L’apprendimento corrisponde alla modifica dei pesi similmente a Hopfield, ma in questo caso è casuale e dipende dalle risposte della rete. Aggiungendo un neurone in ingresso con peso w0=-T e x0=1 è possibile trovare automaticamente un valore dei pesi he consenta di realizzare la funzione desiderata.

Il percettrone è un classificatore binario che mappa i suoi ingressi x in un valore di output f(x) calcolato con , dove X è la funzione di output, <w,x> è il prodotto scalare, w è un vettore di pesi e b è una costante.

Con y output del percettrone, W vettore di pesi, yd risultato desiderato e E>0, si ripete la seguente sequenza finchè W non resta costante per un certo numero di volte:

  1. si applica il percettrone
  2. se y=yd, W(k+1) = W(k)
  3. se y < yd, W(k+1)=W(k) + Ex
  4. se y > yd, W(k+1) = W(k) - Ex
  5. Incrementa k

Nella fase di addestramento di aggiornano i pesi con 2 set, quello di training, che contiene un insieme di pesi usati per adattare i pesi della rete, e quello di test, per valutare la qualità dell’apprendimento.

L’algoritmo del percettrone è efficace solo se la rete ha due strati e si basa sul confronto tra output ottenuto e quello desiderato.

Esiste un algoritmo di apprendimento che si applica a neuroni continui, che possono essere usati per l’approssimazione di funzioni a valori reali.

I percettroni a più strati vengono addestrati con un procedimento simile a quello per i percettroni semplici.

  1. si presenta un pattern del training set
  2. si veridica la risposta
  3. eventuale correzione dei pesi
  4. presentazione pattern successivo

Un percettrone a due stati può imparare un numero limitato di casi, e per questo per una maggiore classe di funzioni si devono introdurre strati intermedi.

MLP - Multilayer perceptron

Rete formata da uno o più strati interni di neuroni nascosti. Per questo tipo di reti si utilizza un metodo detto di retropropagazione del gradiente, con il quale si modificano i pesi del primo strato conoscendo l’output dell’ultimo strato, consente di calcolare le modifiche ai pesi verso i neuroni nascosti.

Sistemi a classificatori

La rappresentazione della conoscenza è composta da regole “se [condizione] allora [azione]“. La conoscenza è quindi composta da regole e fatti specifici relativi al caso in questione.

Mycin fu il primo sistema ad intelligenza artificiale per riconoscere le malattie infettive. Ipotizzava una diagnosi, e tramite backward chaining in profondità andava a cercare le informazioni a supporto dell’ipotesi.

Prospector fu un sistema basato su AI per la ricerca di giacimenti minerari.

Dendral du un progetto basato su AI per l’analisi di composti mediante spettrometria.

I software odierni sono pesanti e difficili da mantenere, mentre AI sono più efficienti e naturali. I primi successi crearono grandi attese, con la convizione sbagliata che creare sistemi esperti fosse facile e veloce. Per la creazione di sistemi esperti ci furono diversi problemi:

  • acquisizione e rappresentazione delle conoscenze
  • tempo per lo sviluppo
  • dinamicità delle conoscenze
  • assenza di prestazioni sovrumane

Le reti neurali sono un approccio alternativo a quello simbolico. I sistemi a classificatori, infatti, apprendono lo svolgimento di un compito interagendo con un ambiente parzialmente ignoto, tramite l’uso di meccanismi di feedback per guidare la propria evoluzione interna che modifica le regole del mondo. Il sistema si basa su regole inziali, e ne vengono generatedi nuove man mano che si va avanti nel tempo, e si interagisce con il mondo. Sono ad esempio usati per permettere ai robot di muoversi in un ambiente.

Il sistema a classificatori scambia messaggi (stringhe binarie di lunghezza L) con l’ambiente tramite effettori, e ne riceve dall’esterno tramite detettori. Se un messaggio è conosciuto, cerca di impostare l’azione da eseguire relativamente a quel messaggio.

Esistono due tipi di sistemi:

  1. a dinamica rapida: assegnano un valore diverso per ogni regola sulla base del loro contributo al buon funzionamento
  2. a dinamica lenta: basate su algoritmi genetici, valutano le regole vecchie e nuove ed eliminano quelle meno utili per sotituirle con combinazioni più utili

Il ciclo di un sistema a classificatori è:

  1. aggiungo alla lista nuovi messaggi dai detettori
  2. confronto i messaggi con le condizioni (stringhe di lunghezza L di simboli {0, 1, #})
  3. classificatori che soddisfano le condizioni competono per impostare i loro messaggi
  4. classificatori vittoriosi (la scelta viene effettuata in maniera probabilistica) eseguono le azioni (stringhe di lunghezza L di simboli {0, 1, *}).

La specificità di un classificatore è la frazione di elementi diversi del carattere # nella condizione (specialità = (L- num#)/L).

La competizione è la funzione della specificità e della forza del classificatore.

La forza di un classificatore è la misura della sua utilità dimostrata per il funzionamento.

Vita artificiale

La vita artificiale cerca di capire i fenomeni del mondo vivente simulandoli in sistemi artificiali basandosi su algoritmi genetici. La visione unificata di tutti questi fenomeni è resa possibile dall’utilizzo di metodi e modelli applicativi a molti livelli di descrizione. Ci si ispira all’evoluzione per risolvere i problemi computazionali per svariati motivi, come ad esempio calcolo di funzioni in ambienti che cambiano, impossibilità di utilizzare altri algoritmi, costruzione di soluzioni nuove ed originali.

Per valutare l’adattamento della vita artificiale si utilizza la fitness. I fattori principali dell’evoluzione sono 3:

  1. ad evolvere è un gruppo di organismi inter-fecondi
  2. la variabilità è una condizione esistenziale
  3. l’evoluzione si verifica a causa di una pressione selettiva

Gli algoritmi genetici sono procedure complesse, finalizzate alla risoluzione di problemi di ricerca ed ottimizzazione basati sui principi che regolano l’evoluzione. Sono usati per trovare i punti di massimo e minimo di una funzione obiettivo, che in questo caso è la fitness. Le menti artificiali sono costituite da un livello di neuroni in ingresso, uno o più strati di neuroni nascosti e uno ultimo strato di neuroni in output.