PAII-26: algoritmos glotones - Cimat
PAII-26: algoritmos glotones - Cimat
PAII-26: algoritmos glotones - Cimat
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>PAII</strong>-<strong>26</strong>: <strong>algoritmos</strong> <strong>glotones</strong><br />
Dr. J.B. Hayet<br />
CENTRO DE INVESTIGACIÓN EN MATEMÁTICAS<br />
Mayo 2008<br />
,<br />
J.B. Hayet Programación, Mayo 2008 1 / <strong>26</strong>
Outline<br />
1 Unos ejemplos<br />
2 Un intento de caracterización<br />
,<br />
J.B. Hayet Programación, Mayo 2008 2 / <strong>26</strong>
Algoritmos <strong>glotones</strong><br />
a veces programación dinámica puede ser demasiado para un<br />
problema: puede existir manera de resolverla mucho mas sencilla<br />
en particular, puede funcionar (pero puede, solo) lo de no<br />
construir una solución globalmente optima sino construir la<br />
solución por elecciones localmente optimas que llegan a este<br />
optimo global<br />
eso es el propósito de los <strong>algoritmos</strong> <strong>glotones</strong><br />
no siempre posible pero muy poderoso cuando se puede<br />
,<br />
J.B. Hayet Programación, Mayo 2008 3 / <strong>26</strong>
Outline<br />
1 Unos ejemplos<br />
Unos ejemplos<br />
2 Un intento de caracterización<br />
,<br />
J.B. Hayet Programación, Mayo 2008 4 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Consideremos:<br />
N actividades ai que podamos realizar durante un recorrido<br />
turístico<br />
cada actividad empieza en ei y termina en ti<br />
cual es el conjunto máximo de actividades que podemos tomar<br />
de tal manera que los intervalos de tiempo de las actividades<br />
seleccionadas no se traslapan?<br />
Vamos a ver que existe una resolución por programación dinámica<br />
pero que se puede hacer aun mejor con un algoritmo glotón<br />
,<br />
J.B. Hayet Programación, Mayo 2008 5 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Estructura de la solución:<br />
naturalmente la caracterización de los problemas tiene que<br />
incluir las actividades y sus rangos<br />
sean los sub-problemas i, j definidos por buscar actividades que<br />
no se traslapan entre:<br />
Tij = {ak , ti ≤ ek < tk ≤ ej}<br />
o sea “las actividades que se puedan hacer sin problema<br />
después de la i y antes de la j”<br />
poner t0 = 0 y eN+1 = ∞<br />
,<br />
J.B. Hayet Programación, Mayo 2008 6 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Estructura de la solución:<br />
tal cual el rango de i, j sería 0 ≤ i, j ≤ N + 1<br />
pero podemos hacer mejor (y ahorrar espacio memoria):<br />
ordenamos t0 ≤ t1 ≤ · · · ≤ tN<br />
así estamos seguros de qué Tij es vacio para i ≥ j:<br />
Tij = {ak , ti ≤ ek < tk ≤ ej < tj} = ∅<br />
entonces reducimos nuestro espacio de sub-problemas a la<br />
búsqueda de un sub-conjunto máximo en los Tij con<br />
0 ≤ i < j ≤ N + 1<br />
,<br />
J.B. Hayet Programación, Mayo 2008 7 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Estructura de la solución:<br />
dada una solución al sub-problema Tij, supongamos que<br />
elijamos una de las actividades, ak<br />
podemos, con el argumento de siempre, decir que esta solución<br />
esta formada por las soluciones de los problemas sobre Tik y<br />
sobre Tkj a los cuales se añade ak<br />
como problema trivial permitiendo empezar la recursión: Tii = ∅<br />
,<br />
J.B. Hayet Programación, Mayo 2008 8 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Solución recursiva: el número máximo Nij de actividades que se<br />
pueda colocar sin traslape entre ai y aj (un sub-conjunto de Tij) es<br />
dado por:<br />
N[i][j] =<br />
<br />
0 si i = j o si Tij = ∅<br />
max 1 + N[i][k] + N[k][j]<br />
i
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Implementación:<br />
se deduce de la formula recursiva una implementación<br />
bottom-up inmediata basada en arreglos<br />
rellenar el arreglo, otra vez, sub-diagonal por sub-diagonal<br />
complejidad en tiempo: en O(N 3 ), ya que hay que hacer O(N)<br />
comparaciones, adiciones, para cada elemento<br />
complejidad en espacio: O(N 2 )<br />
Se podrá hacer mejor?<br />
,<br />
J.B. Hayet Programación, Mayo 2008 10 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Considerar el problema de Tij, y sea am la actividad de Tij que tenga<br />
el valor tm mínimo, entonces:<br />
1 am pertenece necesariamente al sub-conjunto máximo de<br />
actividades sin traslape dentro de Tij<br />
2 Tim = ∅<br />
La segunda se prueba inmediatamente por contradicción; para la<br />
primera, considerar Sij el sub-conjunto buscado. Sea al la actividad<br />
de tl mínima entre este sub-conjunto: si al = am entonces esta ok,<br />
sino, al = am. Construyendo S ′<br />
ij = Sij\{al} ∪ {am}, llegamos a una<br />
contradicción<br />
,<br />
J.B. Hayet Programación, Mayo 2008 11 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Con esta propiedad tenemos otra manera de ver las cosas:<br />
en programación dinámica, tenemos cada vez dos<br />
sub-problemas y O(N) elecciones que hacer, y tenemos que<br />
adoptar una estrategia bottom-up para hacerlo<br />
usando la propiedad, vemos que hay solo 1 sub-problema cada<br />
vez con solo 1 elección posible que hacer cada vez (elegir la<br />
actividad de tiempo de terminación mas chica entre las de Tij)<br />
mejor, podemos adoptar una estrategia top-down sin problemas<br />
porque la propiedad te da directamente la elección que hacer<br />
desde Tij sin tener que evaluar los Tmj antes<br />
,<br />
J.B. Hayet Programación, Mayo 2008 12 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Estrategia glotona (greedy):<br />
partir de T0(N+1) y elegir am1 la actividad de tm1 mínima entre<br />
todas las de T0(N+1)<br />
seguir con Tm1(N+1) y elegir am2 la actividad de tm1 mínima<br />
entre las de Tm1(N+1)<br />
seguir con Tm2(N+1) y elegir am3 la actividad de tm3 mínima<br />
entre las de Tm2(N+1)<br />
. . .<br />
hasta que Tmk(N+1) = ∅<br />
,<br />
J.B. Hayet Programación, Mayo 2008 13 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Implementación muy simple:<br />
s t d : : v e c t o r e , t , s o l u t i o n ;<br />
. . . // Aqui r e l l e n a m o s l o s v e c t o r e s con l o s d a t o s<br />
i n t N = e . s i z e ( ) ;<br />
i n t m = 0 ; s o l u t i o n . push back (m) ;<br />
f o r ( i n t i =0; i =t . at (m) ) {<br />
m = i ;<br />
s o l u t i o n . push back (m) ;<br />
}<br />
}<br />
,<br />
J.B. Hayet Programación, Mayo 2008 14 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Estrategia glotona (greedy): remarcar que<br />
los sub-problemas que tenemos cada vez son todos de tipo<br />
sobre Tmk(N+1)<br />
las actividades son elegidas en orden creciente de tmi<br />
es glotón en el sentido de que haces una optimización local sin<br />
tener que resolver los sub-problemas que quedan: dejamos cada<br />
vez un tiempo máximo no-organizado (o sea lo máximo de<br />
“libertad” en las elecciones siguientes)<br />
,<br />
J.B. Hayet Programación, Mayo 2008 15 / <strong>26</strong>
Unos ejemplos<br />
Ejemplo: selección de actividades<br />
Complejidad total:<br />
O(N log N) para ordenar las actividades por su ti<br />
θ(N) para construir la solución (cada actividad es examinada<br />
solo una vez)<br />
no costo adicional en memoria<br />
por un lado, es una estructura con que “tenemos suerte”<br />
,<br />
J.B. Hayet Programación, Mayo 2008 16 / <strong>26</strong>
Outline<br />
1 Unos ejemplos<br />
Un intento de caracterización<br />
2 Un intento de caracterización<br />
,<br />
J.B. Hayet Programación, Mayo 2008 17 / <strong>26</strong>
Un intento de caracterización<br />
Esquema de resolución<br />
El esquema que seguimos<br />
Aislar la sub-estructura optima del problema<br />
Deducir una estrategia de resolución recursiva<br />
Mostrar que en cada etapa de decisión, hay una elección que es<br />
elección greedy, que garantiza la optimalidad<br />
Mostrar que esta elección solo deja un sub-problema no trivial<br />
Re-formular la resolución recursiva y hacerla iterativa<br />
,<br />
J.B. Hayet Programación, Mayo 2008 18 / <strong>26</strong>
Un intento de caracterización<br />
Esquema de resolución mas rapido<br />
Lo que hubieramos podido hacer también en este caso es un atajo<br />
pensando ya desde el principio en usar un algoritmo glotón:<br />
reducir el problema óptimo a una elección necesaria mas la<br />
resolución de un sub-problema<br />
mostrar que hay una elección greedy posible y que cuando la<br />
haces, lo que queda es un sub-problema cuya solución,<br />
combinada con la elección greedy da una solución optima al<br />
problema original<br />
pero a priori sería suerte encontrar esa estructura precisa. . . ademas<br />
casi-siempre hay asociada una resolución por programación dinámica<br />
Ej.: partir de sub-problemas Ti = {al/ti ≤ el} y mostrar que al<br />
elegir la actividad de Ti con tm mínima cada vez te lleva a una<br />
solución óptima<br />
,<br />
J.B. Hayet Programación, Mayo 2008 19 / <strong>26</strong>
Un intento de caracterización<br />
Elección glotona<br />
corresponde a hacer una elección que parece la mejor en un<br />
momento dado sin considerar los resultados de los<br />
sub-problemas: por ejemplo, “elegir la actividad que deja lo<br />
máximo de posibilidades para los sub-problemas que quedan”<br />
paradigma opuesto al de programación dinámica: en PD,<br />
decides en función de la investigación que hiciste de todos los<br />
sub-problemas que se presentan en un momento dado<br />
GA: top-down / PD: bottom-up<br />
,<br />
J.B. Hayet Programación, Mayo 2008 20 / <strong>26</strong>
Un intento de caracterización<br />
Sub-estructura óptima<br />
igual que en programación dinámica: la solución global optima<br />
tiene que contener soluciones optimas de sub-problemas: la<br />
solución sobre Tij, si contiene una actividadak, esta<br />
estructurada por las soluciones de Tik y Tkj<br />
en GA, puedes tomarlo al revés y probar por inducción que<br />
combinar una elección greedy con una resolución de<br />
sub-problemas de tamaño creciente te lleva a la solución<br />
,<br />
J.B. Hayet Programación, Mayo 2008 21 / <strong>26</strong>
Un intento de caracterización<br />
Glotón o programación dinámica?<br />
Ejemplos:<br />
la mochila, variante 0-1 (un objeto es tomado o dejado)<br />
la mochila, variante fraccionaria (puedes tomar fracción de un<br />
objeto)<br />
Los dos casos (queremos optimizar el valor transportado<br />
manteniendo el volumen abajo de V ) tienen sub-estructura optima:<br />
0-1: considerando un objeto j de la solución, de volumen vj, si<br />
lo sacas tienes un sub-problema de misma naturaleza que es<br />
óptimo (con el argumento de siempre), entre n − 1 objetos y<br />
con limite V − vj<br />
fraccionaria: igual con lo de sacar un volumen w de lo que hay<br />
del objeto j: queda un sub-problema con n − 1 objetos, vj − v<br />
unidades de j y un limite de V − v<br />
Como funcionaría la programación dinámica en los dos casos?<br />
,<br />
J.B. Hayet Programación, Mayo 2008 22 / <strong>26</strong>
Un intento de caracterización<br />
Glotón o programación dinámica?<br />
Ver clase PA-I:<br />
0-1: recursión de forma (si vi ≤ v))<br />
complejidad en O(NV )<br />
Civ = max{C(i−1)(v−vi ) + ci, C(i−1)v}<br />
fraccionaria: extensión inmediata<br />
complejidad en O(NV 2 )<br />
Civ = max {C(i−1)(v−w) + wγi}<br />
0≤w≤vi<br />
Habrá propiedad de elección greedy en uno de esos casos?<br />
,<br />
J.B. Hayet Programación, Mayo 2008 23 / <strong>26</strong>
Un intento de caracterización<br />
Glotón o programación dinámica?<br />
En el segundo caso, sí:<br />
ordenar los objetos por su precio decreciente por unidad de<br />
volumen γi y elegir el objeto i en cantidad máxima<br />
si tengo volumen v de libre, que tengo mi solución óptima y<br />
que estoy mirando al objeto i. Si vi < v y que tomo w < vi de<br />
este objeto entonces me añadirá un precio wγt, ademas de lo<br />
que gano en el óptimo del problema para v − w:<br />
Civ = C(i−1)(v−w) + wγi<br />
i−1 <br />
= w (j) γj + wγi<br />
= i−1 <br />
≤<br />
j=0<br />
i−1<br />
j=0<br />
w (j) γj + viγi − (vi − w)γi<br />
<br />
(w (j) − δj)γj + viγi<br />
j=0<br />
,<br />
J.B. Hayet Programación, Mayo 2008 24 / <strong>26</strong>
Un intento de caracterización<br />
Glotón o programación dinámica?<br />
En el primer caso, no:<br />
se pude exhibir fácilmente contra ejemplos al método por<br />
densidad de costo: objetos de 60 pesos, 10L, 100 pesos, 20L,<br />
120 pesos, 30L con capacidad de 50L<br />
se podría de hecho proponer otra estrategia que sería poner el<br />
objeto de precio mas grande que quede en el volumen actual<br />
pero otra vez deja contra-ejemplos: objetos de 90 pesos, 27L,<br />
85 pesos, <strong>26</strong>L, 80 pesos 24L<br />
fundamentalmente, el problema es que cualquiera elección en el<br />
caso “discreto” modifica la estructura combinatoria de los<br />
sub-problemas; en el caso continuo, no pasa eso<br />
,<br />
J.B. Hayet Programación, Mayo 2008 25 / <strong>26</strong>
Un intento de caracterización<br />
Glotón o programación dinámica?<br />
Vimos ya unos <strong>algoritmos</strong> basados en el paradigma de de greedy<br />
choice (o sea construyendo una solución óptima por elecciones<br />
localmente óptimas) y en programación dinámica:<br />
Programación dinámica Greedy<br />
Floyd (CM) Dijsktra (CM)<br />
Warshall (CT) Prim (AGM)<br />
Kruskal (AGM)<br />
,<br />
J.B. Hayet Programación, Mayo 2008 <strong>26</strong> / <strong>26</strong>