Lezione 1 - Nozione di Algoritmo



Documenti analoghi
Il sapere tende oggi a caratterizzarsi non più come un insieme di contenuti ma come un insieme di metodi e di strategie per risolvere problemi.

INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI INTRODUZIONE AGLI ALGORITMI

Fasi di creazione di un programma

Nozione di algoritmo. Gabriella Trucco

Algoritmo. I dati su cui opera un'istruzione sono forniti all'algoritmo dall'esterno oppure sono il risultato di istruzioni eseguite precedentemente.

Sommario. Definizione di informatica. Definizione di un calcolatore come esecutore. Gli algoritmi.

Esempi di algoritmi. Lezione III

Processo di risoluzione di un problema ingegneristico. Processo di risoluzione di un problema ingegneristico

DAL PROBLEMA ALL'ALGORITMO AL PROGRAMMA SCRITTO IN Come. Scopo principale dell informatica è risolvere problemi con i calcolatori.

Informatica 3. Informatica 3. LEZIONE 10: Introduzione agli algoritmi e alle strutture dati. Lezione 10 - Modulo 1. Importanza delle strutture dati

Le parole dell informatica: modello di calcolo, complessità e trattabilità

Appunti sulla Macchina di Turing. Macchina di Turing

Lezione 8. La macchina universale

Matematica generale CTF

Scopo della lezione. Informatica. Informatica - def. 1. Informatica

APPUNTI DI MATEMATICA LE FRAZIONI ALGEBRICHE ALESSANDRO BOCCONI

DI D AGRA R MM M I M A BLOCC C H C I TEORI R A E D D E SERC R I C ZI 1 1

Tipologie di macchine di Turing

Dimensione di uno Spazio vettoriale

I Problemi e la loro Soluzione. Il Concetto Intuitivo di Calcolatore. Risoluzione di un Problema. Esempio

I sistemi di numerazione

Siamo così arrivati all aritmetica modulare, ma anche a individuare alcuni aspetti di come funziona l aritmetica del calcolatore come vedremo.

Progettaz. e sviluppo Data Base

Correttezza. Corso di Laurea Ingegneria Informatica Fondamenti di Informatica 1. Dispensa 10. A. Miola Novembre 2007

Descrizione di un algoritmo

Corso di Informatica

ALGORITMI e PROGRAMMI Programmazione: Lavoro che si fa per costruire sequenze di istruzioni (operazioni) adatte a svolgere un dato calcolo

Introduzione alla programmazione in C

SPC e distribuzione normale con Access

1. Distribuzioni campionarie

( x) ( x) 0. Equazioni irrazionali

Alla ricerca dell algoritmo. Scoprire e formalizzare algoritmi.

Capitolo 6: Modelli di calcolo per linguaggi imperativi e funzionali

Algoritmi e Complessità

Algoritmi e strutture dati. Codici di Huffman

Architettura hardware

Dispensa di Informatica I.1

Elementi di Informatica e Programmazione

Logica Numerica Approfondimento 1. Minimo Comune Multiplo e Massimo Comun Divisore. Il concetto di multiplo e di divisore. Il Minimo Comune Multiplo

Note del corso di Calcolabilità e Linguaggi Formali - Lezione 6

Metodologie di programmazione in Fortran 90

Fondamenti di Informatica. Allievi Automatici A.A Nozioni di Base

COS È UN LINGUAGGIO? LINGUAGGI DI ALTO LIVELLO LA NOZIONE DI LINGUAGGIO LINGUAGGIO & PROGRAMMA

Come ragiona il computer. Problemi e algoritmi

UD 3.4b: Trattabilità e Intrattabilità. Dispense, cap. 4.2

Esercizi su. Funzioni

4 Dispense di Matematica per il biennio dell Istituto I.S.I.S. Gaetano Filangieri di Frattamaggiore EQUAZIONI FRATTE E SISTEMI DI EQUAZIONI

Algoritmi e diagrammi di flusso

Le Macchine di Turing

Il principio di induzione e i numeri naturali.

ci sono più problemi che programmi esiste un problema che non si può risolvere con un programma

Cos è un Calcolatore?

risulta (x) = 1 se x < 0.

I ricavi ed i costi di produzione

Analisi e diagramma di Pareto

Introduzione. Informatica B. Daniele Loiacono

ALGEBRA DELLE PROPOSIZIONI

Complessità Computazionale

Capitolo 2. Operazione di limite

Corso di Matematica per la Chimica

Macchine di Turing, problemi ricorsivi e ricorsivamente enumerabili

Ricorsione. (da lucidi di Marco Benedetti)

RISOLUTORE AUTOMATICO PER SUDOKU

3 CENNI DI TEORIA DELLA COMPLESSITA COMPUTAZIONALE. E. Amaldi Fondamenti di R.O. Politecnico di Milano 1

Ottimizzazione Multi Obiettivo

Varianti Macchine di Turing

