Soluzione dei problemi: processi euristici e processi algoritmici - Alessandro Barazzuol

Soluzione dei problemi: processi euristici e processi algoritmici

Il concetto di metodo informatico è collegato a quello di processo algoritmico ed entrambi si agganciano alle tecniche di risoluzione di problemi attraverso sistemi elettronici di calcolo.
Un problema è percepito come una situazione nuova, che non si sa con certezza come affrontare. Il concetto di “problema” può avere svariate accezioni in quanto può applicarsi sia a strumenti di valutazione nell’ambito di discipline specifiche, come nel caso di “problemi” di matematica o fisica, sia a metodologie di sviluppo per l’apprendimento integrato del sapere scientifico.

In generale, però, alla soluzione di tali situazioni problematiche non si perviene attraverso la deduzione o l’induzione, ma attraverso l’ideazione di una soluzione originale che non deriva dell’applicazione di principi astratti né dalla sola esperienza passata.
In linea di principio, sono solo due le tipologie principali di ragionamento
utilizzate nella risoluzione di problemi: algoritmi ed euristiche.

Un algoritmo


è un procedimento di calcolo che si basa sull’applicazione di un numero finito di regole che determinano in modo meccanico tutti i singoli passi del procedimento stesso. Nel Medioevo con il termine “algoritmo” si indicava ogni procedimento mediante il quale si eseguivano le operazioni tra i numeri naturali (ad esempio addizione, sottrazione, moltiplicazione e divisione) attraverso la loro rappresentazione decimale con le cifre arabe. In seguito il termine è stato esteso a indicare ogni procedimento che consente di risolvere un qualsiasi problema, relativo anche a enti non numerici, in modo meccanico, mediante l’applicazione di
un sistema esplicito di regole effettive. Per avere un’idea dei campi di maggior impiego di strategie basate sull’impiego di algoritmi, basti pensare che l’individuazione di algoritmi ha accompagnato la storia di tutti i settori della matematica, in quanto la dimostrazione di esistenza delle soluzioni per un qualunque problema è sempre stata accompagnata dalla ricerca di regole per “calcolare effettivamente” tale soluzione. Ma la ricerca di algoritmi ha assunto particolare rilevanza con l’affermarsi dell’informatica, in quanto i computer sono essenzialmente esecutori di algoritmi. Di conseguenza gli algoritmi – ideali per il funzionamento di una macchina con enormi capacità a livello di gestione di sistemi di memoria come il computer – spesso risultano inattuabili per gli esseri umani, in quanto richiederebbero di prendere in considerazione un numero talmente elevato di possibilità da risultare, quand’anche attuabili, del tutto antieconomici dal punto di vista del tempo e dell’impegno cognitivo.

Contrariamente a quello algoritmico, il procedimento euristico

è basato sull’intuizione e sullo stato temporaneo delle cose con l’obiettivo di generare una nuova conoscenza.
In informatica l’euristica è una regola pratica dettata dall’esperienza passata. Per risolvere un problema mediante un algoritmo, infatti, si utilizzano conoscenze specifiche che vanno al di là della definizione del problema stesso.
Quelli euristici sono procedimenti logici dominati dall’incertezza e quindi
legati al probabile e al possibile; i procedimenti algoritmici sono governati da logiche “certe”. L’algoritmo è tipicamente sequenziale (step by step), l’euristica, invece, è fondamentalmente reticolare. La procedura euristica è più rapida di quella algoritmica, ma il raggiungimento della soluzione corretta non è assicurato in quanto tale procedura si fonda su strategie di soluzione dei problemi basate sull’analisi di un numero limitato di alternative, selezionate in quanto ritenute le più promettenti, così da ridurre il tempo di ricerca rispetto all’esame completo e sistematico di tutte le possibili risposte.
Un esempio di euristica è l’analisi mezzi-fini, consistente nella progressiva riduzione della distanza tra la condizione di partenza e l’obiettivo da raggiungere. Tale riduzione si opera scegliendo, tra le alternative che si presentano in ciascun passaggio del processo di soluzione del problema, quella che avvicina maggiormente alla meta finale. È come se, percorrendo una strada, a ogni incrocio si scegliesse la via che conduce più vicino al posto in cui si vuole giungere. Le euristiche sono di conseguenza una procedura molto semplificata rispetto agli algoritmi, non indicando con precisione ogni azione che il soggetto impegnato nella soluzione del problema deve o dovrebbe intraprendere,
e non garantiscono, inoltre, il raggiungimento della soluzione del problema di partenza. In compenso sono particolarmente flessibili ed “economiche”, perciò vengono spesso utilizzate in maniera spontanea nella vita di tutti i giorni, anche con buoni risultati. Esse vengono utilizzate sia per la risoluzione di problemi di cui conosciamo dati certi su cui lavorare, sia per stimare situazioni dove è lasciato più ampio spazio alla possibilità, e si tratta quindi di stimare la probabilità di eventi che ci sono presentati, per procedere poi alla soluzione o a una valutazione della situazione stessa.
Nella risoluzione di problemi applicare un’euristica vuol dire innanzitutto
suddividere il problema in più fasi. La prima fase è realizzare l’esistenza di un problema (se non mi rendo conto di dover “fare” qualcosa, difficilmente cercherò di attuare una qualsiasi strategia solutoria), e comprenderne la natura (che informazioni possiedo? di quali informazioni ho bisogno?). Sulla base della rappresentazione del problema che ci si costruisce a partire da questa prima panoramica si passerà a cercare di impostare un piano per la soluzione del problema stesso (quali strategie impiegare, come impiegarle, che obiettivi intermedi proporsi, anticipare i possibili ostacoli o difficoltà e ipotizzare possibili strade alternative per evitarli ecc.); si tratterà poi di mettere in atto il piano ideato e infine di valutarne gli esiti. Tra tutte le fasi elencate la più importante per la buona riuscita del processo solutorio è la prima: fondamentale è infatti il modo in cui ci si rappresentano il problema, gli obiettivi da raggiungere.

Esempio di Algoritmo 
Calcolo MCD tra due numeri

int a,b
if (a>=0 AND b>=0)  then
while(a!=b)
if (a>b)
a=a-b
else
b=b-a
end if
end while

end if
return a


Esempio di algoritmo euristico 
Calcolo del circuito minimo percorrendo archi di peso minore 

Circuito C = Circuito(c.n)

int[] limiti = new int[1...n] ={0}

A={ ordino gli archi }
foreach (u,v) in A do
// se non ci sono gia due archi nel nodo e se non coincidono 
//allora aggiungo l'arco
if limiti[u] <2 and limiti[v] <2 and C.find(u)!=C.find(v) 
result.insert(u,v)
limiti(u)=limiti(u)+1
limiti(v)=limiti(v)+1
C.add(u,v)

//alla fine cerco i nodi che hanno solo un arco e li unico