






Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Il documento contiene: Algoritmi -> sviluppi informatici importanti del 2020; Dove nasce l’informatica; Limiti degli Algoritmi; Limiti della Calcolabilità; Idea di algoritmo (pseudocodice).
Tipologia: Appunti
1 / 12
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!







Alcuni sviluppi informatici importanti del 2020 o AI-discovered molecules o Hyper-personalized medicine o Tiny-AI o Differential privacy Vedremo limiti che sono legati a qualcosa di più di un semplice problema tecnico tecnologico ma sono limiti che sono in qualche modo legati alle regole che esistono nel nostro universo esattamente come possono essere delle leggi della fisica o alcune verità derivate da teorie dei matematici, siamo su questo livello, che pur essendo un livello astratto, nel caso degli algoritmi il legame tra lavorare in maniera astratta con lo pseudo codice oppure altri sistemi e dopo trovarsi a tradurre/a passare dal design teorico all’implementazione pratica in realtà c’è un parallelismo abbastanza forte che in altre discipline in cui la pratica si distanzia alquanto da quello che si può fare nella teoria. C’è anche legame stretto tra teoria e pratica dei limiti. Dove nasce l’informatica Concetti legati al significato profondo della teoria dell’informazione che sono più legate a delle leggi che come le leggi della fisica o le regole della matematica regolano inevitabilmente anche tutto quello che riguarda la teoria dell’informazione. L’idea di algoritmo come sequenza di istruzioni passo dopo passo sequenziale e che fanno riferimento allo stato del sistema interrogando questo tramite l’uso di istruzioni condizionali che poi si rifanno all’utilizzo di un certo tipo di logica, quindi di ragionamento, possiamo fare delle cose più semplici come moltiplicare i numeri alle cose più raffinate come il sistema di controllo del riscaldamento e con un po’ di immaginazione possiamo anche capire come, complicando di più il nostro algoritmo, quindi aggiungendo ulteriori definizioni e ulteriori istruzioni si possa fare cose sempre più avanzate. Questa cosa la possiamo vedere guardando gli sviluppi tecnologici che ci sono di anno in anno. Alcuni degli sviluppi informatici del 2020, ci sono degli sviluppi di algoritmi avanzate rispetto al sistema di controllo della temperatura: Al-discovered molecules , è l’estratto di un algoritmo che riesce in qualche modo A scoprire nuove composizioni molecolari, perché è uno dei vantaggi dell’uso degli algoritmi è la possibilità di automatizzare alcuni processi e quindi concentrare lo sforzo manuale fisico mentale umano su altri aspetti sul quale la macchina fa più fatica. Hyper-personalized medicine , In ambito informatico tanti sviluppi sono molto legati alle medicine in questo caso si tratta di avere un algoritmo che è in grado di supervisionare la cura con termine di scelta di farmaci sulla base della valutazione di certi esami clinici di persone che hanno patologie molto particolari per le quali, oltre a non essere noto la cura esatta da applicare, non si riesce ad ottenere lo sforzo medico necessario per ognuna di queste singole persone. Quindi questo può essere molto interessante perché se si riesce a creare, come secondo questo articolo, degli algoritmi che siano in grado di fare questo lavoro ovviamente questo va direttamente a finire tali sviluppi più importanti
Tiny-Al , si rifà ai linguaggi della definizione dell’hardware, quindi si tratta di tradurre degli algoritmi che già esistono in versione, definiti tramite linguaggi di programmazione a definire in sistemi embedded, e quindi essere in grado di fare i compiti molto difficili utilizzando poche risorse e con alte performance. Si tratta del prendere gli algoritmi di intelligenza artificiale che già esistono e fanno cose utili solo che normalmente necessitano essendo i programmi necessita di un intero computer che li faccia funzionare. Qui si tratta di portare questi algoritmi in sistemi embedded molto piccoli dove l’obiettivo è ridurre al minimo le risorse che utilizzano sia in termini di energia che in termini di componenti utilizzate e che però mantengono alte le performance. Differential privacy , È una tecnica di protezione della privacy in cui l’idea è quella di avere sempre un algoritmo dietro che fa questa cosa in maniera automatica ed inserire all’interno delle banche dati dei dati fittizi, che la banca dati sa quali sono questi dati fittizi e quali no, al fine di impedire ad altri algoritmi di ottenere delle informazioni sulla base dei dati di tante utenti. La protezione dei dati è importante per proteggere i consumatori da campagne pubblicitarie troppo aggressive o troppo mirate quando il consumatore non lo desidera. Una novità per fare un po’ fronte a questo problema è quello della Differential privacy che fondamentalmente è un algoritmo che contrasta gli algoritmi che dei dati cercano di ricavare delle informazioni.
o Introduciamo due ‘misure’ per capire quali sono i limiti degli algoritmi p Calcolabilità q Ci chiediamo se, dato un problema, è possibile creare un algoritmo che sia sempre in grado di di dare ‘risposta’ p Complessità q Ci chiediamo qual’è il ‘costo’ della ‘risposta’ Questo negli ultimi anni ci sta riportando all’ottimismo che girava nei matematici del fine ottocento in cui è continuato poi nel ‘900. Con tutti questi sviluppi e avanzamenti in campo informatico si sta tornando a pensare a un certo tipo di ogni potenza possibile in campo informatico, dove sia in termini positivi quindi di aspettative legate a un certo tipo di ottimismo a fin di bene ma anche un certo tipo di paura dove c’è un certo pessimismo riguardo a questo strapotere dei sistemi informatici, c’è un po’ il bisogno di ridimensionarsi mentre è molto vero che si riescono a fare sempre più cose e si riusciranno a fare sempre più cose, esistono comunque dei limiti che non possono essere sorpassati. E che quindi sarebbe bene tenere a mente che aldilà di certe cose non potremo mai arrivare. Quali sono i limiti di questi algoritmi (è un sinonimo di programmi. I limiti degli algoritmi sono anche collegati ai limiti dell’informatica, ma sono limiti legati ai sistemi informatici in maniera forte, nel senso che non basta una semplice scoperta tecnologica per superarli perché sono limiti forti nel senso che sono regole di come funziona il nostro universo). Per capire questi limiti introduciamo due misure: calcolabilità e complessità. C’è una differenza fondamentale tra le due nel senso che rispondono a domande diverse.
massima è tre, però è una cosa puramente arbitraria e legata a questo esempio specifico. Immaginiamo che iniziamo questo gioco e ci vengono presentate queste tessere. Lo scopo del gioco è trovare un ordine con cui possiamo mettere queste tessere una di fianco all’altra. Il gioco è aggiustare l’ordine potendo riutilizzare la stessa tessera, quindi ad esempio possiamo dire metto la tessera uno, poi di fianco la tessera due, poi un’altra tessera uno e avanti così quindi si possono riutilizzare le tessere allo scopo di trovare un ordine per il quale la sequenza di caratteri della parte superiore in verde sia corrispondente alla sequenza di caratteri nella parte inferiore. u Il gioco ci chiede se possiamo, con le tessere date, costruire una serie (anche usando la stessa tessera più volte) in maniera tale da avere la stessa sequenza sopra e sotto. Qui vediamo un esempio in cui possiamo vincere questo gioco, sono esattamente le tessere dell’esempio precedente messe nell’ordine terza tessera, prima tessera, terza tessera, quarta tessera, e vediamo che alcune tessere possono essere anche non utilizzate se non ci servono, l’unica cosa che dobbiamo verificare è che se è possibile trovare un ordine anche ripetendo l’uso di quelle tessere per le quali la sequenza di caratteri sopra è uguale alla sequenza di caratteri sotto. v Possiamo vedere come alcuni set di tessere non abbiano soluzione v Immaginiamo che le tessere di un round siano le seguenti: Possiamo osservare che prendendo un certo numero di tessere, in questo caso quattro, ci accorgiamo che non c’è una soluzione. Prendiamo ad esempio questo set, fondamentalmente quello che si vede è che c’è un problema abbastanza evidente: il problema è che la lunghezza della sequenza di caratteri della parte superiore è sempre più grande della lunghezza della sequenza dei caratteri inferiori, quindi non importa come mettiamo le tessere o quante volte ripetiamo l’uso di una tessera, quando andiamo avanti e fondamentalmente la sequenza superiore sarà sempre più lunga di quella inferiore e quindi non potrà mai essere la stessa sequenza. Abbiamo visto quindi due esempi: un esempio qui abbiamo trovato l’ordine giusto di tessere per formare la stessa sequenza sopra e sotto e quindi vincere, invece abbiamo visto un caso della prospettiva del gioco sfortunato in cui abbiamo pescato delle tessere del sacchetto per la quale vediamo che non c’è modo di vincere.
w Poichè siamo ora fiduciosi dei poteri straordinari degli algoritmi decidiamo di ragionare in maniera algoritmica per vincere a questo gioco Siamo fiduciosi dei poteri conferitici dagli usi degli algoritmi e decidiamo di usare un approccio algoritmico e quindi di ragionare in questo senso per trovare una soluzione e vincere il gioco, cioè di sviluppare un metodo fatto di passi e di decisioni prese sulla base di valutazioni di espressione logica, quindi di un ragionamento logico molto semplice come la logica proposizionale. z Idea di algoritmo (pseudocodice)
di sequenza di lettere, allora primo poi la troviamo, però se non c’è soluzione andiamo avanti all’infinito cercando di aggiustare di aggiungere o fare una sequenza sempre più lunga cercando di far combaciare la sequenza sopra e sotto, senza mai riuscire ad arrivare nel punto in cui troviamo la soluzione nemmeno al punto in cui abbiamo una provo qualcosa che ci fa fermare o dire che ti percento è inutile andare avanti perché non c’è soluzione al massimo lo possiamo fare per stanchezza. Ci sono dei set di tessere per le quali non è possibile dire che non c’è soluzione. Per alcune set di tessere si può dire non c’è soluzione, per alcuni set di tessere si può dire c’è soluzione basta trovarle e per altri set di tessere non si riesce a dire che non c’è soluzione. A questo punto potrebbe sembrare logico esigere l’esibizione di un esempio di set di tessere per le quali non c’è né soluzione, né la possibilità di verificarlo Ma questo è esattamente il problema della decidibilità, cioè per affermare qualcosa sull’esistenza o meno di una soluzione per un set di tessere bisogna avere un modo per verificarlo Quindi, non si può avere un esempio di tessere per il quale abbiamo sia verificato che non ammette soluzione e che al tempo stessa sia un set la cui assenza di soluzione sia NON verificabile Esistono però delle dimostrazioni in grado di provare almeno l’esistenza di tali set di tessere Non si può trovare un esempio di testo in cui non c’è soluzione. È questo il problema proprio perché non si può dire che questo set di tessere non ha soluzione può essere che invece una soluzione l’abbia. Se giochiamo una partita e prendiamo quattro tessere e verifichiamo che non siano casi strani per le quali possiamo dire immediatamente no qua non c’è soluzione, e quindi iniziamo a giocare, possiamo o giocare con la nostra strategia oppure seguire la strategia dell’algoritmo, questo non cambia di molto l’esito della nostra partita. Allora iniziamo a giocare e in ogni caso l’idea di gioco è trovare un ordine di tessere anche ripetendole, quindi non c’è un limite di lunghezza in cui bisogna stare per trovare la soluzione. Noi ci mettiamo a cercarlo e ad un certo punto lo troviamo, ma se non lo troviamo o ci stufiamo oppure andiamo avanti proviamo nuove combinazioni, aumentiamo la lunghezza e ci sono sempre cose nuove che possiamo provare, perché non essendoci un limite di lunghezza massima di questa combinazione uno non può dire le ho provate tutte, perché finché stiamo riuscendo a tenere la riga sopra uguale a quella sotto fino a un certo punto a meno di dovrà aggiungere qualcos’altro per finalizzarle, per chiudere in maniera che sia uguale sopra e sotto completamente possiamo sempre provare ad aggiungere tessere, ed andiamo avanti così. Però se siamo nel caso in cui il set di tessere non ha soluzione non c’è modo di verificarlo perché non sapremo mai se andando avanti e provando un po’ più di combinazioni o un po’ più di lunghezza la nostra sequenza di tessere magari la soluzione la troviamo nei prossimi 10 tentativi o nei prossimi 100 o nei prossimi 1000. Però non potremmo mai dire non la troverò mai, è quello che diciamo che stiamo giocando veramente finché non ne potremo più però non avremo mai la prova di questo mentre invece al contrario avremo la prova nel caso dovesse saltar fuori la soluzione del momento in cui si trova la soluzione la prova è la sequenza di tessere vincente. La prova del contrario non esiste, almeno esiste in casi particolari, ma ci sono
alcune sedi tessere per i quali la soluzione non esiste e non è possibile verificarlo perché non si arriva mai ad un punto in cui ci si ferma e si può dire con certezza assoluta che non si può vincere con quel set di tessere. L’unica cosa che possiamo fare è trovare nuovi tentativi e scoprire il contrario che andando avanti gli altri 10, 100, 100.000… passi la soluzione la troviamo. Ci sono delle altre proprietà che possono avere delle tessere per le quali si possono fare ragionamenti che ci possono portare a dire che è un certo punto stiamo solo ripetendo la stessa parte di sequenza e che quindi possiamo provare che non andremo mai a scoprire niente di nuovo che potrà farci chiudere la sequenza in maniera che sia uguale sopra e sotto, e a quel punto possiamo dire non c’è soluzione però la differenza fondamentale è che per la prova che la soluzione esiste la si può sempre trovare se esiste per esibizione del caso ovvero si esibisce si mostra qual è la sequenza vincente. Per dire questo set di tessere non fa vincere non possiamo stare una sequenza di tessere, non possiamo dire questa sequenza e te se non fa vincere, ovvero possiamo mostra la sequenza e dire che non fa vincere ma qui si tratta di dire il contrario, non si tratta di mostrare quella che fa vincere, ma si tratterebbe dimostrare che tutte le altre sequenze, o meglio tutte le sequenze in generale, lo fanno vincere e ovviamente è qui il problema: non si può verificare che tutta la sequenza possibili non facciano vincere quando non c’è un limite massimo della lunghezza della sequenza, ovviamente si possono trovare delle proprietà che sono proprietà delle singole tessere che generano delle condizioni per le quali si può, in maniera alternativa, non è per esibizione del caso, ma con altri tipi di dimostrazione, si può provare che non hanno non c’è soluzione. Però ci saranno comunque dei sette di tessere che non godono neanche di questa possibilità. Quindi ci si può insegnare e trovare nuove proprietà o nuovi modi per identificare set di tessere non vincenti, però ce ne saranno sempre alcuni per le quali non si riuscirà a trovare le sulla proprietà che ci possa far dire di smettere di provare che tanto la soluzione sicuramente non esiste. E quindi sono sette molto malvagi perché sono set di tessere per le quali o non c’è soluzione o non l’abbiamo ancora trovata. Non si può avere un esempio di tessere per le quali abbiamo verificato sia che non c’è soluzione e per le quali nel set di tessere non si può verificare che la soluzione non esiste perché sono una cosa uno contro dell’altra. Però esistono delle dimostrazioni che provano l’esistenza di questi set di tessere fantomatici che non hanno soluzione e non è possibile verificare in alcun modo. Non esiste non si può mai esibire un set di tessere che ha una soluzione e che non è verificabile proprio perché non sappiamo se questo set di tessere veramente non ha soluzione o semplicemente dobbiamo fare tantissimi passi per trovarla, quindi non si può trovare un esempio, però si può dimostrare in maniera indiscutibile che tali set di tessera esistono anche se non si sa quali sono non se ne può trovare degli esempi specifici ma esistono. Se ci fosse un limite il problema si risolveva nel mentre cambiando la regola del gioco e quindi se ci invitano a giocare questo gioco diciamo subito va bene però facciamo al massimo che le sequenze siano lunghe 10, allora il problema non sussiste perché una volta che abbiamo guardato tutte le combinazioni possibili lunghe da uno fino alle combinazioni possibili di lunghezza 10 abbiamo finito la soluzione o c’è o non c’è, e quindi in quel caso il problema non sussiste.
utilizzando una macchina immaginaria di Turing piuttosto che è una macchina vera come quella che usiamo tutti i giorni. ¶ Quindi è un problema è decidibile se esiste un algoritmo che funziona sul computer e che quindi si può scrivere con un linguaggio di programmazione che lo risolve, ovvero se abbiamo un problema e riusciamo a scrivere un algoritmo in un qualche linguaggio di programmazione che risolve il problema e questo intende che è sempre in grado di dare risposte e che quindi sia in grado di dire dato un input, date quattro tessere, sia sempre in grado di dire se la soluzione esiste, e in tal caso l’altra soluzione, oppure di dire che la soluzione non esiste allora il problema decidi bile. Il legame tra il livello teorico con il risvolto pratico è molto stretto e identico fondamentalmente: la macchina di Turing, pur avendo una memoria infinita non è in grado di superare dei limiti che sono identici anche sul computer vero. Quindi questo problema della non decidibilità o della non decidibilità di alcune cose è un problema che è indipendente dal modello di calcolatore che stiamo usando uno vero o un immaginario con la macchina di Turing, nella nostra testa non cambia assolutamente niente. Implicazioni rilevanti ¢ Non tutti i problemi sono decidibili ¢ Dei problemi non decidibili £ Alcuni problemi sono semi-decidibili (es. domino) £ I restanti non sono decidibili ¢ In particolare £ La logica proposizionale è decidibile £ La logica al primo ordine è semi-decidibile Questo è uno schema che mette in ordine il discorso sulla calcolabilità che è sinonimo di decidibilità del problema quindi sono due termini
che sono legati, ovvero la calcolabilità è poter dire se è un problema è decidibile oppure no. Quindi se un problema è decidibile è anche calcolabile, se è un problema è semi decidibile, oppure indicibile allora non è calcolabile. Un problema decidibile significa che per ogni possibile input di un problema, come nel caso della moltiplicazione, i due numeri da moltiplicare, nel caso del gioco delle tessere, le quattro o quante tessere vogliamo dipende da come vogliamo giocare, quali sono i particola queste quattro tessere, quindi per ogni possibile input scriviamo un algoritmo che funziona sulla macchina di Turing, e qui possiamo tradurre nella nostra testa la macchina di Turing come computer e quindi scrivere un algoritmo che poi scriviamo in un linguaggio di programmazione e poi facciamo funzionare, allora ci chiediamo se in un tempo finito, e questa è la condizione fondamentale che noi vorremmo calcolare le cose in un tempo finito, è in grado di dirci se questo possibile input, quindi se per ogni possibile input tale input è una soluzione del problema oppure no. Se noi riusciamo a scrivere un algoritmo con una macchina di Turing o per un computer che è in grado di fare questa cosa allora il problema è decidibile, se invece, come nel caso del gioco delle tessere ci chiediamo la stessa cosa ma ci accorgiamo che in un tempo finito è possibile solo dire se un importa è soluzione ma se non è soluzione, qua stiamo parlando per ogni possibile input quindi per tutti gli input, ad esempio del gioco delle tessere che hanno soluzione, riusciamo sempre a dire di sì basta avere sufficiente tempo magari ci impieghiamo 3 miliardi di anni però la soluzione possiamo trovare in 3 miliardi di anni di calcolo allora riusciamo a dire sì è un tempo finito non è tempo finito. Invece considerando tutti gli input che non hanno una soluzione per alcune abbia visto che si riesce a dire no, ma per altri non possiamo dirlo. Quindi ci troviamo in questo caso in cui per ogni possibile input se ha soluzione è sempre se il nostro algoritmo è un algoritmo che tranquillamente se le quattro tessere date solo soluzione del problema vi dirò prima o poi si altrimenti alcune volte può dir di no, altre volte andrà avanti all’infinito cercando di fare l’unica cosa che può fare ovvero dire se è soluzione, non può dire se non è soluzione. Può sembrato spaventoso l’idea di dire e se non c’è soluzione quando andremo avanti a cercarla, e sappiamo che ci sono dei problemi che sono indecidibili che per ogni possibile input possiamo scrivere un algoritmo che funziona sulla macchina di Turing, o che funziona sul computer, e tra l’algoritmo al più, qualche volta dipende dall’importo ma noi qui stiamo parlando di ogni possibile input, magari per qualche input saprà dire che questo è una soluzione del problema e quest’altro non è una soluzione del problema ma in generale non sa agire per ogni possibile input non può garantire di saper dire sempre se l’input è soluzione oppure non hai soluzione. Fondamentalmente, salvo alcuni casi specifici di input, non sa dire niente. Questi sono i problemi decidibili che sono di gran lunga più spaventosi dei problemi semi decidibili. Un problema decidibile è quando seconda tesi di Church-Turing è possibile scrivere un algoritmo in un qualche linguaggio di programmazione e lo faccio funzionare sul computer e tale algoritmo, a prescindere dall’input che gli do, sta sempre a dirmi se il problema per quell’input è risolvibile oppure no. Ad esempio il problema della moltiplicazione, ci chiediamo se è sempre possibile dire: dati due numeri da moltiplicare se si può fare la moltiplicazione oppure no. E ipotizziamo di voler dimostrare utilizzando l’ipotesi di Church- Turing, quindi prendiamo il nostro linguaggio di programmazione preferito e scriviamo un programma che fa la moltiplicazione tra due numeri, come vogliamo che sia perso mi ripetuto pure con altri sistemi, e se il nostro programma per ogni possibile numero che