Professional Documents
Culture Documents
Estados finales: q
s,
q
n
Programa
I nstrucciones
(q
0
, A
,
, q
2
, A , + 1) (q
1
, A
,
, q
n
, * , *) (q
2
, A
,
, q
s
, * , *)
(q
0
, B
,
, q
0
, B , - 1) (q
1
, B
,
, q
1
, B , + 1) (q
2
, B
,
, q
2
, B , + 1)
(q
0
, 0 , q
0
, 0 , - 1) (q
1
, 0
,
, q
1
, 0 , + 1) (q
2
, 0, q
2
, 0 , + 1)
(q
0
, 1
, q
1
, 2 , + 1) (q
1
, 1
, q
0
, 0 , - 1) (q
2
, 1
, q
0
, 1 , -1)
(q
0
, 2, q
0
, 2 , -1) (q
1
, 2
, q
1
, 2 , + 1) (q
2
, 2, q
2
, 1 , + 1)
Cmo funciona esto?.
Usar esta mquina para decidir si 5 es divisible por 3.
Cmo se calcula la complejidad de un algoritmo
representado por una mquina de Turing?.
Formalmente un algoritmo es un objeto asociado a una mquina de
Turing que resuelve un determinado problema. La complejidad del
mismo debera ser calculada en funcin del mismo.
En la prctica sin embargo usaremos una nocin un poco menos formal
de algoritmo y tambin para determinar la complejidad de un algoritmo,
que se parece ms al modelo RAM.
Desde el punto de vista prctico ambos enfoques han mostrado ser
equivalentes.
Determinaremos la complejidad contando la cantidad de operaciones
bsicas de alto nivel que realiza el algoritmo, en funcin del tamao
del problema.
Es correcto esto?. Puede ser peligroso?
Cundo decimos que un algoritmo es bueno?
Armemos esta tabla..... supongamos que tenemos algoritmos con las
siguientes complejidades y los corremos en la misma mquina
(los tiempos estn dados en segundos )
10 20 30 40 50 60
n 0.00001 0.00002 0.00003 0.00004 0.00005 0.00006
n
2
n
3
n
5
2
n
3
n
La tabla queda as..
(los tiempos estn dados en segundos salvo cuando dice otra cosa)
10 20 30 40 50 60
n 0.00001 0.00002 0.00003 0.00004 0.00005 0.00006
n
2
0.0001 0.0004 0.0009 0.0016 90.0025 0.0036
n
3
0.001 0.008 0.027 0.064 0.125 0.216
n
5
0.1 3.2 24.3 1.7 min 5.2 min 13.0
2
n
0.001 1.0 17.9min 12.7das 35.6 aos 366 siglos
3
n
0.59 58 min 6.5aos 3855siglos 2 E+8 siglos 1.3 E+13 siglos
Los datos de la tabla anterior corresponden a una mquina MUY vieja
(son datos del libro de Garey y Johnson de 1979).
Qu pasa si tenemos una mquina 1000 veces ms rpida?. Un milln de
veces ms rpida?.
Cul sera el tamao del problema que podemos resolver en una hora
comparado con el problema que podemos resolver ahora?.
actual computadora 1000 veces mas rpida
n N
1
1000 N
1
n
2
N
2
31.6 N
2
n
3
N
3
10 N
3
n
5
N
4
3.98 N
4
2
n
N
5
N
5
+ 9.97
3
n
N
6
N
6
+ 6.29
Qu pasara si tuviramos una computadora 1 milln de veces ms
rpida?
Cundo diremos entonces que un algoritmo es bueno?.
Cundo un algoritmo es suficientemente eficiente para ser
usado en la prctica?
=============================
POLINOMIAL = bueno
EXPONENCIAL = malo
=============================
Qu pasa si tengo complejidades como las
siguientes?:
n
80
1.001
n
esto no ocurre en la prctica
Puede ocurrir que un algoritmo sea malo en el peor caso y
bueno en la prctica?.
Hay muy pocos casos.
Ejemplo clsico:
mtodo simplex para problemas de programacin lineal.
En el peor caso es exponencial pero en la prctica el tiempo de ejecucin
es generalmente O(m
3
) donde m es el nmero de ecuaciones del
problema de programacin lineal (es un mtodo MUY usado en la
industria y los servicios para resolver problemas de
optimizacindesde hace 60 aos)
Cundo decimos que un problema est
computacionalmente bien resuelto?
Cundo hay un algoritmo polinomial para resolverlo.
Como veremos ms adelante hay problemas para los cuales no
sabemos si existe o no un algoritmo polinomial para
resolverlos. Saber si una gran familia de estos problemas
tiene solucin polinomial o no es el problema abierto ms
importante de teora de la computacin.......
continuar en el ltimo captulo del curso.......
Repasando notaciones
Dadas dos funciones f y g : N
+
R decimos que:
f(n) = O (g(n)) si - c> 0 y n
0
eN tal que f(n) s c g(n)
n > n
0
.
f(n) = O (g(n)) si - c> 0 y n
0
eN tal que f(n) > c g(n)
n > n
0
.
f(n) = O (g(n)) si - c,c> 0 y n
0
eN tal que
c g(n) s f(n) s c g(n) n > n
0
Si f(n) = O (g(n)) se dice que f es de orden g(n).
Complejidad de algunos algoritmos conocidos
Busqueda secuencial: O(n)
Busqueda binaria: O(log(n))
Bubblesort: O(n
2
)
Quicksort: O(n
2
) en el peor caso
Heapsort: O(n log(n))
Clculo de determinantes
Sea una matriz M = (a
ij
) y sea M
ij
la submatriz de M que se
obtiene sacando de M la fila i y la columna j.
Frmula recursiva para calcular el determinante:
(desarrollo por la primera fila)
det (M) =
j
(- 1)
j+1
a
ij
det (M
1j
)
Complejidad de este mtodo?.
Se puede calcular usando la frmula recursiva que se deduce de
la versin recursiva que dimos del algoritmo:
t(n) = n t(n - 1) + O (n)
Complejidad O(n!)
Hay mtodos ms eficientes de calcular el determinante de una
matriz?.
SI (triangular la matriz por el mtodo de Gauss y calcular el producto de
la diagonal)
Est este problema bien resuelto computacionalmente?.
Lmite inferior para la complejidad de un
algoritmo
Cundo se puede obtener?
Importancia
EJEMPLO: algoritmos de ordenamiento basados en
comparaciones. Se pueden modelar por un rbol binario
de decisin. Los estados finales del algoritmos estn
representados en las hojas.
Entonces nro de hojas > n! Como el rbol es binario, nro de
hojas s 2
h
(h altural del rbol) y 2
h
> n! . Entonces
h > log
2
(n!) = log
2
(n (n-1)....2. 1) > log
2
(n (n-1)....n/2() >
log
2
n /2
(n/2)
=
= n/2 (log
2
n - 1) ) = O (n log
2
n )
Conclusin: HEAPSORT es ptimo dentro de este tipo de
algoritmos.
Tcnicas de diseo de algoritmos
Dividir y conquistar
Recursividad
Algoritmos golosos
Programacin dinmica
Backtracking
Algoritmos Probabilsticos
El algoritmo se puede mejorar un poco, cambiando
la forma de verificar cuando un conjunto de
tareas es factible (ver libro de Brassard y
Bratley).
Dividir y conquistar
Si la instancia I es pequea, entonces utilizar un
algoritmo ad-hoc para resolver el problema.
En caso contrario:
i) Dividir I en sub-instancias I1; I2; : : : ; Ik
ms pequeas.
ii) Resolver recursivamente las k sub- instancias.
iii) Combinar las soluciones para las k
sub-instancias para obtener una solucin
para la instancia original I .
Dividir y conquistar
ESQUEMA GENERAL:
--------------------------------------------------------------------------------
Funcin DQ (x)
Si x es suficientemente chico o simple entonces return
ADHOC(x)
Sino, descomponer x en subinstancias x
1
.x
k .
Para i=1,k hacer y
i
= DQ (x
i
)
Combinar las soluciones y
i
para construir una solucin y
para x
Return y
--------------------------------------------
Recursividad, Caso Base
Ejemplos:
Bsqueda binaria
Merge Sort
Quick Sort
Algoritmo de multiplicacin de Strassen
Cmo calcular la complejidad de estos algoritmos?.
Ecuaciones de recurrencia.
Ejemplo: Mergesort
Algoritmo divide and conquer para ordenar un arreglo A de n
elementos (von Neumann, 1945).
Si n es pequeo, ordenar por cualquier mtodo sencillo.
Si n es grande:
-- A1 := primera mitad de A.
-- A2 := segunda mitad de A.
-- Ordenar recursivamente A1 y A2 por separado.
-- Combinar A1 y A2 para obtener los elementos de
A ordenados.
Este algoritmo contiene todos los elementos tpicos de la
tcnica divide and conquer.
Complejidad de MergeSort
Cmo calcular t(n), complejidad de ordenar un
arreglo de longitud n?
Podemos plantear la siguiente formula recursiva para
la complejidad:
t(n) = 2 t (n/2) + t(n/2() O (n)
entonces
t(n) es O(n log n)
Algoritmo de multiplicacin de Strassen
Cmo calcular el producto de dos matrices de dos por dos
usando menos multiplicaciones que con el mtodo
tradicional.
Dadas dos matrices
A = a
11
a
12
y B = b
11
b
12
a
21
a
22
b
21
b
22
podemos poner
m
1
= (a
21
+ a
22
a
11
) (b
22
- b
12
+ b
11
)
m
2
= a
11
b
11
m
3
= a
12
b
21
m
4
= (a
11
a
21
) (b
22
b
12
)
m
5
= (a
21
+ a
22
) (b
12
b
11
)
m
6
= (a
12
- a
21
+ a
11
a
22
) b
22
m
7
= a
22
( b
11
+ b
22
-
b
12
b
21
)
Entonces el producto AB queda:
m
2
+ m
3
m
1
+ m
2
+ m
5
+ m
6
m
1
+ m
2
+ m
4
m
7
m
1
+ m
2
+ m
4
+ m
5
Este procedimiento requiere 7 multiplicaciones para cacular el producto
de A y B (pero ms sumas que el mtodo tradicional!!).
Si reemplazamos cada elemento de A y B por una matriz de
n x n, las frmulas anteriores nos dan una forma de
multiplicar dos 2n X 2n matrices.
A partir de esto tenemos un mtodo recursivo para calcular el
producto de matrices con n potencia de 2.
Cmo se calcula para n par, la complejidad t(n) de este
algoritmo?.
t(n) = 7 t(n/2) + g(n) con g(n) e O(n
2
)
Se puede demostrar que t(n) e (n
log 7
) y por lo tanto t(n) e
O (n
2.81
). (ejercicio)
Este mtodo se puede generalizar tambin a matrices cuyas
dimensiones no sean de la forma 2 n.
Algoritmos Golosos
Idea: Construir una solucin seleccionando en cada
paso la mejor alternativa, sin considerar las
implicancias de esta seleccin en los pasos futuros ni
en la solucin final.
Se usan principalmente para problemas de
optimizacin.
Componentes:
Lista o conjunto de candidatos
Conjunto de candidatos ya usados
Funcin que verifica si un conjunto de candidatos
da una solucin al problema.
Funcin que verifica si un conjunto de candidatos
es hasta el momento factible.
Funcin de seleccin
Funcin objetivo
---------------------------------------------------------------------------------
Funcin GREEDY (C)
{C es el conjunto de candidatos}
S ------ C
Mientras NOT solucin(S) y C = C hacer
x -------------------- elemento que maximice select (x)
C <-------------------- C \ {x}
Si S U {x} es factible entonces s --------- S U {x}
Si solucin(S) entonces RETURN S
sino RETURN no hay solucin
---------------------------------------------------------------------------------
Qu hacen las funciones solucin(S) y select (x) ?
Minimizar el tiempo de espera en un sistema
Un servidor tiene n clientes para atender. Se sabe que el
tiempo requerido para atender cada cliente i es t
i
.
Se
quiere minimizar
T = E
i
(tiempo que i est en el sistema)
El algoritmo goloso que atiende al cliente que requiere el
menor tiempo de atencin entre los que an estn en la
cola resuelve el problema. (hay que demostrarlo)
Supongamos que I = ( i
1
,i
2
,......i
n
) es una permutacin de los
enteros {1,2....n}. Si los clientes son atendidos en el orden
I entonces
T = t
i1
+ (t
i1
+ t
i2
) + (t
i1
+ t
i2
+ t
i3
)
+ ......
= E
k
(n-k+1) t
ik
Usando esta expresin podemos probar que el algoritmo
goloso es correcto..
Supongamos que en I hay dos enteros a y b con a < b y tal que t
ia
> t
ib
.
O sea el cliente a es atendido antes que el b, a pesar de que el primero
requiere mas tiempo de servicio. Si intercambiamos cambiamos las
posiciones de a y b tenemos un nuevo orden I para el cual
T (I) = (n-a + 1) t
ib
+(n-b+1) t
ia
+ E
k=a,b
(n-k+1) t
ik
Entonces
T(I) T ( I) = (n-a + 1) (t
ia
-
t
ib
) +(n-b+1) (t
ib
- t
ia
)=
= (b-a) (t
ia
-
t
ib
) > 0
Vemos que podemos seguir mejorando el valor de T intercambiando el
orden de los clientes hasta obtener el orden ptimo dado por el
algoritmo goloso.
==================================
Cul es la complejidad de este algoritmo?
Problema de la mochila
Quiero decidir cules son los elementos que tengo que elegir para llevar en la
mochila para maximizar mi beneficio respetando la restriccin de capacidad
de la misma.
Max z =E
j
c
j
x
j
sujeto a que
E
j
a
j
x
j
s b
x
j
e N
+
b : capacidad de la mochila
c
j
: beneficio de llevar una unidad del elemento j
a
j
: peso del elemento j
b, c
j ,
a
j
positivos
En esta primera versin del problema de la mochila vamos a
suponer que podemos llevar a lo sumo un objeto de cada
tipo o partes de los mismos, es decir que consideraremos
que las variables x
j
son reales positivas, o sea queremos
resolver el siguiente problema:
Max E
j
c
j
x
j
sujeto a que
E
j
a
j
x
j
s b
0 s x
j
s 1
Ejemplo:
n = 5, b = 100 y los beneficios y pesos estn dados en la tabla
Posibles ideas para un algoritmo goloso para este problema:
Elegir los objetos en orden decreciente de su beneficio.
Elegir los objetos en orden creciente de su peso..
Sirven estas ideas?. Dan el resultado correcto?
a
j
10 30 20 50 40
c
j
20 66 30 60 40
Que pasa si ordenamos los objetos por su relacin
beneficio/peso? O sea en orden decreciente de los
c
j
/a
j
?.
Lema: Si los objetos se eligen en el orden decreciente de los valores c
j
/a
j
entonces el algoritmo goloso encuentra la solucin ptima al problema
de la mochila con variables continuas.
Dem: supongamos que tenemos los elementos ordenados en orden
decreciente de su relacin c
j
/a
j
. Sea X = (x
1
,x
n
) la solucin
encontrada por el algoritmo goloso. Si todos los x
i
son 1 la solucin es
ptima. Sino sea j el menor ndice tal que sea x
j
< 1.
Es claro que x
i
= 1 para i < j y que x
i
= 0 para i > j y que
a
i
x
i
= b
Sea V(X) = c
i
x
i
el valor
de la solucin dada por el algoritmo goloso.
Sea Y = (y
1
y
n
) otra solucin cualquiera factible. Como
b = a
i
x
i
> a
i
y
i
se puede ver que
( x
i
y
i
) a
i
> 0
Adems para todo ndice i se verifica que
( x
i
y
i
)
c
i
/a
i
> ( x
i
y
i
)
c
j
/a
j
entonces
V (X) V ( Y ) = ( x
i
y
i
)
c
i
= ( x
i
y
i
) a
i
c
i
/a
i
>
> (c
j
/ a
j
) ( x
i
y
i
) a
i
>
0
O sea el valor de la solucin determinada por el algoritmo goloso es mejor
o igual al valor de cualquier otra solucin.
Veamos que ocurre con el problema de la mochila, en el caso de que las
variables x
j
tengan que tomar necesariamente valores enteros (como ocurre en
la prctica, es decir cuando no podemos llevar un pedazo de un objeto).
Algoritmo goloso para el problema de la mochila
con variables enteras nonegativas:
-----------------------------------------------
Ordenar los elementos de forma que
c
j
/ a
j
> c
j+1
/ a
j+1
Para j=1,n y mientras b = 0 hacer
x
j
= b / a
j
b = b
a
j
x
j
z = z + c
j
x
j
Parar
------------------------------------------------
Cuando las variables son enteras este algoritmo
goloso no da siempre la solucin ptima para el
problema de la mochila.
Ejemplo: tenemos una mochila de tamao 10 y 3
objetos, uno de peso 6 y valor 8, y dos de peso 5 y
valor 5.
En el caso de variables enteras el algoritmo goloso
que presentamos puede considerarse como una
heurstica para resolver el problema.
Planificacin de tareas
Hay n tareas que deben ser ejecutadas cada una de las cuales
requiere una unidad de tiempo. En cada momento se puede
ejecutar una sola tarea.
Cada tarea i produce un beneficios g
i
y debe ser ejecutada antes
del tiempo d
i
.
Ejemplo con n = 4
i 1 2 3 4
g
i
50 10 15 30
d
i
2 1 2 1
Algoritmo goloso para este problema
En cada paso elegir para ejecutar la tarea an no realizada que
produce el mayor beneficio, siempre y cuando el conjunto de
tareas resultante sea factible.
Cmo se ve que un conjunto de tareas es factible?.
Cuando hay un ordenamiento de esas tareas que permite
ejecutarlas a todas a tiempo.
Lema: sea J un conjunto de tareas y s = (s
1
, s
2,
, s
k
)
una permutacin de dichas tareas tal que
d
s1
s d
s2
s s d
sk
J es factible si y slo si s tambin lo es.
Dem: : obvio.
Si J es factible existe al menos una sucesin de los trabajos
= (r
1
, r
2
,.r
k
) tal que d
ri
> i, para 1s i s k.
Si fuera s= , sea a el menor ndice tal que s
a
= r
a
y sea b el
ndice tal que r
b
= s
a
.
Claramente b > a y d
ra
> d
sa
=
d
rb.
Entonces el trabajo r
a
podra ser ejecutado ms tarde en el
lugar de r
b
y este ltimo en el lugar de r
a
. Si los cambiamos
en tenemos una sucesin factible que tiene un trabajo
ms en coincidencia con s. Repitiendo este procedimiento
podemos llegar a obtener s y ver entonces que es factible.
Lema: Este algoritmo goloso obtiene la solucin ptima para
este problema de planificacin de tareas.
Dem: Supongamos que el conjunto I elegido por el algoritmo
goloso es distinto de un conjunto J ptimo. Sean S
I
y S
j
dos sucesiones factibles para estos conjuntos.
Hacemos intercambios de modo de obtener dos sucesiones
factibles S
I
y S
j
tal que los trabajos comunes en ambas
secuencias sean ejecutados en el mismo momento (pueden
quedar gaps en alguna de las planificaciones).
O sea si tenemos las secuencias
S
I
p y q x r - - -
S
J
r s t p u v q w
podemos reordenarlas de la siguiente forma
S
I
x y - p r - q -
S
J
u s t p r v q w
(En S
I
y
S
J
se siguen respetando los tiempos de entrega d
i
)
Como hemos supuesto que los conjuntos I y J son distintos,
consideremos ahora un momento en el cual la tarea que est
programada en S
I
es distinta de la programada en S
j
:
Si una tarea a est programada en S
I
y en S
j
hay un gap
(la tarea no pertenece a J) entonces J {a} sera mejor que
J, absurdo porque J es ptimo.
Si alguna tarea b est programada en S
j
y en S
I
hay un
gap entonces I {b} es factible y por lo tanto el
algoritmo goloso tendra que haber includo a b y no lo
hizo.
La ltima posibilidad es que haya una tarea a programada
en S
I
y otra b en S
j
.
Esto implica que a no aparece en J y b
no aparece en I :
- si fuera g
a
> g
b
se podra substituir a por b en J y
mejorar a J (absurdo porque J era ptimo).
- si fuera fuera g
b
> g
a
el algoritmo goloso tendra que
haber elegido a b antes de considerar a.
- entonces g
b
= g
a
Por lo tanto
S
I
y S
j
tienen programadas en cada momento, o
ninguna tarea, la misma tarea o distintas tareas que dan el
mismo beneficio. Y entonces como J era ptimo I tambin
lo es.
Algoritmo goloso para este problema de planificacin de
tareas
(se supone que las tareas estn numeradas de modo que g
1
> g
2
> ..> g
n
)
-------------------------------------------------------------------
Funcin sequence (d[0n])
d[0], j[0] --------- 0
k, j[1] ------1
Para i= 1,n hacer
r <-k
mientras d[j [r]] > max ( d(i),r) hacer r = r-1
si d[j [r]] s d[i] y d[i] > r entonces
para l=k-1, r+1 hacer j[l+1] = j[l]
j[r+1] ---------i
k ---- k+1
Return k, j[1,.k]
------------------------------------------------------------------
Backtracking
Tcnica para recorrer sistemticamente todas las posibles
configuraciones de un espacio. Puede pensarse tambin que es
una tcnica para explorar implcitamente rboles dirigidos (o
grafos dirigidos en general pero sin ciclos).
Habitualmente s utiliza un vector a = (a1; a2; : : : ; ak ) para
representar una solucin candidata, cada a
i
pertenece un
dominio/conjunto ordenado y finito S
i
.
Se extienden las soluciones candidatas agregando un elemento
ms al final del vector a, las nuevas soluciones candidatas son
sucesores de la anterior.
Procedure backtrack (v[1.k])
{v es un vector k-prometedor }
si v es una solucin al problema entonces escribir
v
sino para cada vector k+1-prometedor w tal
que
w[1k] = v[1k] hacer backtrack
(w[1k+1])
=====================================
No necesariamente exploramos todas las ramas del
rbol : poda
Problema de las 8 reinas
Ubicar 8 reinas en el tablero de ajedrez sin que ninguna
amenace a otra.
Cuntas operaciones tenemos que hacer si consideramos todas
las combinaciones del tablero tomadas de a 8 y despus vemos
cuales sirven?
64| = 442616536
8 )
Si mejoramos esto usando la representacin
(i
1
, i
2
,
i
3
,i
4
,
i
5
,i
6
,i
7
,i
8
)
donde
i
j
indica que hay una reina en la
columna j y la fila i
j
y analizamos cuales son factibles o no
.
cuntas operaciones tendremos?.
8
8
= 16777216
(se encuentra una solucin despus de revisar slo 1299 852 posiciones)
Si vemos que dos reinas no pueden estar ni en la misma
fila ni en la misma columna vemos que en realidad
podemos representar el problema mediante las
permutaciones de (1,2,3,4,5,6,7,8). Cuntas operaciones
tenemos en este caso?.
8! = 40320
(implementando este algoritmo podemos ver que hay que
revisar 2830 posiciones hasta encontrar una primera
solucin)
Algoritmo de bactracking
Decimos que un arreglo V de los enteros 1 a 8 es k-
prometedor si ninguna de las reinas ubicadas en las
posiciones (1, v(1)), (2,v(2)), (3,v(3)),..(k,v(k)), 1s k s n
amenaza a las otras.
O sea v es k-prometedor si para todo i=j entre 1 y k, tenemos
que v(i) v(j) e {i-j,0,j-i}.
Un vector 8-prometedor es solucin del problema de las 8
reinas.
Algoritmo de backtracking
------------------------------------------------------------------------------------
Procedimiento Queens (k, try, diag45, diag 135)
{try[1,k] es k-prometedor, col = {try [i], 1s is k}
diag45 = {try [i]-i +1, 1s is k}
diag135 = {try [i] + i - 1, 1s is k}}
Si k = 8
entonces {un vector 8-prometedor es solucin}. Return try
Sino {explorar las k+1-prometedoras extensiones de try}
Para j=1,8
si j e col y j-k e diag45 y j+k e diag135 entonces
try[k+1] --j
{try [1,.k+1] es k+1-prometedor}
Queens (k+1, col U {j}, diag45 U {j}, diag135 U {j+k}
-------------------------------------------------------------------------------------
Se puede ver computacionalmente que este rbol de
bactracking tiene 2057 nodos y que es suficiente explorar
114 para encontrar la primera solucin. (Cmo se hace
para calcular esto?).
Cul es la complejidad de este algoritmo de
bactracking?
Ejercicio: Mostrar un valor de n = 2 para el cual el problema
de las n reinas no tiene solucin.
Otros ejemplos
Encontrar, usando backtracking todas las soluciones enteras de
x
1
+ 2x
2
+ x
3
s 10
1 s x
i
s
4 i =1,2,3
Algoritmos probabilsticos
Cuando un algoritmo tiene que hacer una eleccin a veces es preferible
elegir al azar en vez de gastar mucho tiempo tratando de ver cual es la
mejor eleccin.
Pueden dar soluciones diferentes si se aplican dos veces a la misma
instancia. Los tiempos de ejecucin tambin pueden ser muy diferentes.
Tiempo promedio de un algoritmo determinstico: considera todas las
instancias de un mismo tamao son similares. (ejemplo: quicksort)
Tiempo esperado promedio de un algoritmo probabilstico : es el
tiempo medio de los tiempos de resolver la misma instancia del mismo
problema muchas veces.
Peor tiempo esperado: tomando en cuenta el peor caso de todas las
instancias de un cierto tamao.
Clasificacin de algoritmos probabilisticos
Algoritmos al azar para problemas numricos: la respuesta es
siempre aproximada pero se espera que la solucin sea mejor cuando
ms tiempo hay para ejecutar el algoritmo. (simulacin, integracin
numrica).
Algoritmos de Monte Carlo: se quiere una respuesta exacta. Por
ejemplo problemas de decisin. Un algoritmo Monte Carlo da siempre
una respuesta pero la respuesta puede no ser correcta. La
probabilidad de suceso, es decir de respuesta correcta crece con el
tiempo disponible para correr ese algoritmo. La principal desventaja
es que en general no se puede decidir eficientemente si la respuesta es
correcta o no.(ejemplo: decidir si un arreglo T tiene un elemento
mayoritario, o sea que aparece en T ms de n/2 veces)
Algoritmos Las Vegas: nunca dan una respuesta incorrecta pero
pueden no dar ninguna respuesta. Tambin la probabilidad de
suceso, es decir de tener respuesta correcta crece con el tiempo
disponible para correr ese algoritmo. (ejemplo: en el problema de
las 8 reinas poner las reinas al azar en las filas que an estn
desocupadas, cuidando solamente que la solucin en construccin
sea factible)
Algoritmos Sherwood : en este caso el algoritmo siempre da una
respuesta y la respuesta es siempre correcta. Se usan cuando algn
algoritmo determinstico para resolver un algoritmo es mucho ms
rpido en promedio que en el peor caso. Al incorporar un factor de
azar el algoritmo puede llegar a eliminar la diferencia entre buenas
y malas instancias. (ejemplo: Quicksort)
En todos estos casos suponemos que tenemos disponible un
generador de nmeros al azar de costo computacional
unitario.
O sea dados reales a y b con a < b, uniform (a,b) devuelve un
nmero x elegido al azar en el intervalo a s x < b. La
distribucin de x es uniforme en el intervalo y llamadas
sucesivas del generados dan valores independientes de x.
Para generar enteros al azar uniform (ij) devuelve un
entero k elegido al azar uniformemente en el intervalo
isk sj
Ejemplo de algoritmo tipo MonteCarlo: ver si un arreglo tiene un
elemento mayoritario.
----------------------------------------
Function may(T[1,n])
i = uniform (1,n)
x = T[i]
k = 0
Para j =1,n hacer
if T[j] = x then k = k +1
Return (k > n/2)
------------------------------
Cul es la probabilidad de que este algoritmo de la respuesta correcta?
Ejemplo de algoritmo tipo Las Vegas: el problema de las 8 reinas.
Procedimiento Queens LV (var sol[18], sucess)
array ok[18] (posiciones disponibles)
col, diag45, diag135 : C
Para k = 0,7 hacer
(sol [1k] es k prometedor, hay que ubicar a la reina k+1)
nb = 0
para j = 1, 8 hacer
si j e col y j-k e diag45 y j+k e diag135 entonces (la columna j esta
disponible)
nb = nb +1
ok[nb] = j
si nb = 0 entonces sucess =false
j = ok[uniform (1.nb)]
col = col U {j}
diag45 = diag45 U {j}
diag 135 = diag135 U {j+k}
sol[k+1] = j
return success = true
Pueden encontrar ms ejemplos de aplicacin
de las diferentes tcnicas de diseo de
algoritmos en el libro de Brassard y Bratley
Heursticas
Dado un problema , un algoritmo heurstico es un
algoritmo que intenta obtener soluciones para el problema
que intenta resolver pero no necesariamente lo hace en
todos los casos.
Sea un problema de optimizacin, I una instancia del
problema, x*(I) el valor ptimo de la funcin a optimizar en
dicha instancia. Un algoritmo heurstico obtiene una
solucin con un valor que se espera sea cercano a ese
ptimo pero no necesariamente el ptimo.
Si H es un algoritmo heurstico para un problema de
optimizacin llamamos x
H
(I)
al valor que
devuelve la
heurstica.
Porqu usar algoritmos heursticos?. En que tipo de
problemas?
Las heursticas que son de utilidad prctica son algoritmos
polinomiales.
Cundo decimos que una heurstica es buena?
Cmo hacemos para saber si una heurstica es buena?
Algoritmos aproximados
Decimos que H es un algoritmo - aproximado para el problema si para
algn > 0
x
H
(I)
- x*(I) | | x*(I) |
O equivalentemente un algoritmo es aproximado si existe > 0
tal que para toda instancia I
x
H
(I) / x*(I)
(problema de minimizacin)
Situacin ideal, pero poco frecuente
Cmo evaluamos una heurstica?
Comportamiento medio
Anlisis probabilstico
Comportamiento en peor caso (algoritmos aproximados):
i) razn de perfomance en el peor caso :
r = sup {x
H
(I)
/ x*(I) } r = inf {x
H
(I)
/ x*(I) }
segn estemos minimizando o maximizando.
ii) error relativo
er = | x
H
(I)
- x*(I) | /| x*(I)|
En la prctica no podemos calcular exactamente estos valores
pero si a veces obtener cotas para ellos.
Ejemplo de algoritmo aproximado
Cuando las variables son enteras, el algoritmo goloso que
vimos para el problema de la mochila es un algoritmo
aproximado.
Se puede demostrar que para toda instancia I de dicho
problema se verifica que:
x
H
(I) / x*(I) > (c
1
b/a
1
)/ (c
1
(b /a
1
)) =
= b/a
1
/ (b/a
1
) > 0.5
(es un problema de maximizacin)
Metaheursticas: mtodos generales para
construir heursticas para una gran variedad
de problemas.
Continuar..