stringtranslate.com

Algoritmo de Coffman-Graham

El algoritmo de Coffman-Graham es un algoritmo para organizar los elementos de un conjunto parcialmente ordenado en una secuencia de niveles. El algoritmo elige una disposición tal que un elemento que viene después de otro en el orden se asigna a un nivel inferior, y tal que cada nivel tiene un número de elementos que no excede un límite de ancho fijo W . Cuando W = 2 , utiliza el número mínimo posible de niveles distintos y, en general, utiliza como máximo 2 − 2/ W veces más niveles que sean necesarios.

Recibe su nombre en honor a Edward G. Coffman, Jr. y Ronald Graham , quienes lo publicaron en 1972 para una aplicación en la programación de talleres de trabajo . En esta aplicación, los elementos que se deben ordenar son trabajos, el límite W es el número de trabajos que se pueden programar en cualquier momento y el orden parcial describe las relaciones de prerrequisitos entre los trabajos. El objetivo es encontrar una programación que complete todos los trabajos en el tiempo total mínimo. Posteriormente, el mismo algoritmo también se ha utilizado en el dibujo de gráficos , como una forma de colocar los vértices de un gráfico dirigido en capas de anchos fijos de modo que la mayoría o todos los bordes se dirijan de manera consistente hacia abajo.

Para un ordenamiento parcial dado por su reducción transitiva (relación de cobertura), el algoritmo de Coffman-Graham se puede implementar en tiempo lineal utilizando la estructura de datos de refinamiento de partición como subrutina. Si no se da la reducción transitiva, se necesita un tiempo polinomial para construirla.

Planteamiento del problema y aplicaciones

En la versión del problema de programación de talleres de trabajo resuelta por el algoritmo de Coffman–Graham, se proporciona un conjunto de n trabajos J 1 , J 2 , ..., J n , junto con un sistema de restricciones de precedencia J i < J j que requieren que el trabajo J i se complete antes de que comience el trabajo J j . Se supone que cada trabajo tarda una unidad de tiempo en completarse. La tarea de programación es asignar cada uno de estos trabajos a intervalos de tiempo en un sistema de W procesadores idénticos, minimizando el tiempo transcurrido desde el comienzo del primer trabajo hasta la finalización del trabajo final. De manera abstracta, las restricciones de precedencia definen un orden parcial en los trabajos, por lo que el problema se puede reformular como uno de asignación de los elementos de este orden parcial a niveles (intervalos de tiempo) de tal manera que cada intervalo de tiempo tenga como máximo tantos trabajos como procesadores (como máximo W elementos por nivel), respetando las restricciones de precedencia. Esta aplicación fue la motivación original de Coffman y Graham para desarrollar su algoritmo. [1] [2]

En el marco de dibujo de gráficos en capas delineado por Sugiyama, Tagawa y Toda (1981) [3] la entrada es un gráfico dirigido y el dibujo de un gráfico se construye en varias etapas: [4] [5]

  1. Se elige un conjunto de arcos de retroalimentación y se invierten los bordes de este conjunto para convertir la entrada en un gráfico acíclico dirigido con (si es posible) pocos bordes invertidos.
  2. Los vértices del grafo reciben coordenadas y enteras de tal manera que, para cada arista, el vértice inicial de la arista tiene una coordenada más alta que el vértice final, con un máximo de W vértices compartiendo la misma coordenada y . De esta manera, todas las aristas del grafo acíclico dirigido y la mayoría de las aristas del grafo original estarán orientadas consistentemente hacia abajo.
  3. Se introducen vértices ficticios dentro de cada arista para que todas las aristas subdivididas conecten pares de vértices que están en niveles adyacentes del dibujo.
  4. Dentro de cada grupo de vértices con la misma coordenada y , los vértices se permutan para minimizar el número de cruces en el dibujo resultante, y a los vértices se les asignan coordenadas x de manera consistente con esta permutación.
  5. Los vértices y los bordes del gráfico se dibujan con las coordenadas asignadas a ellos.

En este marco, la asignación de la coordenada y implica nuevamente agrupar elementos de un conjunto parcialmente ordenado (los vértices del gráfico, con el orden de alcanzabilidad en el conjunto de vértices) en capas (conjuntos de vértices con la misma coordenada y ), que es el problema resuelto por el algoritmo de Coffman-Graham. [4] Aunque existen enfoques alternativos al algoritmo de Coffman-Graham para el paso de capas, estas alternativas en general no son capaces de incorporar un límite en el ancho máximo de un nivel o dependen de procedimientos complejos de programación entera . [6]

