La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Strategie per la progettazione di algoritmi:

Presentazioni simili


Presentazione sul tema: "Strategie per la progettazione di algoritmi:"— Transcript della presentazione:

1 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 © by Claudio Salati. Lez. 11

2 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.

3 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

4 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); }

5 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)!

6 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().

7 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.

8 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 a1 a0 ha il seguente significato an * Bn + an-1 * Bn 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+

9 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 | | 1 } grammatica 2 (context-free) VN = {N, C} P = { N ::= N C | C C ::= 0 | 1 }

10 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

11 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."

12 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 +)

13 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

14 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

15 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 )

16 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

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

18 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

19 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

20 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)?

21 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);

22 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

23 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

24 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


Scaricare ppt "Strategie per la progettazione di algoritmi:"

Presentazioni simili


Annunci Google