Funzionalità di un Algoritmo

Capitolo 13: L offerta dell impresa e il surplus del produttore

La Macchina RAM Shepherdson e Sturgis (1963)

Automazione Industriale (scheduling+mms) scheduling+mms.

Capitolo 7: Teoria generale della calcolabilitá

Risolvere un problema significa individuare un procedimento che permetta di arrivare al risultato partendo dai dati

LE SUCCESSIONI 1. COS E UNA SUCCESSIONE

Fondamenti dei linguaggi di programmazione

Strumenti e metodi per la redazione della carta del pericolo da fenomeni torrentizi

Codifiche a lunghezza variabile

Più processori uguale più velocità?

Equilibrio bayesiano perfetto. Giochi di segnalazione

Intelligenza Artificiale

Appunti del corso di Informatica 1 (IN110 Fondamenti) 2 Algoritmi e diagrammi di flusso

Gli input sono detti anche fattori di produzione: terra, capitale, lavoro, materie prime.

Informatica. appunti dalle lezioni del 20/09/2011 e del 27/09/2011

A intervalli regolari ogni router manda la sua tabella a tutti i vicini, e riceve quelle dei vicini.

3. Programmazione strutturata (testo di riferimento: Bellini-Guidi)

Università degli Studi di L Aquila. Facoltà di Ingegneria. Corso di Laurea in Ingegneria Elettronica Corso di Sistemi Informativi

1 Serie di Taylor di una funzione

Informatica per le discipline umanistiche 2 lezione 14

UNIVERSITÀ DEGLI STUDI DI TERAMO

Cenni su algoritmi, diagrammi di flusso, strutture di controllo

Strutturazione logica dei dati: i file

Fondamenti e didattica di Matematica Finanziaria

La Qualità il Controllo ed il Collaudo della macchina utensile. Dr. Giacomo Gelmi

TECNICHE DI SIMULAZIONE

Funzioni funzione dominio codominio legge argomento variabile indipendente variabile dipendente

Sistema operativo: Gestione della memoria

La macchina universale

Consideriamo due polinomi

(Esercizi Tratti da Temi d esame degli ordinamenti precedenti)

1. PRIME PROPRIETÀ 2

Analisi sensitività. Strumenti per il supporto alle decisioni nel processo di Valutazione d azienda

Transcript:

Lezione 1 - Nozione di Algoritmo Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Algoritmo e MdT MdT introdotta come modello di calcolo per formalizzare il concetto di calcolo allo scopo di stabilire l'esistenza di metodi algoritmici per il riconoscimento dei teoremi nell'ambito dell'aritmetica. MdT è legata al concetto di automa, come esecutore di una serie di passi (sempre uguali per ogni automa) dipendenti dall'input L'automa è legato al linguaggio che riconosce o che utilizza Il linguaggio è fondamentale per comprendere come descrivere i passi da far eseguire ad una macchina in modo che siano comprensibili alla macchina stessa

Architettura di Von Neumann: conseguenze Una macchina è in grado di risolvere più problemi a patto di elencarne i passi da seguire per farlo. Lo sviluppo di strumenti formali per l'elaborazione dell'informazione Nascita di una disciplina che, dato un problema applicativo, mira ad individuare un procedimento di calcolo che ne consente la soluzione (algoritmo) Si separa l'individuazione degli insiemi di passi (algoritmi) che risolvono problemi dati (attivita' umana) dall'esecuzione di tali passi (algoritmi) (attivita' svolta da un calcolatore)

Algoritmo: definizione storica Termine dovuto al famoso scrittore al-khwarizmi: nato nel 780 circa a Baghdad Originariamente chiamato algorism, un algoritmo è sequenza finita di istruzioni che specificano come certe operazioni elementari debbano susseguirsi nel tempo per risolvere una data classe di problemi. Operazioni elementari: operazioni note all'esecutore Istruzioni: richieste di azioni rivolte all'esecutore e che da questo devono essere capite ed eseguite Classe di problemi: una formulazione del problema indipendente dagli specifici dati su cui opera

Algoritmi: Proprietà Oltre alle proprietà di eseguibilità e non ambiguità di un algoritmo, altre proprietà fondamentali degli algoritmi sono Definito: ogni passo dell'algoritmo è precisamente definito (rigoroso e non ambiguo) [dati e risultati definiti] Correttezza: l'esecuzione dell'algoritmo porta realmente alla soluzione del problema dato Efficienza: quanto ``costa'' l'esecuzione di un algoritmo in termini di risorse consumate Finitezza: normalmente si richiede che l'algoritmo termini in un tempo finito, e cioè che la sequenza di istruzioni che caratterizzano l'algoritmo sia una sequenza finita

Algoritmi: caratteristiche Istruzioni insieme ordinato e finito di operazioni da eseguire Ogni istruzione è univoca cioè non lascia dubbi o ambiguità sul da farsi Esiste un esecutore in grado di eseguire le istruzioni Le procedure risolvono una classe di problemi Non esiste un modo unico per risolvere un problema Un algoritmo e' corretto se per ogni istanza di input si arresta con l'output corretto