De manera más abstracta, ambos problemas se pueden formalizar como un problema en el que la entrada consiste en un conjunto parcialmente ordenado y un entero W. La salida deseada es una asignación de números de nivel entero a los elementos del conjunto parcialmente ordenado de manera que, si x < y es un par ordenado de elementos relacionados del orden parcial, el número asignado a x es menor que el número asignado a y , de manera que a lo sumo W elementos se les asigna el mismo número entre sí, y se minimiza la diferencia entre los números asignados más pequeños y más grandes.

El algoritmo

El algoritmo Coffman-Graham realiza los siguientes pasos. [4]

  1. Representar el orden parcial por su reducción transitiva o relación de cobertura , un grafo acíclico dirigido G que tiene una arista de x a y siempre que x < y y no exista ningún tercer elemento z del orden parcial para el cual x < z < y . En las aplicaciones de dibujo de grafos del algoritmo de Coffman-Graham, el grafo acíclico dirigido resultante puede no ser el mismo que el grafo que se está dibujando, y en las aplicaciones de programación puede no tener una arista para cada restricción de precedencia de la entrada: en ambos casos, la reducción transitiva elimina las aristas redundantes que no son necesarias para definir el orden parcial.
  2. Construya un ordenamiento topológico de G en el que los vértices estén ordenados lexicográficamente por el conjunto de posiciones de sus vecinos entrantes. Para ello, agregue los vértices uno a la vez al ordenamiento, en cada paso eligiendo un vértice v para agregar de modo que los vecinos entrantes de v ya sean todos parte del ordenamiento parcial, y de modo que el vecino entrante agregado más recientemente de v sea anterior al vecino entrante agregado más recientemente de cualquier otro vértice que pudiera agregarse en lugar de v . Si dos vértices tienen el mismo vecino entrante agregado más recientemente, el algoritmo desempata a favor de aquel cuyo segundo vecino entrante agregado más recientemente sea anterior, etc.
  3. Asignar los vértices de G a niveles en orden inverso al orden topológico construido en el paso anterior. Para cada vértice v , añadir v a un nivel que sea al menos un paso más alto que el nivel más alto de cualquier vecino saliente de v , que no tenga ya W elementos asignados a él, y que sea lo más bajo posible sujeto a estas dos restricciones.

Análisis

Calidad de salida

Como Coffman y Graham (1972) demostraron originalmente, su algoritmo calcula una asignación óptima para W = 2 ; es decir, para problemas de programación con trabajos de longitud unitaria en dos procesadores, o para problemas de dibujo de gráficos en capas con como máximo dos vértices por capa. [1] Un algoritmo estrechamente relacionado también encuentra la solución óptima para la programación de trabajos con longitudes variables, lo que permite la prelación de trabajos programados, en dos procesadores. [7] Para W > 2 , el algoritmo de Coffman–Graham usa un número de niveles (o calcula una programación con un makespan) que está dentro de un factor de 2 − 2/ W del óptimo. [8] [9] Por ejemplo, para W = 3 , esto significa que usa como máximo 4/3 veces más niveles que los óptimos. Cuando el orden parcial de las restricciones de precedencia es un orden de intervalo , o pertenece a varias clases relacionadas de órdenes parciales, el algoritmo de Coffman–Graham encuentra una solución con el número mínimo de niveles independientemente de su límite de ancho. [10]

Además de encontrar planificaciones con tiempos de ejecución pequeños, el algoritmo Coffman–Graham (modificado de la presentación aquí para que ordene topológicamente el gráfico inverso de G y coloque los vértices lo más temprano posible en lugar de lo más tarde posible) minimiza el tiempo total de flujo de planificaciones de dos procesadores, la suma de los tiempos de finalización de los trabajos individuales. Se puede utilizar un algoritmo relacionado para minimizar el tiempo total de flujo para una versión del problema en la que se permite la preemisión de trabajos. [11]

Complejidad temporal

Coffman & Graham (1972) y Lenstra & Rinnooy Kan (1978) [12] establecen que la complejidad temporal del algoritmo Coffman–Graham, en un orden parcial de n elementos, es O ( n 2 ) . Sin embargo, este análisis omite el tiempo para construir la reducción transitiva, que no se sabe que sea posible dentro de este límite. Sethi (1976) muestra cómo implementar la etapa de ordenamiento topológico del algoritmo en tiempo lineal , basándose en la idea de refinamiento de partición . [13] Sethi también muestra cómo implementar la etapa de asignación de nivel del algoritmo de manera eficiente mediante el uso de una estructura de datos de conjunto disjunto . En particular, con una versión de esta estructura publicada posteriormente por Gabow & Tarjan (1985), esta etapa también requiere tiempo lineal. [14]

