Tema 4: Algoritmos Voraces

Anuncio
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
Descargar