Algoritmo esempio Ricetta da cucina E' una sequenza di passi finiti ed in ordine per giungere alla preparazione del piatto I passi non sono ambigui (per quanto possa non essere ambiguo il linguaggio naturale) Tutte le istruzioni sono eseguibili dall'esecutore della ricetta Risolve una classe di problemi: la ricetta generalizza certe istruzioni: le quantità, ad esempio, subordinate al numero di persone rappresentando solo i rapporti fra quantità (una parte, 1/2 parte etc)

Algoritmo - programma - esecutore Un programma è l'espressione di un algoritmo in un linguaggio che l'esecutore è in grado di comprendere direttamente. Un programma è un'espressione concreta dell'algoritmo che ne è l'astrazione A seconda dell'esecutore, lo stesso algoritmo può essere espresso in linguaggi differenti La scrittura del programma è la fase successiva all'individuazione dell'algoritmo per risolvere un determinato problema

Calcolatore - programma - programmazione Calcolatore Un automa il cui comportamento segue delle regole ben precise: è in grado di ``comprendere'' un repertorio ristretto di istruzioni elementari e di eseguirle con una enorme rapidità ed elevata precisione Programma Sequenza di istruzioni elementari che un calcolatore è in grado di comprendere ed eseguire Programmazione Attività che consiste nell'organizzare istruzioni elementari, direttamente comprensibili dall'esecutore, in strutture complesse (programmi) al fine di svolgere determinati compiti

Problema - algoritmo - programma

Problema - algoritmo - programma

Problema - algoritmo - programma

Lezione 2 - Problema - Algoritmo Esecutore Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Problema - algoritmo - programma

Formulazione di un problema Definizione dei dati e dei risultati che si vogliono ottenere (a partire dai dati) Processo di formulazione di un problema: 1. Individuazione dei dati in ingresso 2. Individuazione dei risultati desiderati 3. Individuazione dell'algoritmo di risoluzione Analisi dei requisiti

Problema ed istanza(1) Specificando quali sono i dati di ingresso si definisce una istanza di Problema Problema P: dato un naturale n calcolare la somma dei primi n naturali Istanza di P: risolvere P per n = 12 (ovvero calcolare la somma dei primi 12 naturali) Un problema può essere visto come l'insieme di tutte le sue possibili istanze

[*] Prof. Andrea G. B. Tettamanzi Problema ed istanza(2)

[*] Prof. Andrea G. B. Tettamanzi Problema ed Istanza (3)

[*] Prof. Andrea G. B. Tettamanzi Problema ed Istanza (4)

Problema - algoritmo - esecutore Figura : Relazione problema, algoritmo ed esecutore

Problema dei secchi Sono presenti due secchi con capacità volumetrica rispettivamente di 3 e 4 litri. Determinare le operazioni necessarie per far si che il primo secchio (da 3 litri) sia riempito con 2 litri. Possiamo agire sui due secchi attraverso le seguenti operazioni: Riempire completamente un secchio Svuotarlo completamente Travasare una certa quantita' di liquido da un secchio all'altro

Problema dei secchi:soluzione Si riempie il secchio da 3 litri Si travasa il contenuto nel secchio da 4 litri Si riempie nuovamente il secchio da 3 Si rabbocca il secchio da 4 ottenendo due litri nel secchio da 3 come richiesto

Problema del Massimo Comune Divisore Il problema di calcolare il Massimo Comune Divisore MCD fra due numeri x e y (x > y) Dati: due numeri Risultati: il Massimo Comune Divisore

Algoritmo per l'mcd (Euclide) 1. Calcola il resto della divisione di x per y 2. Se il resto è diverso da zero, allora ricomincia dal punto 1 utilizzando come x il valore attuale di y, e come y il valore del resto altrimenti prosegui con il passo successivo 3. Il massimo comune divisore è uguale al valore attuale di y L'intelligenza necessaria per trovare la soluzione del problema è tutta codificata nell'algoritmo Chiunque sappia comprendere ed eseguire le operazioni che costituiscono l'algoritmo di Euclide, può calcolare l'mcd

Algoritmo: Controesempio Non tutto ciò che sembra un una procedura passo passo è un algoritmo Esempio: Dire se un numero è primo 1. N {0,1} 2. per ogni coppia di interi i > 1 e j > 1, N N {i j} 3. n è primo se e solo se n / N Ricordiamo che un numero naturale si dice primo se è divisibile solo per 1 e per sè stesso e che per definizione 0 e 1 non sono primi

Algoritmi: input e output Con una terminologia più da programmatori, considerando un algoritmo di risoluzione del problema, dati e risultati della formulazione di un problema diventano Input: un algoritmo può avere zero o più input, i quali sono quantità che vengono date in pasto all'algoritmo prima che inizi, oppure dinamicamente mentre è in esecuzione. Questi input sono presi da uno specifico insieme di oggetti Output: un algoritmo può avere uno o più output, si tratta di quantità che hanno una relazione specifica con gli input

