Il problemsolving Gianpiero Cabodi e Paolo Camurati Dip
Il problem-solving Gianpiero Cabodi e Paolo Camurati Dip. Automatica e Informatica Politecnico di Torino A. A. 2004/2005 14 Il problem-solving
PRODOTTI-FORNITORI n Problema di ottimizzazione l n A. A. 2004/2005 Trovare un insieme minimo di fornitori in grado di fornire un dato insieme di prodotti Gli elenchi dei fornitori e dei prodotti, con nomi, e corrispondenze prodotto-fornitori, sono letti da file. 14 Il problem-solving 2
Problema in dettaglio Due file di testo contengono informazioni relative a una fornitura di prodotti per un dato acquirente. n elenco. txt: contiene un elenco di prodotti, a ognuno dei quali sono associate le ditte che lo vendono n acquisti. txt: elenco di acquisti A. A. 2004/2005 14 Il problem-solving 3
Problema in dettaglio Il programma, letti i due file, determina un insieme minimo di ditte dalle quali acquistare tutti i prodotti elencati in acquisti. txt. Si deve cioè, sfruttando la possibilità di acquistare lo stesso prodotto da più ditte, fare in modo di scegliere l’insieme di fornitori di cardinalità minima (minimo numero di fornitori in grado di fornire tutti i prodotti). n (ricerca) determina un insieme di fornitori per un dato elenco di prodotti. E’ garantito che l’insieme esiste, perché ogni prodotto ha almeno un fornitore. La difficoltà consiste nel determinate TUTTI gli insiemi di fornitori n (ottimizzazione) è necessario minimizzare la cardinalità dell’insieme di fornitori A. A. 2004/2005 14 Il problem-solving 4
Formato file input n elenco. txt l l l n Acquisti. txt l A. A. 2004/2005 prima riga: numero di ditte fornitrici nf e di prodotti np nf righe successive: nomi delle ditte (uno per riga) righe che seguono: elenco degli np prodotti; per l’i-esimo prodotto una prima riga contiene il nome del prodotto e il numero nfi di fornitori di tale prodotto. Nelle nfi righe successive sono elencati i nomi dei fornitori. nomi di prodotti, uno per riga (possibili ripetizioni, cioè righe contenenti lo stesso prodotto, indicanti più acquisti del relativo prodotto). 14 Il problem-solving 5
Algoritmo (soluzione esattaricorsiva) Strategia: n Ricerca Visitare (enumerare in modo ricorsivo) tutte le possibili soluzioni. Ogni chiamata ricorsiva gestisce un prodotto tra quelli in elenco, e prova per questo tutti i fornitori possibili n Ottimizzazione si mantengono soluzione corrente e soluzione migliore provvisoria. Ogni nuova soluzione viene confrontata con la migliore ed eventualmente la aggiorna (simile a ricerca di massimo/minimo) A. A. 2004/2005 14 Il problem-solving 6
Struttura dati Occorre prevedere strutture dati per: n Elenco dei fornitori ed elenco dei prodotti n Corrispondenze prodotti/fornitori. Sono informazioni simili ad archi in un grafo, sono quindi possibili: l n Soluzioni (corrente e migliore) l A. A. 2004/2005 Rappresentazioni a matrice o liste delle adiacenze Due vettori o due liste 14 Il problem-solving 7
Elenchi di fornitori e prodotti n Elenco fornitori e prodotti: array di stringhe o di struct, contenenti i nomi dei fornitori/prodotti ed eventuali informazioni aggiuntive l l A. A. 2004/2005 Semplicità di lettura e di gestione Possibile conversione da nome a indice (se il vettore è ordinato) di costo O(ln N) 14 Il problem-solving 8
Grafo prodotto-fornitori Le corrispondenze prodotti-fornitori costituiscono un grafo: n La matrice di adiacenza fornisce l l n Le liste di adiacenza offrono costi inferiori (lunghezza max. di lista L) l l A. A. 2004/2005 test di corrispondenza O(1) tra un prodotto e un fornitore Elenco dei fornitori(prodotti), per un dato prodotto(fornitore), di costo O(Nforn) (O(Nprod)) test di corrispondenza O(L) tra un prodotto e un fornitore Elenco dei fornitori(prodotti), per un dato prodotto(fornitore), di costo O(Lforn) (O(Lprod)) 14 Il problem-solving 9
Grafo prodotto-fornitori: utilizzo Dato un insieme di prodotti già selezionati e un nuovo prodotto pi, cercare tutti i fornitori di pi n Meglio la soluzione a liste di adiacenza A. A. 2004/2005 14 Il problem-solving 10
Il problema dei nomi Problema: passare dal nome di un fornitore/prodotto alle informazioni relative. n Se le informazioni sono in uno o più vettori, occorre associare a ogni fornitore/prodotto un INDICE n Se un fornitore/prodotto viene individuato per NOME, occorre un meccanismo di conversione NOME INDICE (ricerca) n Siccome la ricerca NON ha costo O(1), conviene, ove possibile, limitarla alla fase preliminare, lavorando esclusivamente su indici nel corso della procedura ricorsiva. A. A. 2004/2005 14 Il problem-solving 11
Soluzione corrente/migliore Le due soluzioni gestite (corrente e migliore), rappresentano insiemi di fornitori: possono essere gestite come vettori o liste. n Vista la dimensione ridotta e predicibile risulta più semplice gestire due vettori. Un insieme di prodotti può essere rappresentato in due modi l l A. A. 2004/2005 Vettore di indici (nella prima parte del vettore si accumulano gli indici appartenenti all’insieme) Vettore di informazioni logiche (appartenenza al sottoinsieme). Vettore con una casella per ogni fornitore. 14 Il problem-solving 12
La soluzione proposta n n Variabili locali: modularità, ma molti parametri alle funzioni Vettore di struct per i prodotti, vettore di stringhe per i fornitori. I vettori vengono ordinati per garantire ricerche logaritmiche: l n n n A. A. 2004/2005 la scelta può non essere necessaria – ma poco costosa – in quanto le ricerche sono limitate alla fase preliminare. Infatti, se complessità di ricerca ricorsiva >> complessità fase preliminare, si possono scegliere ricerche lineari. Liste (come vettori) di fornitori per un prodotto Soluzioni corrente e migliore: array di flag logici Viene proposta anche una soluzione greedy (discussa in seguito) 14 Il problem-solving 13
- Slides: 13