Documentos de Académico
Documentos de Profesional
Documentos de Cultura
v
v
v
v
v
v
v
v
v
v
Introduccin
El problema de las ocho reinas
El problema de la suma de
subconjuntos
Coloreado de grafos
Ciclos hamiltonianos
Atravesar un laberinto
El recorrido del caballo de ajedrez
El problema de la mochila 0-1
Reconstruccin de puntos
a partir de las distancias
rboles de juego: tic-tac-toe
J. Campos - C.P.S.
2
16
26
36
44
52
56
74
85
95
J. Campos - C.P.S.
ti
i =1
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
3 4
6 7 8
1
2
3
4
5
6
7
8
Una solucin: (4,6,8,2,7,1,3,5)
J. Campos - C.P.S.
x1 =1
x1 =2
18
x2 =2
x2 =3
3
x3 =
x4 =
3
5
x2 =4
x2 =1
x2 =3
13
4 2
x1 =4
x1 =3
4 2
19
11 14 16
10 12 15 17
24
29
4 1
35
20 22 25 27 30 32
4
2
x2 =1
x2 =2
x2 =4
4 1
34
21 23 26 28 31 33
40
45
4 1
51
36 38 41 43 46 48
4
1
x2 =1
x2 =2
x2 =4
4 1
50
37 39 42 44 47 49
56
3 1
61
3 1
53 55 58 60 63 65
52 54 57 59 62 64
3
2
x2 =3
Esquema algortmico:
Sea (x1,,xi) un camino de la raz hasta un nodo
del rbol del espacio de estados.
Sea G(x1,,xi) el conjunto de los valores posibles
de xi+1 tales que (x1,,xi+1) es un camino hasta un
nodo del rbol.
Suponemos que existe algn predicado acotador
A tal que A(x1,,xi+1) es falso si el camino
(x1,,xi+1) no puede extenderse para alcanzar un
nodo de respuesta (i.e., una solucin).
Por tanto, los candidatos para xi+1 son los valores
de G tales que satisfacen A.
Supongamos, finalmente, que existe un
predicado R que determina si un camino
(x1,,xi+1) termina en un nodo respuesta (i.e., es
ya una solucin).
J. Campos - C.P.S.
variable
variable nodo:elmto
nodo:elmto
principio
principio
para
para todo
todo nodo
nodo en
en G(solucin,1,k-1)
G(solucin,1,k-1) hacer
hacer
solucin[k]:=nodo;
solucin[k]:=nodo;
si
si A(solucin,1,k)
A(solucin,1,k)
entonces
entonces
si
si R(solucin,1,k)
R(solucin,1,k)
entonces
entonces guardar(solucin,1,k)
guardar(solucin,1,k)
fsi;
fsi;
retroceso(k+1,solucin)
retroceso(k+1,solucin)
fsi
fsi
fpara
fpara
fin
fin
(b)
(c)
(d)
x1 =1
(e)
(f)
18
x2 =2
x2 =3
3
x3 =
(g)
x1 =2
2
9
x4 =
x2 =4
13
4 2
x2 =1
x2 =3
19
24
11 14 16
3
15
29
1
30
3
31
(h)
J. Campos - C.P.S.
x2 =4
De nuevo, en general:
Ntese que el rbol no se construye
explcitamente sino implcitamente mediante las
llamadas recursivas del algoritmo de bsqueda.
El algoritmo no hace llamadas recursivas
cuando:
u k = n+1, o cuando
u ningn nodo generado por G satisface A.
Backtracking =
= bsqueda de primero en profundidad y
con predicados acotadores
J. Campos - C.P.S.
Variantes:
Limitar el nmero de soluciones a una sola
aadiendo un parmetro booleano de salida que
indique si se ha encontrado una solucin.
Forzar a que slo los nodos hoja puedan
significar solucin (realizando la recursin slo si
no se ha encontrado un nodo solucin):
si R(solucin,1,k)
entonces guardar(solucin,1,k)
sino retroceso(k+1,solucin)
fsi
Resolver problemas de optimizacin: adems de
la solucin actual en construccin hay que
guardar la mejor solucin encontrada hasta el
momento.
Se mejora la eficiencia de la bsqueda si los
predicados acotadores permiten eliminar los
nodos de los que se sabe que no pueden llevar a
una solucin mejor que la ahora disponible
(poda; mtodos de ramificacin y acotacin).
J. Campos - C.P.S.
Sobre la eficiencia:
Depende de:
u el tiempo necesario para generar un
elemento solucin[k],
u el nmero de elementos solucin que
satisfacen las restricciones explcitas G,
u el tiempo de ejecucin de los predicados
acotadores A, y
u el nmero de elementos solucin[k] que
satisfacen los predicados A.
Mejoras:
u Si se consigue que los predicados acotadores
reduzcan mucho el nmero de nodos
generados
(aunque un buen predicado acotador precisa
mucho tiempo de evaluacin;
compromiso)
Si lo reducen a un solo nodo generado
(solucin voraz): O(n) nodos a generar
en total
En el peor caso, O(p(n)2n) O(p(n)n!),
con p(n) un polinomio
u Si es posible: reordenar las selecciones de
forma que |C1|<|C2|<<|Cn|, y as cabe
esperar que se explorarn menos caminos.
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
Consideraremos el problema ms
general de colocar n reinas en un
tablero de dimensiones nn, sin que se
den jaque.
Cada solucin se representa por una n-tupla
(x1,,xn), en la que xi es la columna de la i-sima
fila en la que se coloca la i-sima reina.
El espacio de soluciones se reduce a n! elementos
teniendo en cuenta que todas ellas han de ser
permutaciones de (1,2,,n), es decir, todas las xi
han de ser distintas.
Adems, no deben compartir diagonal.
J. Campos - C.P.S.
Representacin de la informacin
Debe permitir interpretar fcilmente la solucin:
x:vector[1..n]de entero;
{x[i]=columna de la reina en i-sima fila}
J. Campos - C.P.S.
c1 c2 = f 1 f 2
variables
variables i:entero;
i:entero; amenaza:bool
amenaza:bool
principio
principio
i:=1;
i:=1; amenaza:=falso;
amenaza:=falso;
mq
(i<k)
mq (i<k) and
and not
not amenaza
amenaza hacer
hacer
si
si x[i]=x[k]
x[i]=x[k] or
or abs(x[i]-x[k])=abs(i-k)
abs(x[i]-x[k])=abs(i-k)
entonces
entonces amenaza:=verdad
amenaza:=verdad
sino
sino i:=i+1
i:=i+1
fsi
fsi
fmq;
fmq;
devuelve
devuelve not
not amenaza
amenaza
fin
fin
El coste de la funcin es O(k-1).
J. Campos - C.P.S.
algoritmo
algoritmo colocarReinas(ent
colocarReinas(ent k:entero;
k:entero;
entsal
sol:vector[1..n]de
entsal sol:vector[1..n]de entero)
entero)
{sol[1..k-1]
{sol[1..k-1] estn
estn bien
bien colocadas}
colocadas}
variables
variables i:entero
i:entero
principio
principio
para
para i:=1
i:=1 hasta
hasta nn hacer
hacer
sol[k]:=i;
sol[k]:=i;
si
si buenSitio(k,sol)
buenSitio(k,sol)
entonces
entonces
si
si k=n
k=n
entonces
entonces escribir(sol)
escribir(sol)
sino
sino colocarReinas(k+1,sol)
colocarReinas(k+1,sol)
fsi
fsi
fsi
fsi
fpara
fpara
fin
fin
...
...
colocarReinas(1,sol);
colocarReinas(1,sol);
...
...
J. Campos - C.P.S.
(8,5,4,3,2)1649
(8,5,3,1,2,1)749
(8,6,4,3,2)1977
(8,6,4,2,1,1,1)1401
(8,5,3,2,2,1,1,1)2329
J. Campos - C.P.S.
1+
(8 i) = 69281
j = 0 i = 0
Para n mayor:
la mejora se hace ms considerable.
1.302.061.345
J. Campos - C.P.S.
Novedad:
Recientemente se ha encontrado una
solucin compacta para el problema
general de las n reinas en un tablero
nn (excepto para n=2, n=3, n=8 y n=9):
Si n es impar (n=2p-1) y n3 y n9:
u Si n no es mltiplo de 3:
(2k-1,k), 1kp
(2m,m+p), 1mp-1
u Si n es mltiplo de 3 y n3 y n9:
(2k,k), 1kp-1, k4
(2m+1,m+p-1), 1mp-2
(n,4)
(8,n-1)
(1,n)
J. Campos - C.P.S.
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
v
Problema:
Dados un conjunto W={w1,,wn} de n nmeros
positivos y otro nmero positivo M, se trata de
encontrar todos los subconjuntos de W cuya
suma es M.
Ejemplo: si W={11,13,24,7} y M=31, entonces la
solucin es {11,13,7} y {24,7}.
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
v
xi j
j es un entero y
1 j n
Implcitas:
i j xi x j
k
w xi = M
i= 1
xi < xi +1 , 1 i < n
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
v
Conclusin:
Pueden existir varias formas de formular un
problema, con distintas representaciones de las
soluciones (aunque siempre verificando stas un
conjunto de restricciones explcitas e implcitas).
En el problema que consideramos, ambas
representaciones nos llevan a un espacio de
estados que consta de 2n tuplas.
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
v
x1 =1
x1 =2
3
x2 =2
x2 =3 x =4
2
6
x3 =3
x3 =4 x3 =4
12 13
14
x1 =4
x1 =3
x2 =3 x2 =4
8
10
x2 =4
11
x3 =4
15
x4 =4
16
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
v
x1 =1
x1 =0
x2 =1
x2 =0
18
x2 =1
19
x3 =1
x3 =0
26
x3 =1
27
x3 =0
20
31
28
29
24
21
25
22
x3 =1
x3 =0
12
x4 =0
x4 =0
x4 =0
x4 =0
x4 =1
x4 =1
x4 =1
x4 =1
x4 =1
30
x2 =0
23
16
x3 =1
13
x4 =0
x4 =1
17
14
x3 =0
x4 =0
x4 =1
15
10
x4 =0
x4 =1
11
x4 =0
El problema de la suma de
subconjuntos
v
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
Funcin acotadora:
La tupla (x[1],x[k]) slo puede conducir a una
solucin si:
k
w[i ] x[ i ]
i =1
w [i ] M
i =k +1
w[i ] x[ i ]
+ w [k + 1] > M
i =1
w [i ] x[ i ] + w [ i ] M
i =1
i =k +1
k
w [ i ] x[ i ] + w [ k + 1] M
i =1
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
algoritmo
algoritmo sumasub(ent
sumasub(ent s,k,r:entero)
s,k,r:entero)
{Encuentra
{Encuentra todos
todos los
los subconjuntos
subconjuntos del
del vector
vector
global
global ww cuya
cuya suma
suma es
es M.
M.
Los
valores
de
x[j],
que
Los valores de x[j], que es
es otro
otro vector
vector global,
global,
1j<k
ya
han
sido
calculados.
1j<k ya han sido calculados.
k -1
s=
s= j=1 w[j]*x[j];
w[j]*x[j]; r=
r= j=k w[j].
w[j].
Los
Los w[j]
w[j] estn
estn en
en orden
ordennno
no decreciente.
decreciente.
Se
asume
que
w[1]M
y
w[i]M.}
Se asume que w[1]M y i=1 w[i]M.}
principio
principio
{Generacin
{Generacin del
del hijo
hijo izquierdo.
izquierdo.
Ntese
que
s+w[k]M
porque
Ntese que s+w[k]M porqueBk 1 (x[ 1] ,,x[k - 1]) =verdad }}
x[k]:=1;
x[k]:=1;
si
si s+w[k]=M
s+w[k]=M {se
{se ha
ha encontrado
encontrado un
un subconjunto}
subconjunto}
entonces
entonces escribir(x[1..k])
escribir(x[1..k])
sino
sino
si
si s+w[k]+w[k+1]
s+w[k]+w[k+1]MM
entonces
entonces {Bk (x[ 1] ,,x [k ]) =verdad}
sumasub(s+w[k],k+1,r-w[k])
sumasub(s+w[k],k+1,r-w[k])
fsi
fsi
fsi
fsi
...
...
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
...
...
{Generacin
{Generacin del
del hijo
hijo derecho
derecho yy evaluacin
evaluacin de
deBk }}
si
si (s+r-w[k]
(s+r-w[k]M)
M) and
and (s+w[k+1]
(s+w[k+1]M)
M) {Bk =verdad}
entonces
entonces
x[k]:=0;
x[k]:=0;
sumasub(s,k+1,r-w[k])
sumasub(s,k+1,r-w[k])
fsi
fsi
fin
fin
i =1 w[ i ]x[i ]
k
i =k +1 w[i ]
sumasub(0,1, i=1w[i])
w[i])
...
...
J. Campos - C.P.S.
El problema de la suma de
subconjuntos
Ejemplo: n=6, M=30, W=(5,10,12,13,15,18)
Los rectngulos son s,k,r en cada llamada.
A=(1,1,0,0,1); B=(1,0,1,1); C=(0,0,1,0,0,1).
Se construyen 23 nodos (del total de 26-1=63)
0,1,73
x[1]=1
5,2,68
0,2,68
x[2]=0
x[2]=1
5,3,58
15,3,58
x[3]=1
27,4,46
x[3]=0
15,4,46
x[3]=1
17,4,46
x[4]=1
x[4]=0
15,5,33
x[5]=1
10,3,58
0,3,58
x[3]=0
0,4,46
10,4,46
12,4,46
10,5,33
12,5,33
13,5,33
12,6,18
13,6,18
5,4,46
x[4]=0
5,5,33
x[5]=1
20,6,18
J. Campos - C.P.S.
0,5,33
Coloreado de grafos
v
Problema de decisin:
Dados un grafo G y un nmero entero positivo
m, es G m-coloreable?
Es decir, se puede pintar con colores los nodos
de G de modo que no haya dos vrtices
adyacentes con el mismo color y se usen slo m
colores?
Problema de optimizacin:
Dado un grafo G, cul es su nmero cromtico?
Es decir, cul es el menor nmero m de colores
con el que se puede colorear G?
J. Campos - C.P.S.
Coloreado de grafos
v
5
2
1
5
3
4
Coloreado de grafos
v
J. Campos - C.P.S.
Coloreado de grafos
v
x[2]=1
x[3]=1
x[2]=2
x[1]=2
x[1]=3
x[2]=3
x[3]=
3
x[3]
=2
Grado m y altura n.
Cada nodo de nivel i tiene m hijos que
corresponden a las m posibles asignaciones a x[i],
1in.
J. Campos - C.P.S.
Coloreado de grafos
v
algoritmo
algoritmo m_coloreado(ent
m_coloreado(ent k:entero;
k:entero;
entsal
entsal x:sol)
x:sol)
{Se
{Se usa
usa una
una variable
variable global
global gg de
de tipo
tipo grafo.
grafo.
En
En xx se
se tiene
tiene la
la parte
parte de
de la
la solucin
solucin ya
ya calculada
calculada
(es
(es decir,
decir, hasta
hasta x[k-1])
x[k-1]) yy kk es
es el
el ndice
ndice del
del
siguiente
vrtice
al
que
se
va
a
asignar
color.}
siguiente vrtice al que se va a asignar color.}
principio
principio
repetir
repetir
{generar
{generar todos
todos los
los colores
colores legales
legales para
para x[k]}
x[k]}
siguienteValor(x,k);
{x[k]:=un
color
legal}
siguienteValor(x,k); {x[k]:=un color legal}
si
si x[k]
x[k]00 {se
{se ha
ha encontrado
encontrado un
un color
color legal}
legal}
entonces
entonces
si
si k=n
k=n
entonces
entonces escribir(x)
escribir(x)
sino
sino m_coloreado(k+1,x)
m_coloreado(k+1,x)
fsi
fsi
fsi
fsi
hastaQue
hastaQue x[k]=0
x[k]=0
fin
fin
J. Campos - C.P.S.
Coloreado de grafos
algoritmo
algoritmo siguienteValor(entsal
siguienteValor(entsal x:sol;
x:sol;
ent
ent k:entero)
k:entero)
{x[1]x[k-1]
{x[1]x[k-1] tienen
tienen colores
colores asociados
asociados de
de forma
forma
que
todos
los
vrtice
adyacentes
tienen
distinto
que todos los vrtice adyacentes tienen distinto
color.
color.
x[k]
x[k] tiene
tiene el
el anterior
anterior color
color para
para el
el que
que se
se ha
ha
probado
(0
si
no
se
ha
probado
con
ninguno).
probado (0 si no se ha probado con ninguno).
Se
Se calcula
calcula el
el siguiente
siguiente color
color para
para x[k]
x[k]
diferente
del
de
todos
los
vrtices
diferente del de todos los vrtices adyacentes
adyacentes
aa kk (0
(0 si
si no
no hay
hay ninguno).}
ninguno).}
variables
variables encontrado:booleano;
encontrado:booleano; j:entero
j:entero
principio
principio
repetir
repetir
x[k]:=(x[k]+1)
x[k]:=(x[k]+1) mod
mod (m+1);
(m+1); {siguiente
{siguiente color}
color}
si
si x[k]
x[k]00
entonces
entonces
encontrado:=verdad;
encontrado:=verdad;
j:=1;
j:=1;
mq
mq (jn)
(jn) and
and encontrado
encontrado hacer
hacer
si
g[k,j]
and
(x[k]=x[j])
si g[k,j] and (x[k]=x[j])
entonces
entonces encontrado:=falso
encontrado:=falso
sino
sino j:=j+1
j:=j+1
fsi
fsi
fmq
fmq
fsi
fsi
hastaQue
hastaQue (x[k]=0)
(x[k]=0) or
or encontrado
encontrado
fin
fin
J. Campos - C.P.S.
Coloreado de grafos
v
para
para i:=1
i:=1 hasta
hasta nn hacer
hacer
x[i]:=0
x[i]:=0
fpara;
fpara;
m_coloreado(1,x);
m_coloreado(1,x);
...
...
J. Campos - C.P.S.
Coloreado de grafos
v
mi n = n (m n + 1 1 ) (m 1)= O (nm n )
n
i= 1
J. Campos - C.P.S.
Ciclos hamiltonianos
v
viV, i=1,,n+1,
(vi,vi+1)A, i=1,,n,
v1=vn+1,
J. Campos - C.P.S.
Ciclos hamiltonianos
v
Ejemplos:
1
Hamiltoniano: 1-2-8-7-6-5-4-3-1
1
5
J. Campos - C.P.S.
Ciclos hamiltonianos
v
J. Campos - C.P.S.
Ciclos hamiltonianos
v
J. Campos - C.P.S.
Ciclos hamiltonianos
Representacin elegida: matriz de adyacencias.
tipo
tipo grafo
grafo == vector[1..n,1..n]
vector[1..n,1..n] de
de bool
bool
Justificacin de la eleccin: slo necesitaremos
saber si un arco existe o no.
Representacin de la solucin: vector de vrtices.
tipo
tipo sol
sol == vector[1..n]
vector[1..n] de
de 1..n
1..n
algoritmo
algoritmo siguienteValor(entsal
siguienteValor(entsal x:sol;
x:sol;
ent
ent k:entero)
k:entero)
{x[1],,x[k-1]
{x[1],,x[k-1] es
es un
un camino
camino de
de k-1
k-1 vrtices
vrtices
distintos.
distintos.
Si
Si x[k]=0,
x[k]=0, no
no se
se ha
ha asignado
asignado ningn
ningn vrtice
vrtice
todava
todava aa x[k].
x[k].
Al
terminar,
Al terminar, x[k]
x[k] toma
toma el
el valor
valor del
del siguiente
siguiente
(en
orden
ascendente)
vrtice
tal
que:
(en orden ascendente) vrtice tal que:
(1)
(1) no
no aparece
aparece ya
ya en
en x[1],,x[k-1],
x[1],,x[k-1], yy
(2)
(2) est
est conectado
conectado por
por un
un arco
arco aa x[k-1].
x[k-1].
Adems,
Adems, si
si k=n,
k=n, se
se debe
debe exigir
exigir aa x[k]
x[k] que:
que:
(3)
(3) est
est conectado
conectado por
por un
un arco
arco aa x[1].
x[1].
Si
no
hay
tal
vrtice,
x[k]=0.}
Si no hay tal vrtice, x[k]=0.}
...
...
J. Campos - C.P.S.
Ciclos hamiltonianos
...
...
variables
variables encontrado:booleano;
encontrado:booleano; j:entero
j:entero
principio
principio
repetir
repetir
x[k]:=(x[k]+1)
x[k]:=(x[k]+1) mod
mod (n+1);
(n+1);
si
si x[k]
x[k]00
entonces
entonces
encontrado:=falso;
encontrado:=falso;
si
si g[x[k-1],x[k]]
g[x[k-1],x[k]]
entonces
entonces
j:=1;
j:=1;
encontrado:=verdad;
encontrado:=verdad;
mq
mq (jk-1)
(jk-1) and
and encontrado
encontrado hacer
hacer
si
x[j]=x[k]
si x[j]=x[k]
entonces
entonces encontrado:=falso
encontrado:=falso
sino
sino j:=j+1
j:=j+1
fsi
fsi
fmq;
fmq;
si
si encontrado
encontrado entonces
entonces
si
si (k=n)
(k=n) and
and not
not g[x[n],1]
g[x[n],1]
entonces
entonces encontrado:=falso
encontrado:=falso
fsi
fsi
fsi
fsi
fsi
fsi
fsi
fsi
hastaQue
hastaQue (x[k]=0)
(x[k]=0) or
or encontrado
encontrado
fin
fin
J. Campos - C.P.S.
Ciclos hamiltonianos
algoritmo
algoritmo hamiltoniano(ent
hamiltoniano(ent k:entero;
k:entero;
entsal
entsal x:sol)
x:sol)
{Se
{Se usa
usa una
una variable
variable global
global gg de
de tipo
tipo grafo.
grafo.
Clculo
de
los
ciclos
hamiltonianos
de
Clculo de los ciclos hamiltonianos de un
un grafo
grafo
mediante
bsqueda
con
retroceso.
mediante bsqueda con retroceso.
En
En xx se
se tiene
tiene la
la parte
parte de
de la
la solucin
solucin ya
ya calculada
calculada
(es
(es decir,
decir, hasta
hasta x[k-1])
x[k-1]) yy kk es
es el
el ndice
ndice del
del
siguiente
siguiente vrtice
vrtice del
del ciclo
ciclo que
que se
se va
va aa asignar.}
asignar.}
principio
principio
repetir
repetir
{generar
{generar todos
todos los
los valores
valores legales
legales para
para x[k]}
x[k]}
siguienteValor(x,k);
siguienteValor(x,k);
si
si x[k]
x[k]00
entonces
entonces
si
si k=n
k=n
entonces
entonces
escribir(x,1)
escribir(x,1)
sino
sino hamiltoniano(k+1,x)
hamiltoniano(k+1,x)
fsi
fsi
fsi
fsi
hastaQue
hastaQue x[k]=0
x[k]=0
fin
fin
J. Campos - C.P.S.
Ciclos hamiltonianos
v
x[1]:=1;
x[1]:=1;
para
para i:=2
i:=2 hasta
hasta nn hacer
hacer
x[i]:=0
x[i]:=0
fpara;
fpara;
hamiltoniano(2,x);
hamiltoniano(2,x);
...
...
J. Campos - C.P.S.
Atravesar un laberinto
v
Problema:
Nos encontramos en una entrada de un laberinto
y debemos intentar atravesarlo.
J. Campos - C.P.S.
Atravesar un laberinto
Disearemos un algoritmo
de bsqueda con retroceso
de forma que se marcar
en la misma matriz del
laberinto un camino
solucin (si existe).
XXX
X
XX
XXX
XX
XXX X
X XXXX
XX
XXX
XXX
X
XX
X
XXXXX
XXX 5 5
X 555
X 55
J. Campos - C.P.S.
Atravesar un laberinto
v
Estructura de datos:
tipos
tipos
casilla
casilla == (libre,pared,camino,imposible)
(libre,pared,camino,imposible)
laberinto
=
laberinto = vector[1..n,1..n]
vector[1..n,1..n] de
de casilla
casilla
Atravesar un laberinto
...
...
lab[x,y]:=camino;
lab[x,y]:=camino;
si
si (x=n)
(x=n)(y=n)
(y=n)
entonces
entonces {se
{se ha
ha encontrado
encontrado una
una soluc.}
soluc.}
encontrado:=verdad
encontrado:=verdad
sino
sino
ensayar(x+1,y,lab,encontrado);
ensayar(x+1,y,lab,encontrado);
si
si not
not encontrado
encontrado
entonces
entonces
ensayar(x,y+1,lab,encontrado)
ensayar(x,y+1,lab,encontrado)
fsi;
fsi;
si
si not
not encontrado
encontrado
entonces
entonces
ensayar(x-1,y,lab,encontrado)
ensayar(x-1,y,lab,encontrado)
fsi;
fsi;
si
si not
not encontrado
encontrado
entonces
entonces
ensayar(x,y-1,lab,encontrado)
ensayar(x,y-1,lab,encontrado)
fsi;
fsi;
si
si not
not encontrado
encontrado
entonces
entonces
lab[x,y]:=imposible
lab[x,y]:=imposible
fsi
fsi
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.
Problema:
Se trata de encontrar una sucesin de
movimientos legales de un caballo de ajedrez
de forma que ste pueda visitar todos y cada uno
de los escaques (cuadros) de un tablero sin
repetir ninguno.
1 2 3 4 5 6 7 8
1
2
3
4
5
6
7
8
J. Campos - C.P.S.
1
3
variables
variables dx,dy:vector[1..8]
dx,dy:vector[1..8] de
de entero
entero
...
...
dx:=[2,1,-1,-2,-2,-1,1,2]
dx:=[2,1,-1,-2,-2,-1,1,2]
dy:=[1,2,2,1,-1,-2,-2,-1]
dy:=[1,2,2,1,-1,-2,-2,-1]
Estructura de datos: matriz de naturales
u inicialmente: todos cero
u al terminar: cada componente guarda el
nmero de orden en que se visit el escaque
correspondiente
variable
variable
tab:vector[1..n,1..n]
tab:vector[1..n,1..n] de
de entero
entero
J. Campos - C.P.S.
variables
variables k,u,v:entero
k,u,v:entero
principio
principio
k:=0;
k:=0;
repetir
repetir {se
{se ensaya
ensaya con
con los
los 88 mov.
mov. posibles}
posibles}
k:=k+1;
k:=k+1; xito:=falso;
xito:=falso;
u:=x+dx[k];
u:=x+dx[k]; v:=y+dy[k];
v:=y+dy[k];
si
si (1
(1u)
u)(u
(un)
n)(1
(1v)
v)(v
(vn)
n) entonces
entonces
si
si tab[u,v]=0
tab[u,v]=0 entonces
entonces
tab[u,v]:=i;
tab[u,v]:=i;
si
si i<n*n
i<n*n
entonces
entonces
ensaya(i+1,u,v,xito);
ensaya(i+1,u,v,xito);
si
si not
not xito
xito
entonces
entonces tab[u,v]:=0
tab[u,v]:=0
fsi
fsi
sino
sino xito:=verdad
xito:=verdad
fsi
fsi
fsi
fsi
fsi
fsi
hastaQue
hastaQue xito
xito or
or (k=8)
(k=8)
fin
fin
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
Resultado de la ejecucin:
Introduce i inicial: 1
Introduce j inicial: 1
1
60
39
34
31
38
35
32
61
10
59
2
37
40
33
36
49
42
27
62
43
58
3
50
41
48
51
46
55
26
57
44
53
4
23
52
47
56
45
54
18
63
28
11
24
21
14
5
9
30
19
16
7
12
25
22
J. Campos - C.P.S.
64
17
8
29
20
15
6
13
J. Campos - C.P.S.
variables
variables k,u,v,num:entero
k,u,v,num:entero
principio
principio
num:=0;
num:=0;
para
para k:=1
k:=1 hasta
hasta 88 hacer
hacer
u:=x+dx[k];
u:=x+dx[k];
v:=y+dy[k];
v:=y+dy[k];
si
si (1
(1u)
u)(u
(un)
n)(1
(1v)
v)(v
(vn)
n)
entonces
entonces
si
si tab[u,v]=0
tab[u,v]=0
entonces
entonces num:=num+1
num:=num+1
fsi
fsi
fsi
fsi
fpara
fpara
devuelve
devuelve num
num
fin
fin
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
Resultado de la ejecucin:
Introduce x inicial: 1
Introduce y inicial: 1
1
34
3
18
49
4
19
56
33
14
57
2
35
48
55
20
5
60
53
36
41
58
37
46
61
6
21
42
59
38
43
40
23
8
45
22
7
44
39
24
32
17
52
47
54
27
62
9
13
50
15
30
11
64
25
28
J. Campos - C.P.S.
16
31
12
51
26
29
10
63
J. Campos - C.P.S.
Solucin:
Mejorar el algoritmo de bsquedad con retroceso
cambiando el orden de ensayo de las casillas
accesibles desde una dada.
En lugar de ensayar de forma consecutiva en el
sentido de las agujas del reloj,
u se ensayar en primer lugar la casilla desde
la que se pueda acceder al menor nmero de
casillas no visitadas;
u si desde esa casilla no se llega a una
solucin, se intentar con la casilla con
siguiente menor nmero de casillas
accesibles no visitadas; etc.
Para poder implementar el retroceso:
u cada vez que se llegue a una casilla se
almacenan los movimientos posibles en una
cola de movimientos con prioridades,
donde la prioridad de un movimiento es el
nmero de casillas accesibles no visitadas
tras realizar ese movimiento
J. Campos - C.P.S.
funcin
funcin menor(m1,m2:mov)
menor(m1,m2:mov) dev
dev booleano
booleano
principio
principio
devuelve
devuelve m1.peso<m2.peso
m1.peso<m2.peso
fin
fin
tipo
tipo cmp
cmp {tipo
{tipo opaco:
opaco: cola
cola de
de mov.
mov. con
con
prioridades;
prioridades; un
un mov.
mov. m1
m1 tiene
tiene
prioridad
sobre
otro
m2
si
prioridad sobre otro m2 si
menor(m1,m2)=verdad}
menor(m1,m2)=verdad}
algoritmo
algoritmo creaVaca(sal
creaVaca(sal c:cmp)
c:cmp)
algoritmo
algoritmo aadir(e/s
aadir(e/s c:cmp;
c:cmp; ent
ent m:mov)
m:mov)
funcin
funcin min(c:cmp)
min(c:cmp) devuelve
devuelve mov
mov
algoritmo
algoritmo eliminarMin(e/s
eliminarMin(e/s c:cmp)
c:cmp)
funcin
funcin esVaca(c:cmp)
esVaca(c:cmp) dev
dev booleano
booleano
implementacin
implementacin ...
...
fin
fin
J. Campos - C.P.S.
variables
variables k,u,v:entero;
k,u,v:entero;
m:mov;
m:mov; cola:cmp
cola:cmp
principio
principio
{se
{se almacenan
almacenan los
los movimientos
movimientos posibles}
posibles}
creaVaca(cola);
creaVaca(cola);
para
para k:=1
k:=1 hasta
hasta 88 hacer
hacer
u:=x+dx[k];
u:=x+dx[k]; v:=y+dy[k];
v:=y+dy[k];
si
si (1
(1u)
u)(u
(un)
n)(1
(1v)
v)(v
(vn)
n) entonces
entonces
si
si tab[u,v]=0
tab[u,v]=0 entonces
entonces
m.valor:=k;
m.valor:=k; m.peso:=accesibles(u,v);
m.peso:=accesibles(u,v);
aadir(cola,m)
aadir(cola,m)
fsi
fsi
fsi
fsi
fpara;
fpara;
...
...
J. Campos - C.P.S.
xito:=falso;
xito:=falso;
mq
mq not
not esVaca(cola)
esVaca(cola) and
and not
not xito
xito hacer
hacer
m:=min(cola);
m:=min(cola); eliminarMin(cola);
eliminarMin(cola);
k:=m.valor;
k:=m.valor;
u:=x+dx[k];
u:=x+dx[k]; v:=y+dy[k];
v:=y+dy[k];
tab[u,v]:=i;
tab[u,v]:=i;
si
si i<n*n
i<n*n
entonces
entonces
ensaya(i+1,u,v,xito);
ensaya(i+1,u,v,xito);
si
si not
not xito
xito
entonces
entonces tab[u,v]:=0
tab[u,v]:=0
fsi
fsi
sino
sino xito:=verdad
xito:=verdad
fsi
fsi
fmq
fmq
fin
fin
J. Campos - C.P.S.
Introduce i inicial: 1
Introduce j inicial: 3
23
6
1
16
21
12
17
22
7
2
5
24
11
20
15
10
13
18
3
8
25
4
9
14
19
J. Campos - C.P.S.
Recordar
Se tienen n objetos y una mochila.
El objeto i tiene peso pi y la inclusin del objeto i
en la mochila produce un beneficio bi.
El objetivo es llenar la mochila, de capacidad C,
de manera que se maximice el beneficio.
maximizar
bixi
1i n
sujeto a
pixi C
1i n
J. Campos - C.P.S.
Espacio de soluciones:
2n modos de asignar los valores 0 1 a las xi.
Dos formas de representar la solucin: tuplas de
tamao fijo o variable.
Tuplas de tamao variable:
xi=objeto introducido en i-simo lugar
1
x1 =1
x1 =2
10
x2 =2
x2 =3 x =4
2
3
x3 =3
4
x3 =4 x3 =4
6
x1 =4
x1 =3
x2 =3 x2 =4
9
11 13
14
16
x2 =4
15
x3 =4
12
x4 =4
5
J. Campos - C.P.S.
x1 =0
x1 =1
17
x2 =0
x2 =1
x2 =0
10
x3 =0
x3 =1
x3 =0
18
x3 =1
11
12
14
13
15
25
x3 =0
x3 =1
19
x4 =1
x4 =1
x4 =1
x4 =1
x4 =0
x4 =0
x4 =0
x4 =0
x4 =0
5
x2 =1
16
20
x3 =0
22
x4 =1
x4 =0
21
23
26
x4 =1
x4 =0
24
27
29
x4 =1
x4 =0
28
J. Campos - C.P.S.
x3 =1
30
x4 =1
31
J. Campos - C.P.S.
funcin
funcin cota(benef,peso:vectReal;
cota(benef,peso:vectReal;
cap,ben:real;
cap,ben:real; obj:entero)
obj:entero)
devuelve
devuelve real
real
{cap=capacidad
{cap=capacidad an
an libre
libre de
de la
la mochila;
mochila;
ben=beneficio
ben=beneficio actual;
actual;
obj=ndice
obj=ndice del
del primer
primer objeto
objeto aa considerar}
considerar}
principio
principio
si
si obj>n
obj>n or
or cap=0.0
cap=0.0
entonces
entonces devuelve
devuelve ben
ben
sino
sino
si
si peso[obj]>cap
peso[obj]>cap
entonces
entonces
dev
dev ben+cap/peso[obj]*benef[obj]
ben+cap/peso[obj]*benef[obj]
sino
sino
dev
dev cota(benef,peso,cap-peso[obj],
cota(benef,peso,cap-peso[obj],
ben+benef[obj],obj+1)
ben+benef[obj],obj+1)
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.
algoritmo
algoritmo bsqueda(ent
bsqueda(ent solAct:solucin;
solAct:solucin;
ent
ent benAct,pesAct:real;
benAct,pesAct:real;
ent
ent obj:entero;
obj:entero;
e/s
sol:solucin;
e/s sol:solucin;
e/s
e/s ben:real)
ben:real)
variable
variable decisin:0..1
decisin:0..1
principio
principio
para
para decisin:=0
decisin:=0 hasta
hasta 11 hacer
hacer
solAct[obj]:=decisin;
solAct[obj]:=decisin;
benAct:=benAct+decisin*benef[obj];
benAct:=benAct+decisin*benef[obj];
pesAct:=pesAct+decisin*peso[obj];
pesAct:=pesAct+decisin*peso[obj];
si
si pesAct
pesActcap
cap and
and ben<cota(benef,peso,
ben<cota(benef,peso,
cap-pesAct,benAct,obj+1)
cap-pesAct,benAct,obj+1) entonces
entonces
si
obj=n
si obj=n
entonces
entonces si
si benAct>ben
benAct>ben entonces
entonces
sol:=solAct;
sol:=solAct; ben:=benAct
ben:=benAct
fsi
fsi
sino
sino bsqueda(solAct,benAct,pesAct,
bsqueda(solAct,benAct,pesAct,
obj+1,sol,ben)
obj+1,sol,ben)
fsi
fsi
fsi
fsi
fpara
fpara
fin
fin
J. Campos - C.P.S.
J. Campos - C.P.S.
Ejemplo:
benef=(11,21,31,33,43,53,55,65)
peso=(1,11,21,23,33,43,45,55)
cap=110
n=8
164.88
1
1
11
1
12
32
1
33
63
1
56
96
89 162.44
139
1
0
66
106
164.66
99
149
0
162
101
151
0
139
149
J. Campos - C.P.S.
151
159.79
0
154.88
0
68
108
0
0 157.55
1161.63 0
163.81
0
35
65
109
159
159.76
155.11
157.44
160.22
157.11
159.33
158
157.63
160.18
159
ben=159
sol=(1,1,1,0,1,1,0,0)
J. Campos - C.P.S.
J. Campos - C.P.S.
sujeto a
pixi C
(*)
1i n
con 0 xi 1, 1 i n
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
v
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
v
Veamos un ejemplo:
D={1,2,2,2,3,3,3,4,5,5,5,6,7,8,10}
Como |D|=m=n(n-1)/2, n=6.
Se fija x1=0 (por ejemplo).
Claramente, x6=10, porque 10 es el mximo de D.
x1=0
x6=10
D={1,2,2,2,3,3,3,4,5,5,5,6,7,8}
x5=8
D={1,2,2,3,3,3,4,5,5,5,6,7}
J. Campos - C.P.S.
x6=10
Reconstruccin de puntos a
partir de las distancias
El siguiente valor ms grande de D es 7 luego,
x4=7 o x2=3.
u Si x4=7, las distancias x6-7=3 y x5-7=1
tambin deben estar en D. Lo estn.
x1=0
x4=7 x5=8
x6=10
D={2,2,3,3,4,5,5,5,6}
La distancia mayor es ahora 6, as que x3=6 o
x2=4.
Pero si x3=6, entonces x4-x3=1, lo cual es
imposible porque 1 ya no est en D.
Y si x2=4, entonces x2-x1=4 y x5-x2=4, lo cual
tambin es imposible porque 4 slo aparece
una vez en D.
Retroceso...
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
u
x1=0
x2=3
x5=8
x6=10
D={1,2,2,3,3,4,5,5,6}
Ahora hay que escoger entre x4=6 o x3=4.
x3=4 es imposible porque D slo tiene una
ocurrencia de 4 y haran falta dos.
x4=6 s es posible.
x1=0
x2=3
x4=6
x5=8
x6=10
D={1,2,3,5,5}
La nica eleccin que queda es x3=5:
x1=0
x2=3
x3=5 x4=6
x5=8
D={}
Y se ha llegado a una solucin.
J. Campos - C.P.S.
x6=10
Reconstruccin de puntos a
partir de las distancias
El rbol asociado al proceso anterior es:
x1=0,x6=10
x5=8
x4=7**
x3=6*
x2=4*
x2=3
x3=4*
x4=6
x3=5
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
tipos
tipos saco
saco == multiconjunto
multiconjunto de
de entero;
entero;
sol
sol == vector[1..n]
vector[1..n] de
de entero
entero
algoritmo
algoritmo reconstruir(ent
reconstruir(ent D:saco;
D:saco;
sal
x:sol;
sal x:sol;
sal
sal xito:booleano)
xito:booleano)
{Pre:
{Pre: |D|=n(n-1)/2}
|D|=n(n-1)/2}
principio
principio
xito:=falso;
xito:=falso;
x[1]:=0;
x[1]:=0;
x[n]:=mximo(D);
x[n]:=mximo(D);
eliminarMx(D);
eliminarMx(D);
x[n-1]:=mximo(D);
x[n-1]:=mximo(D);
eliminarMx(D);
eliminarMx(D);
si
si x[n]-x[n-1]
x[n]-x[n-1]DD
entonces
entonces
eliminar(x[n]-x[n-1],D);
eliminar(x[n]-x[n-1],D);
colocar(x,D,2,n-2,xito)
colocar(x,D,2,n-2,xito)
sino
sino
xito:=falso
xito:=falso
fsi
fsi
fin
fin
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
algoritmo
algoritmo colocar(e/s
colocar(e/s x:sol;
x:sol; e/s
e/s D:saco;
D:saco;
ent
ent iz,de:entero;
iz,de:entero;
sal
sal xito:booleano)
xito:booleano)
{Algoritmo
{Algoritmo de
de bsqueda
bsqueda con
con retroceso
retroceso para
para colocar
colocar
los
puntos
x[iz]..x[de].
los puntos x[iz]..x[de].
x[1]..x[iz-1]
x[1]..x[iz-1] yy x[de+1]..x[n]
x[de+1]..x[n] ya
ya se
se han
han colocado
colocado
provisionalmente.}
provisionalmente.}
variable
variable maxD:entero
maxD:entero
principio
principio
si
si D=
D= entonces
entonces xito:=verdad
xito:=verdad
sino
sino
maxD:=mximo(D);
maxD:=mximo(D);
{comprueba
{comprueba si
si es
es factible
factible x[de]=maxD}
x[de]=maxD}
si
si |x[j]-maxD|
|x[j]-maxD|D,
D, 11j<iz,
j<iz, de<j
de<jnn entonces
entonces
x[de]:=maxD;
x[de]:=maxD; {intenta
{intenta x[de]=maxD}
x[de]=maxD}
para
para 11j<iz,de<j
j<iz,de<jnn hacer
hacer
eliminar(|x[j]-maxD|,D)
eliminar(|x[j]-maxD|,D)
fpara;
fpara;
colocar(x,D,iz,de-1,xito);
colocar(x,D,iz,de-1,xito);
si
si not
not xito
xito entonces
entonces {retroceso}
{retroceso}
para
para 11j<iz,de<j
j<iz,de<jnn hacer
hacer
{deshace
{deshace la
la eliminacin}
eliminacin}
insertar(|x[j]-maxD|,D)
insertar(|x[j]-maxD|,D)
fpara
fpara
fsi
fsi
fsi;
fsi;
...
...
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
...
...
{Si
{Si fall
fall el
el primer
primer intento,
intento, se
se intenta
intenta ver
ver si
si
x[iz]=x[n]-maxD}
x[iz]=x[n]-maxD}
si
si not
not xito
xito and
and |x[n]-maxD-x[j]|
|x[n]-maxD-x[j]|D,
D,
11j<iz,
j<iz, de<j
de<jnn entonces
entonces
x[iz]:=x[n]-maxD;
x[iz]:=x[n]-maxD;
para
para 11j<iz,de<j
j<iz,de<jnn hacer
hacer
eliminar(|x[n]-maxD-x[j]|,D)
eliminar(|x[n]-maxD-x[j]|,D)
fpara;
fpara;
colocar(x,D,iz+1,de,xito);
colocar(x,D,iz+1,de,xito);
si
si not
not xito
xito entonces
entonces {retroceso}
{retroceso}
para
para 11j<iz,de<j
j<iz,de<jnn hacer
hacer
{deshace
{deshace la
la eliminacin}
eliminacin}
insertar(|x[n]-maxD-x[j]|,D)
insertar(|x[n]-maxD-x[j]|,D)
fpara
fpara
fsi
fsi
fsi
fsi
fsi
fsi
fin
fin
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
v
Anlisis de la eficiencia:
Caso fcil: No se realiza ningn retroceso.
u
J. Campos - C.P.S.
Reconstruccin de puntos a
partir de las distancias
En general, ocurren retrocesos, y:
u
Sin embargo:
u
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
configuracin ganadora,
configuracin perdedora y
configuracin empatadora o nula.
Interpretacin:
Situacin (o posibilidades) que tiene el jugador
(tomamos partido por uno de ellos) en esa configuracin, suponiendo que ninguno de los dos
jugadores se equivocar y ambos realizarn en lo
sucesivo la mejor jugada posible.
La funcin de utilidad puede asignarse de forma
sistemtica.
J. Campos - C.P.S.
funcin de
utilidad empatadora
nivel 0
mueve yo
yo
yol
l
l
funcin de
utilidad ganadora
yo
nivel 6
mueve yo
yo yo yo
yo l
nivel 7
mueve l
yo
yo
yo yol
funcin de
utilidad perdedora
yo
-1
yo
yo l
l yo l
GANA yo
nivel 8
mueve yo
yo l yo
yo yo l
l
yo
yo
yo yo l
l l l
-1
yo l yo
yo l
l yo l
yo
yo
l yo l
l yo l
GANA l
nivel 9
J. Campos - C.P.S.
yo l yo
yo yo l
yo l yo
yo yo l
yo yo yo
l yo l
l yo l
l yo l
l yo l
EMPATE
EMPATE
GANA yo
Clculo de la utilidad:
Se da valor, en primer lugar, a las hojas:
u la utilidad en una hoja vale 1, 0 -1 si la
configuracin del juego corresponde a una
victoria, empate o derrota, respectivamente,
del jugador por el que hemos tomado
partido (yo).
Los valores de la funcin de utilidad se
propagan hacia arriba del rbol de acuerdo a la
siguiente regla (estrategia minimax):
u si un nodo corresponde a una configuracin
del juego en la que juega yo (nivel 0
par), se supone que ese jugador har la
mejor jugada de entre las posibles y, por
tanto, el valor de la funcin de utilidad en la
configuracin actual coincide con el valor de
esa funcin en la configuracin de la mejor
jugada posible (para yo) que se puede
realizar desde la actual (nodo max);
u si un nodo corresponde a una configuracin
del juego en la que juega l (nivel impar
del rbol), se supone que ese jugador har la
mejor jugada de entre las posibles y, por
tanto, el valor de la funcin de utilidad en la
configuracin actual coincide con el valor de
esa funcin en la configuracin de la peor
jugada posible (para yo) (nodo min).
J. Campos - C.P.S.
J. Campos - C.P.S.
J. Campos - C.P.S.
Implementacin () detallada:
representacin de una configuracin del juego
(definicin del tipo de dato configuracin)
enumeracin de las configuraciones accesibles
desde una dada mediante la ejecucin de una
jugada, y
clculo de la funcin de utilidad para una
configuracin dada, sabiendo quin juega en ese
momento
J. Campos - C.P.S.
variables
variables maxUtilidad,laUtilidad:entero;
maxUtilidad,laUtilidad:entero;
i:1..maxEntero;
i:1..maxEntero;
mejorJugada,unaJugada:config
mejorJugada,unaJugada:config
principio
principio
i:=1;
i:=1;
{clculo
{clculo de
de la
la 1
1 config.
config. accesible
accesible desde
desde c}
c}
jugada(c,i,unaJugada);
jugada(c,i,unaJugada);
mejorJugada:=unaJugada;
mejorJugada:=unaJugada;
maxUtilidad:=utilidad(mejorJugada,falso);
maxUtilidad:=utilidad(mejorJugada,falso);
{"falso"
{"falso" indica
indica que
que cuando
cuando la
la configuracin
configuracin
sea
sea "mejorJugada",
"mejorJugada", no
no juego
juego yo}
yo}
mq
mq not
not esLaUltimaJugada(c,i)
esLaUltimaJugada(c,i) hacer
hacer
i:=i+1;
i:=i+1;
jugada(c,i,unaJugada);
jugada(c,i,unaJugada);
laUtilidad:=utilidad(unaJugada,falso);
laUtilidad:=utilidad(unaJugada,falso);
si
si laUtilidad>maxUtilidad
laUtilidad>maxUtilidad entonces
entonces
mejorJugada:=unaJugada;
mejorJugada:=unaJugada;
maxUtilidad:=laUtilidad
maxUtilidad:=laUtilidad
fsi
fsi
fmq;
fmq;
comunicaAlUsuario(mejorJugada);
comunicaAlUsuario(mejorJugada);
c:=mejorJugada
c:=mejorJugada
fin
fin
J. Campos - C.P.S.
...
...
algoritmo
algoritmo esLaltimaJug(ent
esLaltimaJug(ent c:config;
c:config;
ent
ent i:0..maxEntero)
i:0..maxEntero)
devuelve
devuelve booleano
booleano
{Devuelve
{Devuelve verdad
verdad si
si yy slo
slo si
si cc admite
admite
exactamente
i
jugadas
diferentes.}
exactamente i jugadas diferentes.}
...
...
algoritmo
algoritmo comunicaAlUsuario(ent
comunicaAlUsuario(ent c:config)
c:config)
{Muestra
{Muestra en
en pantalla
pantalla la
la configuracin
configuracin c.}
c.}
...
...
algoritmo
algoritmo utilidadFinal(ent
utilidadFinal(ent c:config)
c:config)
devuelve
devuelve entero
entero
{Pre:
{Pre: cc es
es una
una configuracin
configuracin final
final del
del juego.}
juego.}
{Post:
{Post: devuelve
devuelve la
la utilidad
utilidad de
de c.}
c.}
...
...
J. Campos - C.P.S.
variables
variables laUtilidad:entero;
laUtilidad:entero;
i:1..maxEntero;
i:1..maxEntero;
unaJugada:config
unaJugada:config
principio
principio
si
si esLaUltimaJug(c,0)
esLaUltimaJug(c,0)
entonces
entonces
devuelve
devuelve utilidadFinal(c)
utilidadFinal(c)
sino
sino
i:=1;
i:=1;
jugada(c,i,unaJugada);
jugada(c,i,unaJugada);
laUtilidad:=
laUtilidad:=
utilidad(unaJugada,not
utilidad(unaJugada,not juegoYo);
juegoYo);
...
...
J. Campos - C.P.S.
J. Campos - C.P.S.
El ms conocido es el mtodo de
poda
J. Campos - C.P.S.
Poda :
nodo max
nodo min
=20
c2 =15
c1 20
c3
15
J. Campos - C.P.S.
Poda :
nodo min
nodo max
=44
c2 =68
c1 44
c3
68
J. Campos - C.P.S.
Resultados prcticos:
La poda restringe la bsqueda a O( n )
nodos (si el nmero original es n).
Este ahorro es muy grande y supone que las
bsquedas que usan la poda pueden ir al
doble de la profundidad en comparacin con un
rbol no podado.
En el ejemplo del tic-tac-toe, el nmero inicial de
97162 nodos se reduce a 4493.
J. Campos - C.P.S.