Problemi: esempi(1) Risoluzione equazione di secondo grado Input: tre numeri (i coefficienti) Output: le due radici se reali, stampa di un messaggio opportuno altrimenti Trovare il massimo fra tre numeri Input: tre numeri Output: il valore massimo

Problemi: esempi(2) Ricerca del numero di un utente in un elenco telefonico Input: un insieme ordinato di coppie (nome, num. tel.) e un nome x Output: il numero telefonico corrispondente all'utente di nome x, se presente nell'insieme; nulla altrimenti Ricerca del cammino più breve tra due punti su una rete stradale Input: una rete stradale (rappresentata come un insieme di piazze, strade che uniscono due piazze, tempi di percorrenza di ciascuna strada) e due piazze x e y Output: la sequenza di strade che portano da x a y con tempo di percorrenza minimo

Problemi: esempi(3) Il problema Knapsack (zaino): ``sia dato uno zaino che possa sopportare un determinato peso. Siano dati inoltre N oggetti, ognuno dei quali caratterizzato da un peso p e un valore v. Scegliere quali di questi oggetti mettere nello zaino per ottenere il maggiore valore senza eccedere il peso sostenibile dallo zaino stesso.'' Input: Valore oggetti: V = v 1,,v n Pesi oggetti: P = p 1,,p n Capacità massima zaino: c(peso) Output: Gli oggetti scelti ( n con peso complessivo c)

Problemi: esempi(4) Il problema del commesso viaggiatore: ``Un commesso viaggiatore deve percorrere il miglior tragitto attraverso le n citta' nelle quali deve effettuare le consegne'' ``Esiste un percorso che le collega tutte (passando un sola volta per ciascuna citta') con una lunghezza minore di b?'' Input: la mappa con l'indicazione delle n citta' da raggiungere e una lunghezza b Output: SI/NO

Tipologie di problemi(1) Problemi di decisione: Output: SI/NO (es. : esiste un percorso con una lunghezza?) Problemi di ricerca: Output: una soluzione (es. : trovare un percorso di lunghezza minore di k) Problemi di enumerazione: Output: un conteggio delle soluzioni (es. : Quanti sono i percorsi di lunghezza minore di k) Problemi di ottimizzazione: Output: una soluzione ottima rispetto ad un obiettivo (es. : trovare un percorso di lunghezza minima)

Tipologie di problemi(2) La formulazione dei due problemi ``zaino'' e ``commesso'' differisce per il fatto che: Il problema zaino e' formulato come un problema di ottimizzazione: ``Scegliere tra n valigie quelle... in modo da trasportare il maggior peso.'' Il problema commesso, come un problema di decisione: ``Esiste un percorso che...''

Problemi: Nota Non tutti i problemi sono di natura computazionale cioe' non per tutti i problemi e' possibile definire una procedura computazionale (un algoritmo) che consenta, a partire dai dati di ingresso, di ottenere i risultati Il problema dell'arresto* Non esistono modalita' di descrizione di soluzioni (algoritmi) alternative che consentano di trasformare un problema non computazionale in un problema computazionale La scienza degli algoritmi deve limitarsi a considerare problemi computazionali * indecidibilità (Turing 1936)

Problema algoritmo Relazione tra problema ed istanza e tra algoritmo ed esecutore Analisi del problema Individuazione della tipologia di problema Valutazione di un algoritmo per la soluzione della tipologia del problema Problemi non computazionali

Lezione 3 - Problema - soluzione Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Problema - Soluzione

Problema - Soluzione Matematica ed informatica si pongono lo stesso obiettivo: rivolvere dei problemi L'informatica è anche definita come l'arte della risoluzione dei problemi Abbiamo visto problemi espressi in vario modo e classificati come tipologie Gli esempi visti si chiamano anche situazioni problematiche Dalla situazione problematica si passa al problema attraverso la formalizzazione In matematica significa individuare dati incognite e condizioni In informatica non è molto diverso, abbiamo visto come individuare input e output

Problema del barcarolo Rivisitiamo il problema del barcarolo Scopo: trasportare tutti i personaggi sull'altra sponda Punto di partenza: tutti i personaggi sono su una sponda BPCL - (rappresentazione) Punto di arrivo: tutti i personaggi sull'altra sponda - BPCL Vincoli: Barcarolo presente in alcune combinazioni quindi esistono delle situazioni non ammesse PL-- BC BC - PL PC - BL BL- PC Obiettivo: trovare le azioni da compiere per arrivare al punto di partenza rispettando i vincoli Operazioni: trasformazioni di stato Soluzione: applico tutte le trasformazioni e elimino quelle che portano ad uno stato non ammesso e ottengo il diagramma già visto

