Scrivere un algoritmo non deterministico di complessita` polinomiale che risolva il problema del commesso viaggiatore. Vengono proposte due soluzioni,

Slides:



Advertisements
Presentazioni simili
S/N SCORM 2004 sequencing and navigation Sequencing definition model
Advertisements

Programmazione dinamica: problema della sottosequenza più lunga
1 Le s-espressioni. 2 Un nuovo esempio completo: le s-espressioni Sexpr 4 alberi binari (possibilmente vuoti) che hanno sulle foglie atomi (stringhe)
1 Progettazione gerarchica delle s- espressioni, utilizzando lereditarietà
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
Lez. 10 (10/11) - PBElementi di Programmazione1 Lezione 10 Funzioni e Moduli Macro Analisi del flusso Esercizi.
Alcune Classi Standard Object, Vettori. Esercizio dellultima volta Superclasse Persona Sottoclasse Libro.
Problemi di soddisfacimento di vincoli Maria Simi a.a. 2005/2006.
Sequential Statements. – Il VHDL simula lo svolgersi in parallelo di varie operazioni – Loggetto fondamentale e il PROCESS – Un PROCESS contiene una serie.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 17/03/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Layouts and Graphics. component - container - layout Un Container contiene [0 o +] Components Il Layout specifica come i Components sono disposti nel.
Informatica 2. Concetti fondamentali di programmazione Programmare vuol dire scrivere un algoritmo in un linguaggio che faccia funzionare un calcolatore.
TIPOLOGIA DELLE VARIABILI SPERIMENTALI: Variabili nominali Variabili quantali Variabili semi-quantitative Variabili quantitative.
1 Esercitazione sui segnali Problema: creare un programma analizzatore di file testuali che prenda come argomenti il nome di un file e una sequenza di.
APPUNTI SUL LINGUAGGIO C
Modello dati LISTA LISTA: LISTA: sequenza finita di 0 o più elementi LISTA di tipo T: lista in cui tutti gli elementi sono dello stesso tipo T. es. lista.
1 Implementazione di Linguaggi 2 PARTE 6 Implementazione di Linguaggi 2 PARTE 6 Massimo Ancona DISI Università di Genova Testo: A.V. Aho, R. Sethi, J.D.Ullman.
Algoritmo SelectSort Invariante di ciclo: ad ogni passo
Sottoprogrammi e Unità di Compilazione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Array Ricerca Ordinamento Fusione Nicola Fanizzi Laboratorio - Corso di Programmazione (B) C.d.L. in Informatica DIB - Università degli Studi di Bari.
Programmazione distribuita in Java
Esercizi Puntatori, struct con campi puntatore, puntatori a struct, rapporto tra array e puntatori. FUNZIONI Passaggio di parametri per indirizzo, passaggio.
Problema Ci sono 5 signore nel parco. Ognuna di loro ha 1 figlio. Ogni bambino ha 10 figurine di calciatori, per un totale quindi di 50 figurine. Questi.
FILE TESTO INPUT PROGRAMMA + DATI OUTPUT FILE DATI PROGRAMMA OUTPUT
Concurrency: introduction1 ©Magee/Kramer Semantica operazionale di FSP Consideriamo i costrutti FSP e diamo la loro traduzione in Reti SA.
Sequence. CREARE UNA SEQUENCE CREATE SEQUENCE nome [INCREMENT BY n] [START WITH n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] [CYCLE | NOCYCLE]
Elementi di programmazione ad oggetti a. a. 2009/2010 Corso di Laurea Magistrale in Ingegneria Elettronica Docente: Mauro Mazzieri, Dipartimento di Ingegneria.
Ricerca di una chiave: Search(x, k) if x == nil or k == x.key return x
Piero Scotto - C141 C14 #14 Puntatori e file. Il problema dellordinamento. Debug.
A CURA DI: SIMONE IANNETTI
Microsoft Access Maschere.
Piano gestione solventi
JavaScript Lezione 5 Tipizzazione ed operazioni tra tipi diversi Istruzioni di input.
PROGETTO “NASTRO FERMI”
Due amici Carrozzieri si incontrano per un confronto
Prof. Cerulli – Dott.ssa Gentili
DSS Identità oggetto Contenuto Modalità di uso Nome oggetto: numero
Università degli Studi di BresciaA.A. 2012/2013 Fondamenti di Programmazione Docente: Alessandro SaettiA.A. 2012/2013 Università degli Studi di Brescia.
OUTPUT FORMATTATO La funzione printf consente di effettuare la stampa a video formattata. Sintassi: printf ( stringa_formato, arg0, arg1, … ); La stringa.
Modulo 1 bis Menù Incolla Esercitazione Un computer è quasi umano, a parte il fatto che non attribuisce i propri errori a un altro computer. (Anonimo)
Al margine di un campo agricolo, una gallina attraversa la strada..... DOMANDA: Perché la gallina ha attraversato la strada? Vediamo come alcuni uomini.
MSI ITALIA POLICY RMA.
Realizzazione Grammatica non contestuale –no ricorsioni sinistre –LL(1) produzione individuata dal primo token Ogni non-terminale -> funzione –rappresenta.
(1) Sistemi Operativi Prof. P. Cattaneo ufficio: L Ricevimento: Martedì14.00 –
24 aprile 2002 Avvisi: Risultati 1 o Esonero: (entro) lunedi 27 disponibili nella pag. WEB, ma anche esposti nella bacheca fuori dal corridoio 2 o dente,
ND-partizione (A) n   A  somma  0 M  1/2 (  a i ) for i  1 to n do S[i]  choice ({true, false}) if S[i] then somma  somma + a i if somma > M then.
Cammini minimi da un sorgente
PUCCINI PRIMARY SCHOOL SENIGALLIA - ITALYGAMESHOPSCOTCH-HOPSCOTCH-HOPSCOTCH-HOPSCOTCH SETTIMANA - SETTIMANA - SETTIMANA - SETTIMANA Italian children are.
Algoritmi Paralleli e Distribuiti a.a. 2008/09 Lezione del 07/04/2009 Prof. ssa ROSSELLA PETRESCHI a cura del Dott. SAVERIO CAMINITI.
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi Interconnessione tramite reti Lezione n°6.
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi Somme prefisse Lezione n°2.
Ambienti di Programmazione per il Software di Base
Algoritmi Avanzati a.a.2014/2015 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2015/2016 Prof.ssa Rossella Petreschi
Branch and Bound Lezione n°19 Prof.ssa Rossella Petreschi
Branch and Bound Lezione n°14 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2013/2014 Prof.ssa Rossella Petreschi
Lezione n°17 Prof.ssa Rossella Petreschi
iterazione o ricorsione nel pensare per OGGETTI
Branch and Bound Lezione n°18 Prof.ssa Rossella Petreschi
Schema generale, visita in ampiezza e profondità.
Algoritmi Avanzati a.a.2011/2012 Prof.ssa Rossella Petreschi
Algoritmi Avanzati Prof.ssa Rossella Petreschi
comprensione e modifica di codice
L’algoritmo MergeSort
comprensione e modifica di codice
Backtracking Lezione n°17 Prof.ssa Rossella Petreschi
Algoritmi Avanzati a.a.2010/2011 Prof.ssa Rossella Petreschi
APPUNTI SUL LINGUAGGIO C
Transcript della presentazione:

Scrivere un algoritmo non deterministico di complessita` polinomiale che risolva il problema del commesso viaggiatore. Vengono proposte due soluzioni, entrambe riconducibili allo schema generale. Nella soluzione I l’insieme delle scelte varia, nel senso che ad ogni città visitata dal commesso viaggiatore tale città viene eliminata dall’insieme delle scelte che potranno essere fatte successivamente. Nella soluzione II, invece, l’insieme delle scelte resta inalterato, ma ad ogni scelta si dovrà verificare che la città non sia già stata visitata. Le città siano numerate da 1 a n, e 1 sia la città di partenza. Chiamiamo D la tabella della distanze (cioè il grafo memorizzato come matrice di adiacenza), k il costo da non superare, entrambi forniti in input, e C il vettore che memorizza il percorso, se esiste; la variabile costo e` usata per ricordare il costo del cammino.

ND1_commesso_viaggiatore (D,C, k) C[1]  1 costo  0 I_S  {2, …, n} for i  2 to n do C[i]  choice (I_S) I_S  I_S - {C[i]} costo  costo + D C[i-1],C[i] if costo > k then failure costo  costo + D C[n],C[1] if costo > k then failure else success I soluzione NON_deterministica (…) … for i  1 to n do I  ins. delle scelte per A[i] if I =  then failure A[i]  choice (I) If A[1],…,A[i] “non puo` diventare una soluzione” then failure else if “e` una soluzione” then success failure (success)

ND2_commesso_viaggiatore (D,C, k) C[1]  1 costo  0 for i  2 to n do C[i]  choice ({2, …, n}) for j  2 to (i - 1) do if C[i] = C[j] then failure costo  costo + D C[i-1],C[i] if costo > k then failure costo  costo + D C[n],C[1] if costo > k then failure else success II soluzione NON_deterministica … for i  1 to n do I  ins. delle scelte per A[i] if I =  then failure A[i]  choice (I) If A[1],…,A[i] “non puo` diventare una soluzione” then failure else if “e` una soluzione” then success failure (success)

Equivalente algoritmo deterministico per enumerazione I soluzione comm_viaggiatore1 (D, C, k) C[1]  1 costo  0 I_S  if En_C_V (2, I_S, costo) then costo  costo + D C[n],C[1] if costo  k then return true return false

En1_C_V (i, I_S, costo) if i  n then for j  1 to |I_S| do C[i]  I_S[j] costo  costo + D C[i-1],C[i] I_S  I_S - {C[i]} if costo  k then if En_C_V (i+1, I_S, costo) then return true return false else return true Enum (i,...) if i  n then I  ins. scelte per A[i] if I =  then return false for j  1 to |I| do A[i]  I[j] if A[1],…,A[i] “puo` diventare una soluzione” then if “e` una soluzione” then return true if Enum (i+1,...) then return true return false else return false (true)

Attenzione! Ci sono due errori dovuti a due caratteristiche che distinguono questo problema da quelli visti a lezione (Domino_limitato e Cricca) I side-effect negativi ai quali si deve rimediare quando si effettua back-tracking in Domino e Cricca erano rimediati dalle assegnazioni successive costo  costo - D C[i-1],C[i] I_S  I_S  {C[i]} In questo caso invece, se il for deve essere eseguito per un altro valore di j, il costo e l’insieme delle scelte devono essere ripristinati al valore che avevano prima dell’ultima “strada” tentata, cioè:

if i  n then for j  1 to |I_S| do C[i]  I_S[j] costo  costo + D C[i-1],C[i] I_S  I_S - {C[i]} if costo  k then if En1_C_V (i+1, I_S, costo) then return true Otteniamo così la seguente versione costo  costo - D C[i-1],C[i] I_S  I_S  {C[i]} return false else return true En1_C_V (i, I_S, costo)

Per Domino e Cricca una volta trovata una soluzione è inutile continuare a tentare strade alternative sull’albero delle scelte. Per il Commesso Viaggiatore, al contrario, quando aggiungendo il costo dell’ultimo tratto di chiusura del percorso si scopre che il costo complessivo supera k, non si ha la sicurezza che la soluzione non esista. Bisogna esplorare le scelte alternative, se ne restano. Come rimediare? Basta spostare il controllo relativo all’ultimo tratto di percorso 1 - nei punti in cui si rientra con successo, oppure 2 - sulle foglie dell’albero delle scelte, cioè all’ultimo richiamo ricorsivo, quando i > n.

if i  n then for j  1 to |I_S| do C[i]  I_S[j] costo  costo + D C[i-1],C[i] I_S  I_S - {C[i]} if costo  k then if En_C_V (i+1, I_S, costo) and costo + D C[i-1],C[i]  k then return true costo  costo - D C[i-1],C[i] I_S  I_S  {C[i]} return false else return true En11_C_V (i, I_S, costo) 1 - nei punti in cui si rientra con successo

if i  n then for j  1 to |I_S| do C[i]  I_S[j] costo  costo + D C[i-1],C[i] I_S  I_S - {C[i]} if costo  k then if En_C_V (i+1, I_S, costo) then return true costo  costo - D C[i-1],C[i] I_S  I_S  {C[i]} return false else if costo + D C[n],C[1]  k then return true else return false En12_C_V (i, I_S, costo) 2 - all’ultimo richiamo ricorsivo

if i  n then for j  1 to |I_S| do C[i]  I_S[j] costo  costo + D C[i-1],C[i] I_S  I_S - {C[i]} if costo  k then if En11_C_V (i+1, I_S, costo) then return true costo  costo - D C[i-1],C[i] I_S  I_S  {C[i]} return false else if costo + D C[n],C[1]  k then return true else return false En12_C_V (i, I_S, costo) In definitiva, poichè il controllo nel programma principale è diventato inutile, si ottiene: comm_viaggiatore1 (D, C, k) C[1]  1 costo  0 I_S  if En_C_V (2, I_S, costo) then return true return false

comm_viaggiatore2 (D,C, k) C[1]  1 costo  0 if En2_C_V (2, costo) then return true return false II soluzione

En2_C_V (i, costo) if i  n then for j  2 to n do C[i]  j t  2 while t  i-1 and C[i]  C[t] do t  t + 1 if t = i then costo  costo + D C[i-1],C[i] if costo  k then if En2_C_V (i+1, costo) then return true costo  costo - D C[i-1],C[i] Enum (i,...) if i  n then I  ins. scelte per A[i] if I =  then return false for j  1 to |I| do A[i]  I[j] if A[1],…,A[i] “ puo` diventare una soluzione” then if “e` una soluzione” then return true else if Enum (i+1,...) then return true return false else return false (true) return false else if costo + D C[n],C[1]  k then return true else return false

En2_C_V (i, costo) if i  n then for j  2 to n do C[i]  j t  2 while t  i-1 and C[i]  C[t] do t  t + 1 if t = i then costo  costo + D C[i-1],C[i] if costo  k then if En2_C_V (i+1, costo) then return true costo  costo - D C[i-1],C[i] return false else if costo + D C[n],C[1]  k then return true else return false comm_viaggiatore2 (D,C, k) C[1]  1 costo  0 if En2_C_V (2, costo) then return true return false