Mejora de un problema combinatorio sobre
                vectores ordenados
                        Javier de la Rosa, ver...
1.1 Modelando el problema como un arbol.
                                  ´                                 1 PLANTEAMIEN...
1.2 Modelando el problema como un grafo.                                1 PLANTEAMIENTO.


1.1) se obtengan en los caminos...
´
                                    2 SOLUCION BASADA EN PATRONES.


se corresponde con lo expresado en 8 (el menor posi...
2.1 Conjunto de soluciones.              ´
                                 2 SOLUCION BASADA EN PATRONES.


representa el...
2.2 Soluci´n k-´sima.
          o    e                        ´
                                2 SOLUCION BASADA EN PATRO...
2.2 Soluci´n k-´sima.
          o    e                                ´
                                        2 SOLUCION...
´
                                                          4 CONCLUSION.


3.    Experimentaci´n.
                   o
  ...
´
                                                           4 CONCLUSION.


   Finalmente, combinando los dos algoritmos,...
REFERENCIAS                                                REFERENCIAS


Referencias
[1] Knuth, Donald E. (1997). The Art ...
Upcoming SlideShare
Loading in …5
×

Mejora de un problema combinatorio sobre vectores ordenados

1,048 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,048
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Mejora de un problema combinatorio sobre vectores ordenados

  1. 1. Mejora de un problema combinatorio sobre vectores ordenados Javier de la Rosa, versae@us.es Universidad de Sevilla 3 de agosto de 2010 Resumen Dado el vector de vectores ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )), bus- camos la manera m´s eficiente en tiempo y espacio de combinar cada a uno de los elementos de cada vector con cada uno de los elementos de los vectores restantes, sin que se repita ninguna combinaci´n y siendo o importante conservar el orden a fin de obtener la soluci´n k-´sima. o e Para ello se analiza el conjunto de soluciones modelando el problema como un ´rbol primero y como un grafo despu´s, obteniendo buenas a e cotas de eficiencia. Sin embargo, la soluci´n que se propone, soportada o por estructuras de datos auxiliares que tambi´n ser´n descritas, es li- e a geramente mejor debido a que consume menos espacio y con un orden de complejidad en tiempo algo menor, siendo dependiente unicamente ´ del n´mero total de elementos. u ´ Keywords Optimizaci´n Combinatoria, Grafos, Arboles, Matrices o 1. Planteamiento. Como consecuencua de un problema mucho mayor (autocompletado y combinaci´n de consultas SQL), se presenta la necesidad de, dado un vector o de vectores, combinar sus elementos entre s´ de manera muy eficiente, pues ı este c´lculo llega a convertirse en cuello de botella. No se trata de obtener a una cifra num´rica, para lo que podr´ utilizarse la combinatoria habitual, e ıa sino de calcular cada uno de los vectores resultantes. 1
  2. 2. 1.1 Modelando el problema como un arbol. ´ 1 PLANTEAMIENTO. Sea v el vector definido en 1, donde n es el n´mero de vectores de entrada y u li el cardinal del vector i. v = ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )) (1) Tenemos que devolver todas las combinaciones ordenadas de cada elemen- to de cada vector con cada elemento de los vectores restantes, de manera que nuestra soluci´n venga dada por la expresi´n 2, y el n´mero total de o o u soluciones t quede definido por 3.     s1 (a11 , . . . , an1 ) s=.= . .. .  .  . .  . . . . (2) st (a1l1 , . . . , anln ) n t= (li ) (3) i=1 Ejemplificando, para el vector de entrada w (4) obtendr´ ıamos el conjunto de soluciones m (5). w = ((a1 , a2 ), (b1 , b2 ), (c1 , c2 )) (4)   (a1 , b1 , c1 ) (a1 , b1 , c2 )   (a1 , b2 , c1 )   (a1 , b2 , c2 ) m=   (5)  (a2 , b1 , c1 )  (a2 , b1 , c2 )   (a2 , b2 , c1 ) (a2 , b2 , c2 ) Se describen a continuaci´n dos formas de abordar el problema. o 1.1. Modelando el problema como un ´rbol. a Analizando el conjunto de soluciones, puede generarse un arbol a partir ´ de un nodo ra´ que tenga tantas ramas como elementos el primer vector, y ız para cada elemento del segundo vector, a˜adir ramas con los elementos del n tercero, etc. De manera que recorriendo las hojas del arbol resultante (figura ´ 2
  3. 3. 1.2 Modelando el problema como un grafo. 1 PLANTEAMIENTO. 1.1) se obtengan en los caminos seguidos desde la ra´ las combinaciones que ız conforman la soluci´n. o k root RRRR kkk RRR kkkkk RRR RRR kk kk RRR kkk a11 E · · · a1l1 z EE y FFF zzz EE yyy FF zz EE yy FF zz E yy F an1 ··· anln ··· an1 ··· anln La unica manera de obtener todas las soluciones usando esta forma de ´ atacar el problema es recorriendo todos los caminos posibles. Usando para ello un algoritmo simple de b´squeda en profundidad [1] que recorra todos los u nodos obtendr´ ıamos un tiempo O(|V | + |E|), con el conocido uso de espacio de orden O(|V |). Esto que a priori puede parecer una buena aproximaci´n, o se complica en el momento en que se calculan los valores de |V | y |E|. Para nuestro caso, en el nivel 1 del ´rbol tenemos l1 nodos; en el 2 habr´ l2 nodos a ıa por cada nodo en l1 , esto es, l1 l2 nodos; de esta manera, el n´mero de nodos u del nivel i vendr´ definido por 6 y el total queda expresado en 7. Sin necesidad ıa de calcular |E| podemos concluir que el orden espacial es demasiado elevado. n |V |i =⇒ (li ) (6) i=1 n j |V | = ( (li )) (7) j=1 i=1 1.2. Modelando el problema como un grafo. Construido el grafo de la figura 1.2 podemos reducir el problema a recorrer todos sus caminos posibles. Dado que se trata de un grafo dirigido y no ponderado, pero del que conocemos los nodos de inicio y final, partimos de cada uno de los elementos de a1 y calculamos los caminos posibles de longitud n que terminan en alg´n elemento de an . Una simple ponderaci´n u o de 1 sobre el conjunto de aristas permite aplicar el algoritmo de Dijsktra [2] l1 veces hasta obtener todos las soluciones, con lo que la complejidad de nuevo depende del n´mero de v´rtices y aristas. Si bien el primero de estos valores u e 3
  4. 4. ´ 2 SOLUCION BASADA EN PATRONES. se corresponde con lo expresado en 8 (el menor posible), el n´mero de aristas u es algo m´s complejo de calcular. Sabemos que s´lo existen aristas entre los a o elementos de cada par de vectores ai y ai+1 y que adem´s ´stos forman un a e subgrafo bipartido en el que los nodos de ai+1 son sumideros, luego el n´mero u de aristas que une cada uno de estos ser´ li li+1 . Si hay n−1 grafos bipartidos, a el n´mero total de aristas vendr´ dado por la expresi´n 9. u a o HIJK ONML a11 O ONML HIJK ··· ONML HIJK a1l1 ? ?O O  ? o o o ?  ? O O o ? ? o o O ?  o ? O  HIJK ONML ONML HIJK ONML HIJK  o wo  O O? ' an1 ··· anln n |V | = (li ) (8) i=1 n−1 |E| = (li li+1 ) (9) i=1 De lo que podemos afirmar que se trata de un grafo denso [4] y, por tanto, susceptible de aplicar la mejora de mont´ ıculos de Fibonacci [3] que nos da una complejidad en tiempo O(|E|+|V | log |V |). Puede apreciarse la reducci´no del orden de complejidad, al que en realidad habr´ que a˜adir la creaci´n ıa n o de la estructura en grafo necesaria para una correcta estimaci´n del espacio o necesario. Sin embargo, estos resultados siguen estando por debajo de la soluci´n propuesta, por lo que el desarrollo de la obtenci´n de la cota espacial o o quedan fuera de este documento. 2. Soluci´n basada en patrones. o La soluci´n que proponemos plantea el problema tomando el conjunto de o salida como la traspuesta de la matriz S, donde S se define en 10.     a11 . . . an1 a11 . . . a1l1 S =  . ... .  =⇒ S T =  . . . .   . .  . .  .. . .  . (10) a1l1 . . . anln an1 . . . anln Cada fila de la matriz traspuesta s´lo contiene elementos de un unico vector o ´ siguiendo el patr´n dado por las expresiones regulares de 11, de forma que ri o 4
  5. 5. 2.1 Conjunto de soluciones. ´ 2 SOLUCION BASADA EN PATRONES. representa el n´mero de veces que se repite cada elemento dentro del grupo u y ri indica las veces que el grupo se repite al completo. Al examinar E se aprecia que la longitud de cada ei es igual al n´mero total de soluciones, por u lo que los ´ ındices r y r est´n relacionados con t y li como se expresa en 12. a    r  e1 (a11 . . . ar11 )r1 1 1l S T =⇒ E =  .  =  . .  . (11)  . .  rn rn rn en (an1 . . . anln ) li ri ri = t (12) Por construcci´n, la defini´n de r es recursiva tal y como se expresa en 13, o o pero su formulaci´n nos permite demostrar por inducci´n la validez de las o o expresiones 14 y 15 (dadas las ρi como se indican en 16). 1 ⇔i=n ri = (13) li−1 ri−1 ⇔i=n ρi ri = (14) li t ri = (15) ρi n ρi = (lj ) (16) j=i 2.1. Conjunto de soluciones. Una vez hallados los vectores auxiliares r y r , obtener un procedimiento para generar el conjunto de soluciones de una sola atacada (en una unica ite- ´ raci´n por todos los elementos de v) es relativamente sencillo. Analizando un o poco la algoritmia necesaria, en realidad s´lo hay que pre-calcular los valores o de n y t y los vectores l y r, ya que en cada iteraci´n los valores de ri se o van calculando y eliminando, con el consecuente ahorro que supone no man- tener otro vector completo en memoria. Finalmente, nuestro procedimiento quedar´ como se muestra en el algoritmo 1. ıa 5
  6. 6. 2.2 Soluci´n k-´sima. o e ´ 2 SOLUCION BASADA EN PATRONES. Algorithm 1 Algoritmo para la obtenci´n del conjunto de soluciones o Require: v ← ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )) Ensure: S ← (s1 , ..., st ) n ← |v| l ← (|a1 |, . . . , |an |) t ← n (li ) i=1 r ← {Vector definido en 13} for i from 1 to n do f ← {Vector vac´ ıo} for j from 1 to li do f ← f ∪ (aij )ri end for t ri ← |f | k ← |S| + 1 sT ← (f )ri k end for return S T An´lisis de complejidad. Si obviamos la trasposici´n de la matriz de a o resultados S, realmente no necesaria (las soluciones estar´ en las columnas ıan en lugar de en las filas), este algoritmo itera por todos los elementos de v, por lo que su orden de complejidad es el m´ ınimo de los expuestos hasta el momento tal y como refleja 17. n O( li ) (17) i=1 En cambio, para la estimaci´n es espacio obtenemos 18 o n n √ O(nt) = O(n (li )) = O( (li n n)) (18) i=1 i=1 2.2. Soluci´n k-´sima. o e Otra de las ventajas de este planteamiento no contempladas en 1.1 o 1.2, ´ es la obtenci´n de la soluci´n k-´sima, huelga decir que sin calcular previa- o o e mente todo el conjunto de soluciones. Observando 11 y aplicando los mismos conceptos, para un determinado k (equivalente a seleccionar la columna k de 6
  7. 7. 2.2 Soluci´n k-´sima. o e ´ 2 SOLUCION BASADA EN PATRONES. S T , esto es, sT ), existe un vector ι con cardinal n que contiene los ´ k ındices de cada ai por los cuales se obtienen en orden los elementos implicados en la k-´sima soluci´n; cada una de las ιi viene expresada en funci´n de k por la e o o f´rmula 19. o k m´d li ri o ιi (k) = (19) ri As´ la f´rmula general para la obtenci´n de la k-´sima soluci´n se define en 20 ı, o o e o y un procedimiento para la obtenci´n del conjunto de soluciones basado en o la funci´n ιi (k) se muestra en el algoritmo 2. o sk = (a1ι1 (k) , . . . , anιn (k) ) (20) Algorithm 2 Algoritmo basado en la soluci´n k-´sima o e Require: v ← ((a11 , . . . , a1l1 ), . . . , (an1 , . . . , anln )) Ensure: S ← (s1 , ..., st ) n ← |v| l ← (|a1 |, . . . , |an |) t ← n (li ) i=1 r ← {Vector definido en 13} for k from 1 to t do for i from 1 to n do ιi ← k m´d li ri o ri ski ← aiιi end for end for return S An´lisis de complejidad. No resulta dif´ ver que la cota asint´tica a ıcil o superior del algoritmo anterior es, tanto en tiempo como espacio, la expresada en 21, es decir, peor cota temporal que para el algoritmo 1. O(nt) (21) 7
  8. 8. ´ 4 CONCLUSION. 3. Experimentaci´n. o Los resultados anteriores son f´cilmente verificables tras la ejecuci´n de a o algunos experimentos. De manera no exhaustiva, podemos someter ambos algoritmos a un conjunto de datos aleatorio que cuente con variedades de v para determinados valores de n y t. Como muestra el cuadro 3, para valores peque˜os de n el tiempo necesario para completar el proceso parece fluctuar n entre uno y otro, quedando sensiblemente peor puntuado el algoritmo 2. Sin embargo, a medida que n aumenta y lo hace consecuentemente t, es evidente que el algoritmo 1 presenta mejores resultados, llegando, para valores de n 6, a superar a su competidor en m´s del 90 % de las ocasiones, resultado a que cuadra perfectamente con el estudio te´rico. No obstante, es evidente que o No exp. n Valor medio t ln % m´s r´pido 1 a a % m´s r´pido 2 a a 109 2 46,52 6,78 89,91 % 10,09 % 121 3 275,53 6,59 68,60 % 31,40 % 104 4 1 342,37 6,04 50,96 % 49,04 % 95 5 10 405,91 6,52 56,84 % 43,16 % 113 6 66 496,30 6,45 69,03 % 30,97 % 106 7 485 391,86 6,50 92,45 % 7,55 % 105 8 2 354 423,58 6,38 95,24 % 4,76 % Cuadro 1: Estad´ ısticas de la experimentaci´n o son necesarios m´s experimentos para obtener resultados contundentes, pues a en nuestro caso no se han tenido en cuenta vectores de entrada con valores de ln por encima de 11. 4. Conclusi´n. o A lo largo de este documento se han analizado distintas formas de abor- dar un problema de optimizaci´n combinatoria para, finalmente, proponer o una soluci´n satisfactoria a partir de los patrones descritos en la soluci´n. o o Adem´s, se ha dado un m´todo general para la obtenci´n de la k-´sima so- a e o e luci´n que, si a priori podr´ parecer una mejor aproximaci´n, los c´lculos o ıa o a posteriores y la experimentaci´n han demostrado ser peor que el primero de o los procedimientos expuestos. 8
  9. 9. ´ 4 CONCLUSION. Finalmente, combinando los dos algoritmos, podemos obtener una funci´n o en el lenguaje de programaci´n Python que sea capaz de, dada una lista de o listas en items y un valor opcional en k, devolver una lista de listas con todas las soluciones o la soluci´n que ocupa el k-´simo lugar si un valor para k es o e proporcionado. El resultado se muestra en 4. def combine ( items , k=None ) : ””” Create a m a t r i x i n wich each row i s a t u p l e c o n t a i n i n g one o f s o l u t i o n s or k−esima s o l u t i o n . ””” length items = len ( items ) l e n g t h s = [ l e n ( i ) for i in i t e m s ] l e n g t h = r e d u c e (lambda x , y : x ∗ y , l e n g t h s ) r e p e a t s = [ r e d u c e (lambda x , y : x ∗ y , l e n g t h s [ i : ] ) for i in range ( 1 , l e n g t h i t e m s ) ] + [ 1 ] i f k i s not None : k = k % length # Python d i v i s i o n i s i n t e g e r d i v i s i o n by d e f a u l t indices = [ ( k % ( lengths [ i ] ∗ repeats [ i ] ) ) / repeats [ i ] for i in range ( l e n g t h i t e m s ) ] return [ i t e m s [ i ] [ i n d i c e s [ i ] ] for i in range ( l e n g t h i t e m s ) ] else : matrix = [ ] for i , item in enumerate ( i t e m s ) : row = [ ] for s u b s e t in item : row . extend ( [ s u b s e t ] ∗ r e p e a t s [ i ] ) t i m e s = l e n g t h / l e n ( row ) matrix . append ( row ∗ t i m e s ) # Transpose t h e m a t r i x or r e t u r n columns i n s t e a d rows return z i p (∗ matrix ) 9
  10. 10. REFERENCIAS REFERENCIAS Referencias [1] Knuth, Donald E. (1997). The Art Of Computer Programming. Vol 1. 3rd ed., Boston: Addison-Wesley, ISBN 0-201-89683-4, OCLC 155842391 [2] Dijkstra, E. W. (1959). A note on two problems in connexion with graphs. Numerische Mathematik 1, pp 269-271. [3] Fredman M. L. Tarjan R. E. (1987). Fibonacci heaps and their uses in improved network optimization algorithms. Journal of the ACM 34(3), pp 596-615. [4] Black, P. E. Dictionary of Algorithms and Data Structures, Paul E. Black (ed.), NIST. http://www.itl.nist.gov/div897/sqg/dads/HTML/ sparsegraph.html Accedido el 1 de agosto de 2010. 10

×