Metodo dello spazio degli stati Si individua lo spazio degli stati Si individuano le transizioni Dallo stato iniziale applicate tutte le transizioni si individua lo stato prossimo Si escludono gli stati invalidi o quelli già ottenuti Si continua fino ad raggiungere lo stato finale

Problema dei secchi Problema già affrontato Consideriamo un secchio da 9 e uno da 4 Raccogliere 6 litri di acqua in secchio Quale è lo spazio degli stati: coppie ordinate (a,b) relative al contenuto d'acqua dei secchi Stato iniziale: (0,0), stato finale (6,x) Operazioni: riempire i contenitori R(x) svuota il contenitore S(x), travasa fino al colmo C(x,y) travasa completamente T(x,y) Provate a generare l'albero delle possibilità a partire da queste operazioni

Soluzione 9,0 5,4 C(x,y) 5,0 S(y) 1,4 C(x,y) 1,0 S(y) 0,1 T(x,y) 9,1 R(x) 6,4 C(x,y) Problema dei secchi: soluzione

Problema dei cannibali e dei missionari 3 missionari e 3 cannibali fanno un viaggio insieme e devono attraversare un fiume sfruttando una zattera che può ospitare al massimo 2 persone alla volta. Prima di affrontare la traghettata, i missionari prospettano un pericolo: se su una qualsiasi delle due rive del fiume i cannibali finiscono per essere più numerosi dei missionari, questi ultimi potrebbero essere assaliti e mangiati dai primi. Come far traghettare tutti e sei gli uomini con i missionari sani e salvi? Uno dei due missionario o cannibale governa il traghetto, non esiste un trasportatore

Problema dei cannibali e dei missionari Formalizzo il problema usando dei simboli per gli elementi in gioco M missionario, C cannibale, B barca, - fiume Stato iniziale: BMMMCCC- stato finale: - BMMMCC Operatori di trasformazione: Tm transita missionario Tc transita cannibale, Tmm transitano due missionari, tcc transitano due cannibali... Stati non accettati: non possono esserci sui lati più c di m

Problema dei cannibali e dei missionari: Soluzione MMMCCCB- Tcc MMMC - CCB Tc MMMCCB - C Tcc MMM - CCCB Tc MMMCB - CC Tmm MC - CCMMB Tmc MMCCB - MC Tmm CC - CMMM Tc...

Algoritmo e flusso I passaggi tra le sequenze di stati che vanno dallo stato iniziale al finale rappresentano il flusso dell'algoritmo risolutore per l'istanza del problema da affrontare Si tratta di una sequenza di operatori che modificano lo stato Se torno in uno stato già incontrato sto percorrendo una strada già attraversata (non approssimo la soluzione meglio che al passo precedente) Gli stati già incontrati vengono scartati e con loro la strada che vi ha condotti in quello stato Algoritmo descritto come la sequenza di operazioni da compiere L'operazione di generalizzazione dall'istanza all'algoritmo porta generalmente alla creazione di un flusso non strettamente sequenziale

Algoritmo e controllo di flusso Alcune operazioni sono soggette a particolari condizioni per essere eseguite (per gestire più istanze) Altre essendo ripetitive (stesso operatore ma stati via via differenti) vanno eseguite più volte Nella descrizione dell'algoritmo esistono quindi dei modi per controllare il flusso delle operazioni da eseguire In genere si utilizzano parole del linguaggio che modificano il flusso generando un salto Nell'algoritmo di Euclide si vedono chiaramente la valutazione della condizione di terminazione (se) e il salto (salta a) che genera la ripetizione Se considero una istanza specifica del problema dell'mcd tra due numeri posso serializzare la sequenza di istruzioni avendo un flusso sequenziale

Controllo del flusso La sequenza di istruzioni da compiere E' enumerata in sequenza Ha un flusso governato da delle istruzioni di controllo di flusso Istruzioni che agiscono cambiando lo stato Istruzioni che verificano lo stato (se allora altrimenti) Istruzioni che rompono la sequenzialità stretta e vanno a far riprendere l'esecuzione da un determinato punto (goto).