Referencias

  1. ^ ab Coffman, EG Jr. ; Graham, RL (1972), "Programación óptima para sistemas de dos procesadores" (PDF) , Acta Informatica , 1 (3): 200–213, doi :10.1007/bf00288685, MR  0334913, S2CID  40603807.
  2. ^ Leung, Joseph Y.-T. (2004), "Algunos algoritmos básicos de programación", Manual de programación: algoritmos, modelos y análisis de rendimiento , CRC Press, ISBN 978-1-58488-397-5.
  3. ^ Sugiyama, Kozo; Tagawa, Shôjirô; Toda, Mitsuhiko (1981), "Métodos para la comprensión visual de estructuras de sistemas jerárquicos", IEEE Transactions on Systems, Man, and Cybernetics , SMC-11 (2): 109–125, doi :10.1109/TSMC.1981.4308636, MR  0611436, S2CID  8367756.
  4. ^ abc di Battista, Giuseppe; Eades, Peter ; Tamassia, Roberto ; Tollis, Ioannis G. (1999), "Capítulo 9: Dibujos en capas de dígrafos", Dibujo de grafos: algoritmos para la visualización de grafos , Prentice Hall, págs. 265–302.
  5. ^ Bastert, Oliver; Matuszewski, Christian (2001), "Dibujos en capas de dígrafos", en Kaufmann, Michael; Wagner, Dorothea (eds.), Dibujo de grafos: métodos y modelos , Lecture Notes in Computer Science, vol. 2025, Springer-Verlag, págs. 87–120, doi :10.1007/3-540-44969-8_5Bastert y Matuszewski también incluyen una descripción del algoritmo Coffman-Graham; sin embargo, omiten la etapa de reducción transitiva del algoritmo.
  6. ^ Healy, Patrick; Nikolov, Nikola S. (2002), "Cómo superponer un gráfico acíclico dirigido", Graph Drawing: 9th International Symposium, GD 2001 Vienna, Austria, 23–26 de septiembre de 2001, Documentos revisados , Lecture Notes in Computer Science, vol. 2265, Springer-Verlag, págs. 16–30, doi : 10.1007/3-540-45848-4_2 , MR  1962416.
  7. ^ Muntz, RR; Coffman, EG (1969), "Programación preemptiva óptima en sistemas de dos procesadores", IEEE Transactions on Computers , 18 (11): 1014–1020, doi :10.1109/TC.1969.222573, S2CID  206617438.
  8. ^ Lam, Shui; Sethi, Ravi (1977), "Análisis del peor caso de dos algoritmos de programación", SIAM Journal on Computing , 6 (3): 518–536, doi :10.1137/0206037, MR  0496614.
  9. ^ Braschi, Bertrand; Trystram, Denis (1994), "Una nueva perspectiva sobre el algoritmo Coffman-Graham", SIAM Journal on Computing , 23 (3): 662–669, doi :10.1137/S0097539790181889, MR  1274650.
  10. ^ Chardon, Marc; Moukrim, Aziz (2005), "El algoritmo Coffman-Graham resuelve de manera óptima los sistemas de tareas UET con órdenes sobreintervalo", SIAM Journal on Discrete Mathematics , 19 (1): 109–121, doi :10.1137/S0895480101394999, MR  2178187.
  11. ^ Coffman, EG Jr .; Sethuraman, J.; Timkovsky, VG (2003), "Programas preemptivos ideales en dos procesadores", Acta Informatica , 39 (8): 597–612, doi :10.1007/s00236-003-0119-6, MR  1996238, S2CID  7016804.
  12. ^ Lenstra, JK ; Rinnooy Kan, AHG (1978), "Complejidad de la programación bajo restricciones de precedencia", Investigación de operaciones , 26 (1): 22–35, doi :10.1287/opre.26.1.22, hdl : 10338.dmlcz/141477 , JSTOR  169889, MR  0462553.
  13. ^ Sethi, Ravi (1976), "Programación de gráficos en dos procesadores", SIAM Journal on Computing , 5 (1): 73–82, doi :10.1137/0205005, MR  0398156.
  14. ^ Gabow, Harold N. ; Tarjan, Robert Endre (1985), "Un algoritmo de tiempo lineal para un caso especial de unión de conjuntos disjuntos", Journal of Computer and System Sciences , 30 (2): 209–221, doi : 10.1016/0022-0000(85)90014-5 , MR  0801823.