Tema 4: Algoritmos Voraces 4.1. 4.2. 4.3. 4.4. Esquema de los algoritmos voraces Problema del viajante con prisa Problema del cambio de monedas Problema del viajante de comercio Problema del viajante con prisa Clase ViajanteConPrisa hereda de EsquemaVoraz Clase EsquemaVoraz proc voraz() alg inicializa() mientras (No fin()) seleccionaYElimina () si prometedor(): anotaEnSolucion() fsi fmientras fin g: array[1..n] de Entero kmMax: Entero sol: array[1..n] de Logico k, kms: Entero proc inicializa() alg sol := <crea un array de n booleanos todos a falso> kms := 0 sol[1] := cierto k := 1 fin 1 Problema del viajante con prisa func fin() dev (b: Logico) alg b := (k = n) fin proc seleccionaYElimina() alg k := k +1 kms := kms + g[k] fin func prometedor() dev (b: Logico) alg si k < n: b := (g[k + 1] > kmMax – kms) otras: b := (kms = kmMax) fsi fin proc anotaEnSolucion() alg sol[k] := cierto kms := 0 fin Clase EsquemaVoraz proc voraz() alg inicializa() mientras (No fin()) seleccionaYElimina() si prometedor(): anotaEnSolucion() fsi fmientras fin Problema del cambio de monedas m: array[1..n] de Entero c: Entero k: Entero sol: array[1..n] de Entero proc seleccionaYElimina() alg k := k + 1 fin proc inicializa() alg sol := <crea un array de n enteros todos a cero> k := 0 fin func prometedor() dev (b: Logico) alg b := (m[k] <= c) fin func fin() dev (b: Logico) alg b := (k = n O c = 0) fin proc anotaEnSolucion() alg sol[k] := ⎣c/m[k]⎦ c := c - m[k] * sol[k] fin Clase EsquemaVoraz proc voraz() alg inicializa() mientras (No fin()) seleccionaYElimina() si prometedor(): anotaEnSolucion() fsi fmientras fin 2 Problema del viajante de comercio 1 1 a 3 b 4 b 3 a 2 4 c 10 e c 2 3 20 d e 20 3 10 d (Grafo Completo) Representamos el problema como un grafo no dirigido, completo y ponderado A partir de b el algoritmo voraz escogería d en lugar de c, a pesar de que es mejor elección Problema del viajante de comercio Clase ViajanteVZ EsquemaVoraz hereda de g: Grafo origen: Vertice sol: Array [1..n] de Arista k: Entero l: Lista de Vertice u: Vertice v: Vertice a: Arista Clase EsquemaVoraz proc voraz() alg inicializa() mientras (No fin()) seleccionaYElimina() si prometedor(): anotaEnSolucion() fsi fmientras fin proc inicializa() alg l := <lista de vertices de g> <borra origen de l> k := 1 u := origen fin func fin() dev (b: Logico) alg b := (<l vacia>) fin func prometedor() dev (b: Logico) alg b := cierto fin 3 Problema del viajante de comercio proc seleccionaYElimina() fsi var i := i + 1 n, min, i: Entero fmientras vv: Vertice <borra v de l> aa: Arista fin alg n := <numero de elementos de l> proc anotaEnSolucion() v := <primer elemento de l> alg a := <arista desde u a v> sol[k] := a min := <peso de a> k := k+1 i := 2 u := v mientras i<=n si fin(): vv := <i-ésimo elemento de l> a := <arista que une aa := <arista desde u a vv> u con origen> si min > <peso de aa>: sol[k] := a <a,v> := <aa,vv> fsi min := <peso de a> fin Clase EsquemaVoraz proc voraz() alg inicializa() mientras (No fin()) seleccionaYElimina() si prometedor(): anotaEnSolucion() fsi fmientras fin 4