Esplorazione dell'albero delle soluzioni Backtracking trovare soluzioni a problemi in cui devono essere soddisfatti dei vincoli. Enumera tutte le possibili soluzioni e scarta quelle che non soddisfano i vincoli. Una tecnica classica consiste nell'esplorazione di strutture ad albero e tenere traccia di tutti i nodi e i rami visitati in precedenza Esempio scacchi: enumero tutte le possibili mosse con una certa profondità e poi scelgo con Backtracking Esaminando tutte le alternative è un procedimento molto lungo (si parla di complessità dell'algoritmo)

Lezione 4 - Decidibilità Trattabilità Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Problema - algoritmo - programma

Consideriamo problemi di decisione Decidibilità(1) Analizzare i limiti della risoluzione dei problemi mediante algoritmi Decidibilità: Concetto legato alla decidibilità del linguaggio che esprime il problema e solitamente alla Macchina di Turing (MdT) che lo esegue Più nello specifico un algoritmo produrrà una rappresentazione univoca dell'input mediante una stringa Diremo che un problema di decisione è: Decidibile se il linguaggio associato è decidibile Semidecidibile se il linguaggio associato è Turing riconoscibile Indecidibile se il linguaggio associato non è decidibile. Esprimiamo un problema computazionale come un problema di riconoscimento di linguaggi

Decidibilità(2) MdT M con tre possibili risultati computazione (accettazione, rifiuto, loop): Il linguaggio accettato da M è Turing riconoscibile Problema semidecidibile MdT M con due possibili risultati computazione (accettazione, rifiuto): Il linguaggio accettato da M è decidibile. Problema decidibile

Problemi indecidibili: motivazioni Sapere che esistono problemi non risolvibili con un computer I problemi indecidibili non sono esoterici Il problema generale della verifica del software non e' risolvibile mediante computer Costruire un perfetto sistema di debugging per determinare se un programma si arresta. Equivalenza di programmi: Dati due programmi essi forniscono lo stesso output? Individuazione dei virus: Questo programma e' un virus?

Problemi Indecidibili(1) Problema: appartenenza di una stringa ad un linguaggio Il numero di linguaggi diversi su un alfabeto non è numerabile I programmi (stringhe finite su un alfabeto) sono numerabili Li posso ordinare per lunghezza Quindi esistono infinitamente più linguaggi che programmi Come dire che esistono più problemi che algoritmi Quindi devono esistere problemi indecidibili (Godel 1931)

Problemi Indecidibili(2) Consideriamo un classico quesito di Bertrand Russell: In un paese vive un solo barbiere, un uomo ben sbarbato, che rade tutti e soli gli uomini del villaggio che non si radono da soli Il barbiere si rade da solo? Autoreferenza: può determinare indecidibilità

Problema dell'arresto Supponiamo per assurdo che sia possibile scrivere un programma T che accetti in ingresso la coppia < P,x >, formata da un qualsiasi programma P e dal suo ingresso x, e restituisca in uscita, se P(x) termina in un tempo finito, e altrimenti. Consideriamo il programma P che realizza il seguente algoritmo, per ogni ingresso x: 1. Esegui T sull'ingresso < P,x >; 2. Se T restituisce, termina; 3. Vai al Passo 1.

Problema dell'arresto: dimostrazione Dimostriamo l'assurdo supponendo di eseguire T sull'ingresso < P,x >. 1. T termina con valore di uscita ; ma allora P termina al Passo 2 e quindi il risultato restituito da T è scorretto; 2. T termina con valore di uscita ; ma allora P non terminerebbe mai al Passo 2 e continuerebbe a ciclare all'infinito: anche in questo caso il risultato restituito da T è scorretto; 3. T non termina: anche in questo caso, ciò significherebbe che T non funziona come abbiamo supposto.

Esempi Problemi indecidibili: Decidere se un generico programma è corretto (calcola la funzione desiderata) Decidere se, dato un generico programma ed una istruzione, l'istruzione sarà eseguita Ciò non significa che non si possa stabilire se un determinato programma sia corretto o esegua una particolare istruzione

Riducibilità E' importante riconoscere che un problema P è indecidibile. Supponendo che esista una MdT che decide P e provarne la contraddizione Dimostrare che un problema indecidibile noto non sia più difficile del problema P in questione Dal punto di vista del linguaggio Un linguaggio A è riducibile a un linguaggio B (A< m B) se esiste una funzione calcolabile f : Σ Σ w,w A, f (w) B La funzione f è chiamata la riduzione di A a B. Una funzione f : Σ Σ è calcolabile se esiste una MdT M tale che su ogni input w, M si arresta con f (w), e solo con f (w), sul suo nastro.

Trattabilità ed intrattabilità(1) Non tutti i problemi sono computazionali Considerare la trattabilità di un problema significa misurare l'efficienza del migliore algoritmo risolutore. Un problema è detto trattabile se esiste per la sua risoluzione un algoritmo efficiente Problemi facili (trattabili) algoritmo efficiente Problemi difficili (intrattabili) non esiste un algoritmo efficiente

Trattabilità ed intrattabilità(2) Un es. di problema intrattabile: la Torre di Hanoi

Torre di Hanoi Tre paletti e un certo numero di dischi di grandezza decrescente Il gioco inizia con tutti i dischi incolonnati su un paletto in ordine decrescente, in modo da formare un cono. Lo scopo del gioco e' portare tutti dischi sull'ultimo paletto, potendo spostare solo un disco alla volta e potendo mettere un disco solo su un altro disco piu' grande, mai su uno piu' piccolo. il numero minimo di mosse necessarie per completare il gioco è 2 n 1, dove n è il numero di dischi. Di conseguenza, secondo la leggenda, i monaci di Hanoi dovrebbero effettuare almeno 18.446.744.073.709.551.615 mosse prima che il mondo finisca (una mossa al secondo 585 miliardi di anni), essendo n =64

Lezione 5 - Complessità in tempo e spazio Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Complessità in tempo e spazio Computabilità Definizione di un algoritmo corretto per risolvere il problema Valutazioni di massima su trattabilità ed intrattabilità Valutazioni dettagliate sull'efficienza Complessità dell' algoritmo Tempo Spazio

Computabilità e complessità (1) Calcolabilità: studia la frontiera tra problemi solubili e problemi insolubili. Si limita ad aspetti qualitativi della risolubilità dei problemi. Complessità: analizza problemi solubili. Scopo: quantificare le risorse in tempo e/o spazio necessarie a risolvere un problema dato, in funzione della sua dimensione Teoria della computabilità: utilizza modelli di calcolo come ad esempio automi a stati, MdT ecc., per dimostrare l'esistenza o meno di algoritmi per una data classe di problemi Teoria della complessità: ha lo scopo di determinare le risorse richieste dall'esecuzione di un algoritmo per risolvere un dato problema. Un algoritmo formalmente deve essere finito, ma molto spesso deve essere finito in un numero ragionevole di passi.

Complessità in tempo e spazio Risorse necessarie alla sua esecuzione In termini di tempo di esecuzione e spazio per i dati Indicatore della difficoltà del problema Analisi degli algoritmi: studio della loro complessità Complessità ed efficienza sono ovviamente strettamente legati

Efficienza di un algoritmo L'efficienza di un algoritmo è legata all'utilizzo di risorse di calcolo Tempo richiesto per trovare la soluzione (tempo di esecuzione) Spazio in termini di quantità di memoria richiesta Ci soffermeremo prevalentemente su valutazioni temporali

Tempo di esecuzione Considero un dato ingresso Valutare quanto tempo richiede ciascuna delle operazioni elementari Valutare quante volte viene eseguita ciascuna delle operazioni elementari Profilazione dell'algoritmo Misurazione del tempo impiegato da un algoritmo di solito in una specifica implementazione in un linguaggio, quindi escludendo tempi di caricamento e di generazione dell'output

Esempio Euclide: profilazione Esecuzione di MCD(96,60) A seconda della copia n,m in input il tempo varia A seconda dei tempi t il tempo totale varia

Efficienza di un algoritmo: modello Per valutare l'efficienza di un algoritmo occorre fare diverse assunzioni Prima cosa serve un modello di calcolo astratto Nella pratica il tempo utilizzato dipende da molti fattori: Linguaggio di programmazione utilizzato, bravura del programmatore, codice generato dal compilatore, processore, cache, sistema operativo ecc. Vogliamo effettuare un'analisi che prescinda da tutti i fattori citati ovvero vogliamo trovare un modello di calcolo astratto Con il quale possiamo definire una computazione algoritmica Con il quale possiamo esprimere quantitativamente l'efficienza

Modelli di computazione Per analizzare un algoritmo serve un modello astratto della tecnologia utilizzata per realizzarlo Descrive le risorse utilizzate Descrive il loro costo Considerando alcune operazioni elementari a costo unitario per cui il reale tempo di calcolo possa essere considerato proporzionale al numero di operazioni eseguite Deve essere sufficientemente realistico Deve astrarre da dettagli di processori specifici

Modello di Macchina ad accesso casuale (RAM)(1) Il modello computazionale più comunemente usato Modella fedelmente la stragrande maggioranza dei processori Istruzioni eseguite in sequenza Ogni istruzione richiede un suo tempo costante per l'esecuzione Esistono altri modelli come le macchine basate su rete neurale, macchine quantistiche o macchine chimiche astratte

Modello di Macchina ad accesso casuale (RAM)(2) Costituita da 4 componenti: Memoria Programma File di input File di output La memoria è costituita da una sequenza di locazioni 0,1,... capace di salvare un unico valore intero alla volta L'indirizzo è il numero della locazione di memoria L'intero riferito da un indirizzo di una locazione di memoria è il contenuto della locazione stessa Il programma è dato da una sequenza di istruzioni (assegnamenti, input/output, cicli di controllo)

Modello di Macchina ad accesso casuale (RAM) (3) Assegnamento Mem[l] := Mem[j] + Mem[k]. Mette nella locazione l la somma dei valori nella locazione j e k Il file di input è una sequenza di valori consumati uno alla volta da una istruzione di ``read'' Il file di output è una sequenza di valori prodotti uno alla volta da una istruzione di ``write'' Il flusso di controllo del programma va normalmente da una istruzione alla successiva ad eccezione di istruzioni di ``goto i'' o goto condizionati tipo if Mem[j] 0 then goto i

Modello di Macchina ad accesso casuale (RAM): esempio (4) 1: Mem[0]:=0 2: read(mem[1]) 3: if Mem[1] 0 then goto 5 4: goto 7 5 Mem[3]:=Mem[0]-Mem[1] 6: if Mem[3] 0 then goto 16 7: write(mem[1]) 8: read(mem[2]) 9: Mem[3]:= Mem[2]-Mem[1] 10: if Mem[3] 0 then goto 12 11: goto 14 12: Mem[3]:=Mem[1]-Mem[2] 13: if Mem[3] 0 then goto 8 14: Mem[1]:=Mem[2] +Mem[0] 15: goto 3 16: halt

Profilazione e modello di calcolo Concetti utilizzati quando occorre valutare il costo di esecuzione in maniera precisa Spesso usato per valutare il costo di algoritmi la cui implementazione gira su sistemi embedded Importante anche lo spazio e la dipendenza spazio - tempo di esecuzione Il modello può cambiare a seconda del sistema reale su cui l'implementazione dell'algoritmo girerà Dal punto di vista teorico senza considerazioni pratiche implementative si tende ad astrarre dai costi dettagliati Ordini di grandezza degli algoritmi in relazione all'input

Lezione 6 - Analisi di un algoritmo caso medio, caso peggiore Corso Programmazione Fondamenti di programmazione Algoritmi Marco Anisetti e-mail: marco.anisetti@unimi.it web: http://homes.di.unimi.it/anisetti/ Università degli Studi di Milano Dipartimento di informatica

Efficienza di un algoritmo: input Il tempo di esecuzione di un algoritmo dipende sempre da quanto è grande l'input (dimensione dell'istanza) La dimensione dell'istanza è proporzionale al numero di elementi che la costituiscono Anche con un modello di calcolo semplificato (tempo uguale al numero di operazioni eseguite) risulta difficile il calcolo esatto delle operazioni L'analisi viene generalmente effettuata considerando il caso peggiore

