Strategie per la progettazione di algoritmi:

Slides:



Advertisements
Presentazioni simili
Rappresentazioni numeriche
Advertisements

Introduzione al linguaggio C++
I Linguaggi di programmazione
Informatica Generale Susanna Pelagatti
Fondamenti di Informatica
Rappresentazione di Numeri Reali
Sistemi di numerazione
Sintassi (prima parte)
Trasmissione delle informazioni
Codifica dei Dati Idea: vogliamo rappresentare dati eterogenei utilizzando un linguaggio che l’elaboratore puo’ facilmente manipolare Essenzialmente vogliamo.
Fondamenti di Informatica CDL in Ingegneria Meccanica - A.A CDL in Ingegneria Meccanica - A.A Tipi di dati Ing. Simona Colucci.
Fondamenti di Informatica CDL in Ingegneria Gestionale - A.A Tipi di dati Ing. Simona Colucci.
Lez. 121 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Progettazione.
Lez. 31 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Lez. 51 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Complessita'
Lez. 131 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Rappresentazione.
Lez. 91 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Alberi di ricerca.
Lez. 41 Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Programmazione.
Programmazione Procedurale in Linguaggio C++
Semantiche dei linguaggi di programmazione
L’ALGEBRA NEI PROGRAMMI
Capitolo 10 Tecniche algoritmiche Algoritmi e Strutture Dati.
Process synchronization
Informatica 3 Codifica binaria.
Processi Aleatori : Introduzione – Parte I
Laboratorio di Linguaggi P R I M O C O M P I T I N O Marco Tarini Università dellInsubria Facoltà di Scienze Matematiche, Fisiche e Naturali di Varese.
Corso di Laurea in Biotecnologie Informatica (Programmazione)
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Rappresentazione dellinformazione su calcolatore Anno Accademico 2009/2010.
1 Corso di Laurea in Biotecnologie Informatica (Programmazione) Le stringhe di caratteri in Java Anno Accademico 2009/2010.
G.M. - Informatica B-Automazione 2002/03 Funzione Indica una relazione o corrispondenza tra due o più insiemi che soddisfa ad alcune proprietà. Il dominio.
Corso di Informatica per Giurisprudenza
Fondamentidi Programmazione Corso: Fondamenti di Programmazione Classe: PARI-DISPARI Docente: Prof. Luisa Gargano Testo: Aho, Ulman, Foundations of Computer.
1 Implementazione di Linguaggi 2 Implementazione di Linguaggi 2 Federico Bernardi Type checking 2° parte Type checking 2° parte - Equivalenza di type expressions.
Semantica Operazionale Strutturata
Procedure e funzioni nei linguaggi di alto livello Lab Programmazione - turno /2006.
Unità Didattica 2 I Linguaggi di Programmazione
Gli esseri viventi ricevono informazione direttamente dal mondo circostante e dai propri simili attraverso i sensi (percezione). La percezione, tuttavia,
Codifica binaria Rappresentazione di numeri
I File.
Il Linguaggio C.
Usare rappresentazioni di lunghezza fissa porta ad avere valori non rappresentabili: Overflow indica un errore nella rappresentazione del risultato in.
RAPPRESENTAZIONE DELL’INFORMAZIONE
INSIEMI NUMERABILI L’analisi matematica introduce il concetto di insieme numerabile come insieme i cui elementi possono essere “contati” ossia che possiede.
LAPPROCCIO FUNZIONALE Obiettivo: esprimere la soluzione di un problema sotto forma di funzione. Quali funzioni primitive? Quali meccanismi di combinazione?
L’AUTOMA ESECUTORE Un automa capace di ricevere dall’esterno una descrizione dello algoritmo richiesto cioè capace di interpretare un linguaggio (linguaggio.
LINGUAGGI DI PROGRAMMAZIONE
Elementi di Informatica
1 Programmazione = decomposizione basata su astrazioni (con riferimento a Java)
RAPPRESENTAZIONE DELL'INFORMAZIONE
Dalle potenze ai numeri binari
Lo sviluppo del software e i linguaggi di programmazione
Introduzione ai linguaggi formali e alle stringhe
Corso di Laurea Ingegneria Informatica Fondamenti di Informatica
Lezione 3 Struttura lessicale del linguaggio
Rappresentazione dell’informazione nel calcolatore.
Informatica Lezione 3 Scienze e tecniche psicologiche dello sviluppo e dell'educazione (laurea triennale) Anno accademico:
ALLOCAZIONE STATICA: LIMITI Per quanto sappiamo finora, in C le variabili sono sempre dichiarate staticamente –la loro esistenza deve essere prevista e.
Grammatiche Grammatiche libere da contesto Grammatiche regolari
Elementi di semantica denotazionale ed operazionale
Rappresentazioni a lunghezza fissa: problemi
Rappresentazione dell'informazione
Rappresentazione dell'informazione 1 Se ho una rappresentazione in virgola fissa (es. su segno e 8 cifre con 3 cifre alla destra della virgola) rappresento.
La codifica dei numeri.
FI - Algoritmi e Programmazione 1 Variabili Consentono di aumentare notevolmente la potenza espressiva. Una variabile è caratterizzata da:  Un nome 
Conversione binario-ottale/esadecimale
Informatica Lezione 3 Psicologia dello sviluppo e dell'educazione (laurea magistrale) Anno accademico:
Rappresentazione dei numeri
“ Pseudocodice ” Un programma per computer lavorerà su in insieme di “ variabili ” contenenti i dati del problema, soluzioni intermedie, soluzioni finali.
La numerazione ottale. Il sistema di numerazione ottale ha ampio utilizzo in informatica E’ un sistema di numerazione posizionale La base è 8 Il sistema.
Parsing ricorsivo discendente Il parsing ricorsivo discendente (recursive descent parsing) è un metodo di tipo top-down che può essere facilmente codificato.
Transcript della presentazione:

Strategie per la progettazione di algoritmi: Universita' di Ferrara Facolta' di Scienze Matematiche, Fisiche e Naturali Laurea Specialistica in Informatica Algoritmi Avanzati Strategie per la progettazione di algoritmi: semplificazione e trasformazione algebrica, tecniche di Montecarlo Horner's rule simulated annealing Copyright © 2006-2009 by Claudio Salati. Lez. 11

SEMPLIFICAZIONE ALGEBRICA Strategia: una formula di calcolo e' espressa in forma diversa per ridurre (minimizzare) il numero di operazioni necessarie per calcolarla.  Esempio: abbiamo un polinomio P(x) di grado n rappresentato come vettore dei suoi coefficienti. (compresi quelli di valore 0.0!) vogliamo valutarlo in un punto x Una prima maniera di scrivere il polinomio e' la seguente: P(x) = pn * xn + pn-1 * xn-1 + … +p1 * x + p0 che puo' ovviamente essere immediatamente utilizzata per realizzare la funzione desiderata.

SEMPLIFICAZIONE ALGEBRICA float evalP(int n, float P[], float x) { // n e' il grado del polinomio P(x) float y = P[0]; for (int i = 1; i <= n; i += 1) y = y + P[i] * pow(x, i); // end for return (y); } questa procedura si basa sull'utilizzo della funzione della libreria standard C #include <math.h> float pow(float x, float y); che ritorna il valore xy

SEMPLIFICAZIONE ALGEBRICA Il polinomio P(x) puo' pero' anche essere scritto come:  P(x) = (…(pn * x + pn-1) * x + pn-2) * x +… +p1) * x + p0 secondo la regola di Horner. A partire da questa riscrittura possiamo scrivere una nuova funzione per il calcolo di P(x): float hornerP(int n, float P[], float x) { // n e' il grado del polinomio P(x) float y = P[n]; for (int i = n-1; i >= 0; i -= 1) y = y * x + P[i]; // end for return (y); }

SEMPLIFICAZIONE ALGEBRICA Le due funzioni hanno lo stesso ordine di complessita' ma solo a condizione che il calcolo di pow(x, i) avvenga in tempo costante! In ogni caso il calcolo di una potenza e' ovviamente molto piu' complesso del calcolo di un semplice prodotto; l'algoritmo evalP() richiede comunque anche il calcolo di un prodotto (un prodotto e una potenza contro un prodotto e basta) N.B.: in effetti, nel calcolo secondo la regola di Horner, sarebbe stato piu’ conveniente memorizzare i coefficienti nel vettore in ordine di potenza decrescente (most significant digit first, o big endian, che e’ anche l’ordine di scrittura fisiologico), a differenza di quello che si e’ fatto nell’altro caso. N.B.: un numero in notazione posizionale puo’ essere visto come un polinomio valutato nella sua base, ma in questo caso le potenze sono decrescenti da sinistra a destra (la notazione e’ big endian)!

SEMPLIFICAZIONE ALGEBRICA Esercizio: la funzione della libreria standard (modulo stdlib) int atoi(const char *s); che converte in un intero la stringa numerica s (che noi assumiamo non negativa), puo' essere realizzata efficientemente utilizzando la Horner's rule: la stringa s viene scandita una sola volta da sinistra (inizio, digit piu' pesante) a destra (fine, digit piu' leggero). si considera sostanzialmente che la stringa rappresenti un polinomio P(x) di grado strlen(s)-1, in cui il k-esimo carattere della stringa (k numerato a partire da 0) rappresenti il coefficiente del termine di grado strlen(s)-1-k e con x==10 Notare che la lunghezza di s non e' nota (a priori), e non puo' essere calcolata da atoi() tramite strlen(), perche' cio' vorrebbe dire scandire tutta s. Scrivere in C la funzione atoi().

Horner’s rule: un’altra prospettiva Prologo, da A. Natali: "Come esempio di linguaggio, consideriamo la notazione posizionale dei numeri interi, che siamo cosi' abituati ad usare da confonderla spesso con il concetto di numero. Se scriviamo la seguente configurazione di segni: 135 la maggior parte delle persone la leggera' pronunciando la parola centotrentacinque, modo sintetico per esprimere il significato inteso, cioe' il numero uno*cento+tre*dieci+cinque*uno. Un numero costituisce pero' una astrazione che non va assolutamente confusa con la notazione che si usa per esprimerla. Ed infatti vi sono molteplici modi per denotare lo stesso numero." Cosi' come ci sono diversi modi di leggere la stringa 135 (pur sempre vista come stringa in notazione posizionale in base 10) per arrivare ad assegnarle il significato centotrentacinque.

Horner’s rule: un’altra prospettiva distinzione tra astrazione numero (di seguito espressa, come nelle righe precedenti, scrivendo il numero in linguaggio naturale) e notazione utilizzata per rappresentarlo ci si limita a considerare la notazione posizionale base B  B simboli diversi nell'alfabeto B = otto, A = {0, 1, 2, 3, 4, 5, 6, 7} B = sedici, A = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f} B = due, A = {0, 1} o anche {-, |} 1310 = tredici, 138 = undici, 1316 = diciannove, 132 = errore 10112 = undici, |-|| = undici la frase an an-1 ... a1 a0 ha il seguente significato an * Bn + an-1 * Bn-1 + ... + a1 * B1 + a0 * B0 ak e' una cifra B-esimale da zero a B-1 il linguaggio dei numeri naturali espressi in notazione posizionale in base B coincide con A+

Horner’s rule: un’altra prospettiva lo stesso linguaggio puo' essere descritto in forma costruttiva tramite una sua grammatica. esempio, per B = due grammatica 1 (regolare) VT = {0, 1} VN = {N} S = N P = { N ::= N 0 | N 1 | 0 | 1 } grammatica 2 (context-free) VN = {N, C} P = { N ::= N C | C C ::= 0 | 1 }

Horner’s rule: un’altra prospettiva l'albero di derivazione di una espressione ci fornisce informazioni addizionali sulla struttura reale dell'espressione (e.g. quali operatori sono operandi-sottoespressioni di quali altri operatori) l'albero di derivazione di una frase del nostro linguaggio ci puo' cioe' aiutare a interpretare la frase (ad assegnarle il significato)   N / \ N C / \ | N C 1 | | C 0 | 1

Horner’s rule: un’altra prospettiva in maniera alternativa all'interpretazione basata sulla notazione posizionale che leggerebbe la frase come uno*duetre + zero*duedue + uno*dueuno + uno*duezero = undici qui si vuole definire una diversa regola di lettura semantica basata sulla struttura sintattica della frase un numero N e' composto da una parte N e da una parte C, e cosi' ricorsivamente N = 1011 N = N0(=101)  C(1) N = N0(=N1(=10)  C(1))  C(1) ... A. Natali: "Per stabilire il significato delle frasi di L(G), occorre fissare una corrispondenza tra ciascuna frase e uno specifico dominio di interpretazione, che in questo caso e' evidentemente il dominio NAT dei numeri naturali."

Horner’s rule: un’altra prospettiva A. Natali: “Seguendo un approccio di tipo denotazionale, il significato delle frasi di L(G) puo' essere stabilito introducendo opportune funzioni di interpretazione per stabilire la corrispondenza tra ogni categoria sintattica (simbolo non terminale) e i numeri naturali." Cioe’ tra ogni produzione di ogni simbolo non terminale e i numeri naturali: cio' porta ad assegnare anche un significato ai simboli terminali. L(G)  semantica denotazionale  NAT C2NAT: C  NAT C2NAT( 0 ) = zero C2NAT( 1 ) = uno N2NAT: N  NAT N2NAT( C ) = C2NAT( C ) N2NAT( N C ) = due * N2NAT( N ) + C2NAT( C ) in grassetto sono indicati gli elementi del dominio di interpretazione, valori (zero, uno, due) e funzioni semantiche (* e +)

Horner’s rule: un’altra prospettiva A. Natali: “Se la frase generata da N e' derivabile con la produzione N ::= C, il suo significato e' ricondotto alla funzione C2NAT. Se la frase generata da N e' derivabile con la produzione N ::= N C, il significato e' ricondotto alla struttura della frase moltiplicando per due il significato denotato dalla parte N e sommando il valore (significato) della parte C." N2NAT(1011) = N2NAT(101) * due + C2NAT(1) = (N2NAT(10) * due + C2NAT(1)) * due + uno = ((N2NAT(1) * due + C2NAT(0)) * due + uno) * due + uno = ((C2NAT(1) * due + zero) * due + uno) * due + uno = ((uno * due + zero) * due + uno) * due + uno = (due * due + uno) * due + uno = cinque * due + uno = undici

Semantica di un linguaggio: descrizione formale non solo la sintassi di un linguaggio di programmazione puo' essere specificata in modo formale, ma anche la sua semantica tre metodi per specificare in modo formale la semantica di un linguaggio semantica interpretativa si da' un interprete modello (il metodo del metro campione dell'istituto Galileo Ferraris) semantica denotazionale si associa una funzione di interpretazione ad ogni simbolo non terminale della grammatica semantica assiomatica

Semantica delle espressioni grammatica per espressioni aritmetiche su numeri interi E ::= E + T | T T ::= T * F | F F ::= ( E ) | N in grassetto sono segnati i simboli terminali questa grammatica si collega a quella che descrive il linguaggio dei numeri naturali (simbolo non terminale N) il dominio di interpretazione dei numeri naturali (in realta' interi) e' ovviamente anche il dominio di interpretazione per le espressioni aritmetiche qui considerate E2NAT( E + T ) = E2NAT( E ) + T2NAT( T ) E2NAT( T ) = T2NAT( T ) T2NAT( T * F ) = T2NAT( T ) * F2NAT( F ) T2NAT( F ) = F2NAT( F ) F2NAT( ( E ) ) = E2NAT( E ) F2NAT( N ) = N2NAT( N )

TRASFORMAZIONE ALGEBRICA Strategia: per risolvere un problema A lo si trasforma in un problema correlato B, si risolve B, e si opera la trasformazione inversa del risultato.  Tutto dipende ovviamente dal costo relativo delle trasformazioni diretta e inversa, e dal costo del calcolo della soluzione per il problema trasformato B: esempio banale: OPERAZIONI ARITMETICHE SU STRINGHE DI DIGIT CHE RAPPRESENTANO NUMERI INTERI O REALI ATTRAVERSO LA TRASFORMAZIONE IN RAPPRESENTAZIONE BINARIA O FLOATING-POINT esempio complesso (e importantissimo): TRASFORMATA DI FOURIER

TECNICHE DI MONTECARLO Strategia: BASATE SULLA GENERAZIONE E L'UTILIZZO DI NUMERI RANDOM, POSSIBILMENTE CON DIVERSE DISTRIBUZIONI. PER SIMULAZIONI PER ALTRI TIPI DI PROBLEMI

TECNICHE DI MONTECARLO ESEMPIO 1: CALCOLARE LA MEDIA DI n NUMERI, CON n MOLTO GRANDE. L'ALGORITMO OVVIO E' O(n), PERCHE' DEVO CONSIDERARE TUTTI I NUMERI DELLA SEQUENZA MA SI PUO' FARE IN O(1) ! SCELGO m << n (m FISSO, INDIPENDENTE DA n) NUMERI A CASO NELLA SEQUENZA, E FACCIO LA LORO MEDIA. OVVIAMENTE HO SOLO UN VALORE APPROSSIMATO, MA QUANTO VICINO AL VALORE MEDIO VERO? LA MEDIA ARITMETICA MA SU m VALORI E' UNA STIMA CORRETTA (MEDIA DELLE MA = VALOR MEDIO) CONSISTENTE (lim (MA) = VALOR MEDIO) EFFICIENTE (CONVERGE IN FRETTA) mn

MONTECARLO - SIMULATED ANNEALING CONSIDERIAMO DI DOVERE POSIZIONARE DEI CHIP SU UNA SCHEDA O DELLE MACROFUNZIONI IN UN CHIP I SOTTOCIRCUITI DEBBONO ESSERE CONNESSI TRA LORO IN MODO NOTO, E LA DISTANZA RECIPROCA E' CONDIZIONATA DAL NUMERO DI INTERCONNESSIONI RECIPROCHE IL POSIZIONAMENTO DEVE TENERE CONTO DI VINCOLI QUALI VELOCITA' AREA PER DRIVER DELLE LINEE OCCUPAZIONE DI AREA DELLE CONNESSIONI IL NUMERO DI INCROCI DEVE ESSERE MINIMIZZATO

MONTECARLO - SIMULATED ANNEALING SI DEVE MINIMIZZARE UNA FUNZIONE COSTO DEFINITA SU UN DOMINIO MULTIDIMENSIONALE (POSIZIONE DI TUTTI I SOTTOCIRCUITI). NON SOLO IL PROBLEMA E' OGGI INTRATTABILE, RISULTA FACILE CON LE EURISTICHE NOTE FARSI INTRAPPOLARE IN MINIMI LOCALI (E' OVVIO CHE CIO' ACCADE CON UNA STRATEGIA GREEDY!) la soluzione e': SIMULATED ANNEALING (to anneal = temprare) O CRISTALLIZZAZIONE SIMULATA ovvero, COME E' CHE SI FORMANO (mono-)CRISTALLI ANZICHE' SOLIDI AMORFI (o poli-cristalli)?

MONTECARLO - SIMULATED ANNEALING stato simulatedAnnealing(stato x, float temp) { // x : configurazione considerata nel dominio // degli stati possibili // temp : temperatura simulata del processo // y : configurazione verso la quale si // ipotizza di muoversi stato y; while (!acceptable(x)) { while (stabile(temp)) { y = nuovoStato(x); if (siAccetta(costo(y), costo(x), temp)) x = y; // end if } temp = decrementa(temp); return (x);

MONTECARLO - SIMULATED ANNEALING int siAccetta(float oldCost x, float newCost, float temp) { float delta = newCost - oldCost; if (delta<0.0) return (1); //1==true else { float probabilita = exp(-delta/temp); return ((float)rand()/(float)RAND_MAX) < probabilita)); } una nuova configurazione e' sempre accettabile se il suo costo e' minore di quello della configurazione precedente una nuova configurazione puo' essere accettata anche se il suo costo e' maggiore o uguale del costo della configurazione precedente: ma cio' e' tanto meno probabile quanto piu' la temperatura si avvicina allo 0. cio' consente, all'inizio del processo di cristallizzazione, di allontanarsi da minimi locali

MONTECARLO - SIMULATED ANNEALING IL CRITERIO DI RAFFREDDAMENTO E' REALIZZATO DALLE PROCEDURE stabile() E decrementa(): stabile() DETERMINA LA FREQUENZA DI RAFFREDDAMENTO, decrementa() STABILISCE DI QUANTO SI ABBASSA LA TEMPERATURA PIU' SI MANTIENE ELEVATA temp E PIU' SI DA' SPAZIO AL SISTEMA DI RAGGIUNGERE LA CONFIGURAZIONE PIU' PROBABILE, CHE E' QUELLA CON costo() MINIMO PER NUMERO DI PASSI INFINITO LA PROBABILITA' DI COVERGERE ALLA CONFIGURAZIONE DI COSTO MINIMO E' COMUNQUE 1

MONTECARLO - SIMULATED ANNEALING PIU' ALTA E' LA TEMPERATURA INIZIALE E PIU' IN FRETTA SI RAGGIUNGE LA CONDIZIONE PIU' PROBABILE PER GARANTIRE LA CONVERGENZA IN NUMERO FINITO DI PASSI LA POLITICA DI stabile()/decrementa() DEVE ESSERE OPPORTUNA, CIOE' IL RAFFREDDAMNETO NON DEVE ESSERE TROPPO RAPIDO SE SI FA UNA SOLA MOSSA AD OGNI LIVELLO DI TEMPERATURA (temp E' decrementa()-TO IN CONTINUAZIONE) ALLORA decrementa() DEVE CALARE DI POCO