Misurazione delle risorse Tempo Numero totale di operazioni elementari eseguite Machine independent Tempo uguale per tutte le operazioni Spazio Quantità massima di informazione da mantenere (includendo dati iniziale e risultati) Tempo e spazio sono correlati spazio impiegato k tempo impiegato

Profilazione generalizzata(1) Generalizzare l'esempio sulla profilazione di MCD in relazione alla dimensione dell'input Considero il numero di iterazioni che debbo compiere Nel caso MCD(96,60) ho 4 iterazioni Alcuni casi speciali generalizzando il tempo T (n,m) per MCD(n,m) T (n,1) = 1 T (n,kn) = 1 T (n,m) = 1 + T (m,n mod m) T (n,m) = 1 + T (m,n) se m > n

Profilazione generalizzata(2) Volendo si può costruire una tabella e valutare i costi al crescere di n e m Equivale a valutare più istanze del problema che l'algoritmo risolve Occorre valutare il risultato al crescere degli input visto che il tempo di esecuzione dipende dal valore degli input

Profilazione generalizzata(3) In particolare dipende principalmente dal valore di m dato che n mod m viene eseguito da subito E' evidente la persistenza di alcuni casi particolari dove il costo è sempre uno anche al crescere di n ed m Casi fortunati altri molto sfortunati Non tutte le esecuzioni di un determinato algoritmo richiedono lo stesso tempo

Profilazione generalizzata del caso peggiore Tempo Potremmo pensare che più il modulo è basso più siamo vicini alla fine (ma con modulo alto non siamo lontani dalla fine pensiamo a m mod m-1) Caso peggiore è quando n mod m = m 2 Tempo nel caso peggiore: 1 + log 2 (m) Spazio Considerando il modello RAM, ho solo 3 celle usate per n, m, r

Analisi di un algoritmo Quantità di risorse è funzione dei dati di ingresso Dimensione dei dati di ingresso: n Caso migliore: il più breve tempo di esecuzione su tutti gli ingressi di dimensione n Caso medio: la media dei tempi di esecuzione su tutti gli ingressi di dimensione n Caso peggiore: il più lungo tempo di esecuzione su tutti gli ingressi di dimensione n

Analisi del caso peggiore Limite superiore alle risorse che l'esecuzione dell'algoritmo potrà mai richiedere. Il caso peggiore si verifica abbastanza spesso (es., ricerca di un dato inesistente). Spesso il caso medio è analogo al caso peggiore.

Algoritmo e dimensione dell'istanza Crescita del tempo di calcolo al crescere della dimensione dell'istanza La bontà di un algoritmo viene valutata rispetto al suo comportamento asintotico ovvero quando la dimensione dell'istanza tende all'infinito Buon comportamento asintotico: al crescere della dimensione non cresce troppo il tempo Cattivo comportamento asintotico: algoritmo applicabile nella pratica solo a istanze di dimensione limitata

Ordine di grandezza Ciò che importa veramente non è la quantità precisa di risorse, ma come questa cresce al crescere della dimensione dell'ingresso O(logn) < O(n) < O(n 2 ) < O(n 3 ) < < O(2 n )