Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anteriorRevisión previa
Próxima revisión
Revisión previa
analisis [2010/10/20 07:41] – [¿qué es un algoritmo?] adminanalisis [2023/03/13 14:40] (actual) – editor externo 127.0.0.1
Línea 1: Línea 1:
 =====Análisis y casos==== =====Análisis y casos====
-{{ :icon_analisis.png?nolink|}}Tras la lectura del [[manual|manual de usuario]], a continuación puede conocer los diferentes tipos de análisis que se pueden realizar con Grafos. Para ello, el [[software]] incorpora un conjunto de algoritmos útiles que se organizan en las siguientes categorías:+~~NOTOC~~ 
 +{{ :icon_analisis.png?nolink|}}Tras la lectura del [[manual|manual de usuario]], a continuación puede conocer los diferentes tipos de análisis que se pueden realizar con el [[software]] Grafos.  
 + 
 +===¿cómo usar los algoritmos en Grafos?=== 
 +En el modo de edición gráfico observará una barra de herramientas con los siguientes botones.{{:grafos_barraherramientasanalisis.png?nolink |barra de herramientas de análisis}} Desde esta barra podrá desplegar y utilizar todos los posibles algoritmos de Grafos que están organizados en las siguientes categorías:
   * Caminos   * Caminos
     * camino mínimo     * camino mínimo
Línea 13: Línea 17:
     * problema de transbordo     * problema de transbordo
     * problema de asignación     * problema de asignación
 +    * localización a coste mínimo
   * Rutas   * Rutas
 +    * circuito euleriano
     * problema de viajante de comercio     * problema de viajante de comercio
     * problema de //m// viajantes de comercio     * problema de //m// viajantes de comercio
Línea 19: Línea 25:
       * problema de rutas con vehículos capacitados (CVRP)       * problema de rutas con vehículos capacitados (CVRP)
  
-Prueba de render fórmulas:+Al desplegar cualquiera de las categorías (con un grafo construido en pantalla) observará que que algunas opciones están habilitadas y otras no. Para la aplicación de algunos algoritmos, Grafos requiere de algún dato de entrada, como un nodo origen seleccionado (origen), un nodo destino seleccionado (destino), un conjunto de nodos seleccionados (selección), o meta-datos para los problemas CVRP (VRP-XML). Los algoritmos que no requieren datos de entrada estarán siempre habilitados y podrán ser utilizados directamente, en cambio, para habilitar el resto de algoritmos deberá seleccionar (origen, destino, otros) según se indica en la opción de menú elegida. 
 +{{ :grafos_activandoanalisis.png?nolink |activando menús de análisis}}
  
 +Recuerde que para activar un nodo origen (Nd1) debe hacer click sobre él con el botón izquierdo del ratón, el nodo destino (Nd2) se selecciona haciendo click el botón derecho del ratón. Conforme se encuentre el estado de la selección, observará que se activan o desactivan las opciones de menú.
  
 +En el caso de que Grafos requiera información adicional, se mostrará en pantalla una pequeña ventana con los datos de entrada. Grafos le da libertad para analizar un mismo grafo desde diferentes puntos de vista en cualquier momento, en caso de que la estructura del grafo no sea coherente con el algoritmo, de que falten datos asociados a los arcos, o de no factibilidad, etc. Grafos le avisará. De este modo, aprenderá sobre la utilidad de cada algoritmo y sobre los datos-estructura del grafo requerido. No se preocupe por probar y experimentar, Grafos es relativamente robusto.
  
-     +Si todo es correcto, a continuación el algoritmo comenzará su proceso de cálculoEl tiempo requerido dependerá del tipo de heurística, de la complejidad del problema a resolver, y por supuesto de la capacidad de cómputo de su ordenadorEn cualquier caso, los problemas de optimización tipo MILP (programación lineal entera mixtason extremadamente complejos y requieren un tiempo de computación muy superior. Esto se tratará más adelante.
-    <tex>  \displaystyle{1 + x_{ij} + int_{-\infty}^xe}</tex> +
-     +
-     +
-<html><img src="http://www.forkosh.com/cgi-bin/mathtex.cgi?f(x)=\int_{-\infty}^xe^{-t^2}dt" +
-    alt="" border=0 align="middle"></html> +
-     +
-    <math> \frac{\sum_{n=1}^N x^{\sqrt{n+1}}-x^{x^{2n}}}{(\ln(x)+2x^{4x+1289})^{\frac{1}{2}}} </math>+
  
-====Algoritmos==== +Al finalizar el algoritmo, ocurrirán varias cosas: 
-Seguidamente se describirán los principales algoritmos incorporados en Grafosprestando especial atención a su aplicación utilidad.+  * Se muestra una ventana con los Resultados del Análisis. Donde se muestra la solución obtenida en modo texto, y el tiempo total de cómputo para el algoritmo seleccionado. En el caso de la optimización, además se podrá visualizar el modelo .lp o .mps del problema.
  
 +{{ :grafos_resultadostexto.png?nolink |Resultados del Análisis}}
  
-===¿qué es un algoritmo?=== +Utilizar esta ventana es algo bastante intuitivoFácilmente podrá guardar el texto de la solucióncopiarlo al portapapelesimprimirlocambiar el tamaño de letra (útil para monitores grandes)visualizar/ocultar la solución dibujada. 
-Una posible definición de [[wpes>Algoritmo|algoritmo]] es un conjunto de reglas que permiten obtener un resultado determinado a partir de ciertas reglas definidasOtra definición sería, algoritmo es una secuencia finita de instruccionescada una de las cuales tiene un significado preciso y puede ejecutarse con una cantidad finita de esfuerzo en un tiempo finito. Ha de tener las siguientes características: legiblecorrectomodular, eficiente, estructurado, no ambiguo y a ser posible se ha de desarrollar en el menor tiempo posible. El término proviene del matemático árabe [[wpes>Al_Khwarizmi|Al'Khwarizmi]], que escribió un tratado sobre los números. Este texto se perdió, pero su versión latina, //Algoritmi de Numero Indorum//, sí se conoce.+{{ :grafos_barraanalisisresultados.png?nolink |Resultados del Análisis - barra herramientas}}
  
-===¿cómo usar los algoritmos en Grafos?=== 
  
-===¿qué algoritmos incorpora Grafos?===+  * Se dibujará la solución sobre el grafo, subrayando los arcos y nodos de la solución. 
 +{{ :grafos_soluciondibujada.png?nolink |solución dibujada}}
  
-  * [[algoritmo_dijkstra|algoritmo de Dijkstra]] +{{:grafos_configuracionanalisis.png?nolink |}}La solución se dibujará según los colores elegidos y trazos elegidos en Configuración de los Análisis. Es muy fácil, personalizar los colores y el trazado. Ocultando el dibujado de la solución (ventana de Resultados del Análisis), el grafo se dibujará como antes de la ejecución del algoritmo. En cualquier caso, es bueno guardar el estado del grafo antes y después de ejecutar el algoritmo.
-  * a +
-  * a +
-  * a +
-  * a+
  
-===algoritmo de Bellman-Ford===+{{ :grafos_configcoloresanalisis.png?nolink |personalizando colores para los análisis}}
  
-**//camino mínimo - camino máximo//**+Con todo esto, ya está preparado para aprender más sobre los diferentes algoritmos y su utilidad. 
 +====Algoritmos==== 
 +Una posible definición de [[wpes>Algoritmo|algoritmo]] es un conjunto de reglas que permiten obtener un resultado determinado a partir de ciertas reglas definidas. Otra definición sería, algoritmo es una secuencia finita de instrucciones, cada una de las cuales tiene un significado preciso y puede ejecutarse con una cantidad finita de esfuerzo en un tiempo finito. Ha de tener las siguientes características: legible, correcto, modular, eficiente, estructurado, no ambiguo y a ser posible se ha de desarrollar en el menor tiempo posible. El término proviene del matemático árabe [[wpes>Al_Khwarizmi|Al'Khwarizmi]], que escribió un tratado sobre los números. Este texto se perdió, pero su versión latina, //Algoritmi de Numero Indorum//, sí se conoce.
  
-**Lester Randolph Ford** es uno de los pioneros en el campo de la programación de flujos en grafos. Es el hijo de L.R. Ford Sr. (quién también es un matemático distinguido) y nació el 23 de septiembre de 1927. L. R. Ford Sr es elogiado por su ejemplar trabajo en matemáticas al inventar una interpretación geométrica absolutamente maravillosa de la serie de Farey. También le acredita su trabajo 'Pointwise Discontinuous Functions' que era la base de su trabajo para un grado de M.S. del departamento de matemáticas en la universidad de Missouri-Colombia en 1912. Tal fue su contribución a las matemáticas, que en 1964 se estableció el Lester R. Ford Award para reconocer la contribución a las matemáticas de excelentes autores matemáticos publicados en The American Mathematical Monthly o Mathematics Magazine. Fue redactor de American Mathematical Monthly, de 1942-1946, y el presidente de Mathematical Association of America, 1947-1948. Ford Sr. y Ford Jr. son co-autores de Automorphic Functions cuál fue publicado cerca por McGraw-Hill en 1963. +Seguidamente se describirán los principales algoritmos incorporados en Grafos, prestando especial atención a su aplicación y utilidad.
- +
-Al continuar los pasos de su padre Ford Jr. también hizo una enorme contribución al campo de las matemáticas. Su trabajo con Delbert Ray Fulkerson (14 agosto de 1924 - 10 Enero de 1976) ha puesto la base de casi toda la investigación en flujos de grafos. El artículo de Ford y de Fulkerson (1956) con el problema de flujo máximo estableció el famoso teorema del flujo máximo - mínimo corte. +
- +
-Mientras trabajó en RAND CORPORATION, Ford Jr publicó numerosos artículos que no solo establecieron la base de los flujos de red sino también la futura investigación en este campo. En 1962 Priceton University Press publicó su libro Flow in Networks con D. R. Fulkerson como co-autor. Este libro contiene todo su trabajo sobre redes. +
- +
-La mayoría del trabajo de Ford lo hizo en la colaboración con Fulkerson, al parecer los dos hacían una buena asociación. Sin embargo, en 1956 presentó varios artículos firmados por él sólo. Ha sido el autor de diversos algoritmos que se han refinado con los años y que todavía se utilizan para solucionar la mayoría de problemas de grafos. +
- +
-**algoritmo de Bellman-Ford (camino mínimo)** +
- +
-Soluciona el problema de la ruta más corta o camino mínimo desde un nodo origen, de un modo más general que el Algoritmo de Dijkstra, ya que permite valores negativos en los arcos. +
- +
-El algoritmo devuelve un valor booleano si encuentra un circuito o lazo de peso negativo. En caso contrario calcula y devuelve el camino mínimo con su coste. Para cada vértice v perteneciente a V, se mantiene el atributo d[v] como cota superior o coste del camino mínimo desde el origen s al vértice v. A continuación se muestra el pseudocódigo del algoritmo: +
-<code> +
-Bellman-Ford (G,s) +
- +
-Inicializar +
-    for cada v perteneciente a V[G] +
-        do d[v] = infinito +
-            p[v] = nulo +
-    p[s] = 0 +
- +
-for i=1 to V[G]-1  +
-    do for cada arco (u,v) perteneciente a A[G] +
-        Relajación +
-        if d[v] > d[u] + w(u,v) then  +
-            d[v] = d[u] + w(u,v) +
-            p(v) = u +
- +
-for cada arco (u,v) chequea lazo de peso negativo +
-    do if d[v] > d[u] + w(u,v) then +
-        return FALSO 'el algoritmo no converge +
-return VERDADERO +
-</code> +
- +
-**algoritmo de Bellman-Ford (camino máximo)** +
- +
-El problema de la ruta más larga puede ser transformado en el de ruta más corta cambiando el signo de los costes de los arcos. De manera alternativa se puede transformar también cambiando los procesos de inicialización y relajación. En este caso el problema es inconsistente para circuitos de peso positivo. +
- +
-<code> +
-Inicializar +
-    for cada v perteneciente a V[G] +
-        do d[v] = - infinito +
-            p[v] = nulo +
-    p[s] = 0 +
-Relajación +
-        if d[v] < d[u] + w(u,v) then  +
-            d[v] = d[u] + w(u,v) +
-            p(v) = u +
-</code> +
- +
-Puede encontrar más información en: +
-  * [[wp>Richard_Bellman|Richard E. Bellman]] +
-  * [[http://www.ams.org/profession/prizes-awards/ams-prizes/fulkerson-prize|Delbert Ray Fulkerson prize]] +
-  * Bellman, R. E., On a routing problem, quarterly of //Applied Mathematics//, 16, 87-90, 1958. +
-  * Ford, L. R.Jr., Network Flow Theory, Paper P-923, RAND Corporation, Santa Monica, California, 1956. +
- +
-===algoritmo de Floyd-Warshall=== +
-**//camino mínimo entre todos los pares de nodos//** +
- +
-{{ :floyd_robert_foto.gif?nolink&200Robert W. Floyd|}}**Robert W. Floyd**  nació el 8 de junio de 1936 en Nueva York, es profesor de la Stanford University (B.A. Chicago 1955 B.S. Chicago 1958), y en 1978 fue galardonado con el prestigioso premio A.M. Turing que otorga la ACM para reconocer las contribuciones de naturaleza técnica realizadas a la comunidad informática. El premio le fue concedido por tener una influencia clara en las metodologías para la creación de software eficiente y fiable, y por ayudar a fundar las siguientes áreas de la informática: teoría de análisis sintáctico, semántica de los leguajes de programación, verificación automática de programas, síntesis automática de programas y análisis de algoritmos. +
- +
-Fue uno de los inventores del //[[http://www.ics.uci.edu/~eppstein/161/960130.html|deterministic linear time selection algorithm]]//. También introdujo mejoras en los algoritmos [[wpes>Quicksort|quicksort]] y [[wp>Selection_algorithm|quickselect]]. +
- +
-**algoritmo de Floyd-Warshall (todos los caminos mínimos)** +
- +
-El problema que intenta resolver este algoritmo es el de encontrar el camino más corto entre todos los pares de nodos o vértices de un grafo. Esto es semejante a construir una tabla con todas las distancias mínimas entre pares de ciudades de un mapa, indicando además la ruta a seguir para ir de la primera ciudad a la segunda. Este es uno de los problemas más interesantes que se pueden resolver con algoritmos de grafos. +
- +
-Existen varias soluciones a este problema y los algoritmos a aplicar dependen también de la existencia de arcos con pesos o costes negativos en el grafo. En el caso de no existir pesos negativos, sería posible ejecutar V veces el algoritmo de Dijkstra para el cálculo del camino mínimo, donde V es el número de vértices o nodos del grafo. Esto conllevaría un tiempo de ejecución de O(V^3) (aunque se puede reducir). Si existen arcos con pesos negativos, se puede ejecutar también V veces el Algoritmo de Bellman-Ford, una vez para cada nodo del grafo. Para grafos densos (con muchas conexiones o arcos) esto conllevaría un tiempo de ejecución de O(V^4). +
- +
-El algoritmo de Floyd-Warshall ('All-Pairs-Shortest-Path' - Todos los caminos mínimos) ideado por Floyd en 1962 basándose en un teorema de Warshall también de 1962, usa la metodología de Programación Dinámica para resolver el problema. Éste puede resolver el problema con pesos negativos y tiempos de ejecución iguales a O(V^33); sin embargo, para ciclos de peso negativo el algoritmo tiene problemas. A continuación se muestra el pseudocódigo del algoritmo: +
- +
-<code> +
-Floyd-Warshall (G) +
- +
-Inicializar +
-    D = A ' matriz de distancias = matriz de arcos +
-  +
-    si i=j o Dij= infinito entonces Pi,j = nulo sino Pi,j=i 'matriz de caminos +
- +
-for k = 1 to V +
-       for i = 1 to V  +
-            for j = 1 to V  +
-                   Di,j = min(Di,j , Di,k + Dk,j )  +
-                        si min = Di,k + Dk,j entonces  +
-                            Pi,j = Pk,j   +
-fin +
-</code> +
- +
-Este algoritmo se puede aplicar a multitud de problemas, incluyendo el diseño de circuitos, el diseño de rutas de transporte, aproximaciones al problema del viajante de comercio, o como base de otros algoritmos más complejos. +
-  * Robert W. Floyd, Algorithm 97 (Shortest Path). Communications of the ACM, 5(6):345, 1962.  +
-  * Stephan Warshall, A theorem on boolean matrices. //Journal of the ACM//, 9(1):11-12, 1962.  +
-  * C. H. Papadimitriou, M. Sideri, On the Floyd-Warshall algorithm for logic programs shows that the Floyd-Warshall algorithm is essentially unique, //J. of Logic Programming//+
- +
-===algoritmo de Kruskal=== +
- +
-**//árbol de coste total mínimo/máximo//** +
- +
-{{ :joseph_b_kruskal_foto.jpg?nolink&200|Joseph B. Kruskal}}**Joseph B. Kruskal** investigador del Math Center (Bell-Labs), que en 1956 descubrió su algoritmo para la resolución del problema del Árbol de coste total mínimo (minimum spanning tree - MST) también llamado árbol recubridor euclídeo mínimo. Este problema es un problema típico de optimización combinatoria, que fue considerado originalmente por Otakar Boruvka (1926) mientras estudiaba la necesidad de electrificación rural en el sur de Moravia en Checoslovaquia. +
- +
-El objetivo del algoritmo de Kruskal es construir un árbol (subgrafo sin ciclos) formado por arcos sucesivamente seleccionados de mínimo peso a partir de un grafo con pesos en los arcos. +
- +
-Un árbol (spanning tree) de un grafo es un subgrafo que contiene todos sus vértices o nodos. Un grafo puede tener múltiples árboles. Por ejemplo, un grafo completo de cuatro nodos (todos relacionados con todos) tendría 16 árboles. +
- +
-La aplicación típica de este problema es el diseño de redes telefónicas. Una empresa con diferentes oficinas, trata de trazar líneas de teléfono para conectarlas unas con otras. La compañía telefónica le ofrece esta interconexión, pero ofrece tarifas diferentes o costes por conectar cada par de oficinas. Cómo conectar entonces las oficinas al mínimo coste total. +
- +
-La formulación del MST también ha sido aplicada para hallar soluciones en diversas áreas (diseño de redes de transporte, diseño de redes de telecomunicaciones - TV por cable, sistemas distribuidos, interpretación de datos climatológicos, visión artificial - análisis de imágenes - extracción de rasgos de parentesco, análisis de clusters y búsqueda de superestructuras de quasar, plegamiento de proteínas, reconocimiento de células cancerosas, y otros). +
- +
-Otra aplicación menos obvia es que el árbol de coste total mínimo puede ser usado como solución aproximada al problema del viajante de comercio (traveling salesman problem), recuerde que encontrar la solución óptima a este problema es NP-Hard. La manera formal de definir este problema es encontrar la trayectoria más corta para visitar cada punto al menos una vez. Nótese que si se visitan todos los puntos exactamente una vez, lo que se tiene es un tipo especial de árbol. En el ejemplo anterior, 12 de los 16 árboles son trayectorias de este tipo. Si se tiene una trayectoria que visita algunos vértices o nodos más de una vez, siempre se puede soltar algunos nodos del árbol. En general el peso del árbol total mínimo es menor que el del viajante de comercio, debido a que su minimización se realiza sobre un conjunto estrictamente mayor. Existen diferentes algoritmos y maneras de usar el árbol de coste total mínimo para encontrar la solución al problema del viajante de comercio (con resultados cercanos al óptimo). +
- +
-**algoritmo de Kruskal (árbol de coste total mínimo)** +
- +
-Dado un grafo G con nodos conectados por arcos con peso (coste o longitud): el peso o coste total de un árbol será la suma de pesos de sus arcos. Obviamente, árboles diferentes tendrán un coste diferente. El problema es entonces ¿cómo encontrar el árbol de coste total mínimo? +
- +
-Una manera de encontrar la solución al problema del árbol de coste total mínimo, es la enumeración completa. Aunque esta forma de resolución es eficaz, no se puede considerar un algoritmo, y además no es nada eficiente. +
- +
-Este problema fue resuelto independientemente por Dijkstra (1959), Kruskal (1956) y Prim (1957) y la existencia de un algoritmo polinomial (que todos ellos demostraron) es una grata sorpresa, debido a que un grafo con N vértices puede llegar a contener NN-2 subárboles. A lo largo de la historia se ha hecho un gran esfuerzo para encontrar un algoritmo rápido para este problema. El algoritmo de Kruskal es uno de los más fáciles de entender y probablemente el mejor para resolver problemas a mano. +
- +
-El algoritmo se basa en una propiedad clave de los árboles que permite estar seguros de si un arco debe pertenecer al árbol o no, y usar esta propiedad para seleccionar cada arco. Nótese en el algoritmo, que siempre que se añade un arco (u,v), éste será siempre la conexión más corta (menor coste) alcanzable desde el nodo u al resto del grafo G. Así que por definición éste deberá ser parte del árbol. +
- +
-Este algoritmo es de tipo greedy, ya que a cada paso, éste selecciona el arco más barato y lo añade al subgrafo. Este tipo de algoritmos pueden no funcionar para resolver otro tipo de problemas, por ejemplo para encontrar la ruta más corta entre los nodos a y b. +
- +
-Para simplificar, se asumirán que existe un único árbol de coste total mínimo, aunque en muchos problemas puede existir más de una solución optima de igual valor total mínimo. +
- +
-A continuación se muestra el pseudocódigo del algoritmo: +
-<code> +
-Kruskal (G) +
-E(1)=0, E(2)= todos los Arcos del grafo G +
-      Mientras E(1) contenga menos de n-1 arcos y E(2)=0 do  +
-         De los arcos de E(2) seleccionar el de menor coste -->e(ij)  +
-         E(2)= E(2) - {e(ij)}  +
-              Si V(i), V(j) no están en el mismo árbol entonces +
-                 juntar los árboles de  V(i) y de V(j) en uno sólo  +
-              end Si +
-      end do  +
-Fin del algoritmo +
-</code> +
- +
-Este problema puede ser resuelto por diferentes algoritmos, e incluso en la actualidad sigue siendo tema de interés en investigaciones. Es interesante la lectura de los siguientes algoritmos (que resuelven este problema para diferentes supuestos), aunque son bastante complejos y probablemente no requiera utilizarlos a no ser que trabaje con grafos de grandes dimensiones: +
- +
-  * Karger, Klein, and Tarjan, A randomized linear-time algorithm to find minimum spanning trees, //J. ACM//, vol. 42, 1995, pp. 321-328. +
-  * Fredman and Willard, Trans-dichotomous algorithms for minimum spanning trees and shortest paths, 31st IEEE Symp. Foundations of //Comp. Sci.//, 1990, pp. 719-725. +
-  * Gabow, Galil, Spencer, and Tarjan, Efficient algorithms for finding minimum spanning trees in undirected and directed graphs. //Combinatorica//, vol. 6, 1986, pp. 109-122. +
- +
-Puede encontrar más información en: +
-  * [[http://cm.bell-labs.com/cm/ms/departments/sia/kruskal/index.html|Kruskal (Bell Labs)]] +
-  * [[http://cm.bell-labs.com/cm/ms/departments/fm/history.html|Historia de la investigación matemática en Bell Labs]]  +
-  * J. B. Kruskal. On the shortest spanning subtree of a graph and the traveling salesman problem. Proc. of the American Mathematical Society, 7:48-50, 1956.  +
-===algoritmo de Prim=== +
- +
-**//árbol de coste total mínimo/máximo//** +
- +
-**Robert Prim** en 1957 descubrió un algoritmo para la resolución del problema del Árbol de coste total mínimo (minimum spanning tree - MST). Este problema es un problema típico de optimización combinatoria, que fue considerado originalmente por Otakar Boruvka en 1926 mientras estudiaba la necesidad de electrificación rural en el sur de Moravia en Checoslovaquia. Este problema también fue resuelto por Joseph B. Kruskal en 1956. +
- +
-En los años 60 estos científicos del Math Center (Bell Labs) fueron los pioneros de la moderna teoría de secuenciación, particularmente en el análisis de algoritmos de aproximación y en secuenciación multiprocesador (Ed Coffman, Ron Graham, David Johnson y Mike Garey). En las siguientes tres décadas, se añadieron multitud de contribuciones que mejoraron la teoría general. +
- +
-El algoritmo de Prim encuentra un árbol de peso total mínimo conectando nodos o vértices con arcos de peso mínimo del grafo sin formar ciclos. +
- +
-Al igual que el algoritmo de Kruskal, el de Prim también ha sido aplicado para hallar soluciones en diversas áreas (diseño de redes de transporte, diseño de redes de telecomunicaciones - TV por cable, sistemas distribuidos, interpretación de datos climatológicos, visión artificial - análisis de imágenes - extracción de rasgos de parentesco, análisis de clusters y búsqueda de superestructuras de quasar, plegamiento de proteínas, reconocimiento de células cancerosas, y otros). También se ha utilizado para encontrar soluciones aproximadas a problemas NP-Hard como el del 'viajante de comercio'+
- +
-**algoritmo de Prim (árbol de coste total mínimo)** +
- +
-Consiste en dividir los nodos de un grafo en dos conjuntos: procesados y no procesados. Al principio, hay un nodo en el conjunto procesado que corresponde a el equipo central; en cada interacción se incrementa el grafo de procesados en un nodo (cuyo arco de conexión es mínimo) hasta llegar a establecer la conexión de todos los nodos del grafo a procesar. A continuación se muestra el pseudocódigo del algoritmo: +
- +
-<code> +
-Prim ( L [1..n , 1..n ]) : 'conjunto de arcos +
- +
-'Inicialización: sólo el nodo 1 se encuentra en B +
- +
-T =NULL 'T contendrá los arcos del árbol de extensión mínima Distmin[1]=-1 +
- +
-para i=2 hasta n hacer  +
-    más_próximo [ i ]=1  +
-    distmin [ i ]=L [ i , 1] +
- +
-para i=1 hasta n -1 hacer  +
-    min=infinito +
- +
-            para j=2 hasta n hacer  +
-                    si 0 <= distmin [ j ] < min entonces  +
-                    min=distmin [ j ]  +
-                    k=j +
- +
-             T=T union {{mas_próximo [ k ], k }}  +
-             distmin [ k ]= -1 'se añade k a B +
- +
-            para j=2 hasta n hacer  +
-                     si L [ j , k ] < distmin [ j ] entonces  +
-                    distmin [ j ]=L [ j , k ]  +
-                    más_próximo [ j ]=k +
- +
-devolver T +
-</code> +
- +
-Algunos trabajos han comparado la eficiencia entre los algoritmos de Kruskal y de Prim: +
- +
-Sea a es el número de arcos y n el número de nodos. El algoritmo de Kruskal requiere un tiempo que está en O(a log n). Para un grafo denso, a tiende a n(n-1)/2, por lo que el algoritmo requiere un tiempo que está en O(n2 log n), y el algoritmo de Prim puede ser mejor O(n2). En un grafo disperso, a tiende a n-1, por lo que el algoritmo de Kruskal requiere un tiempo que está en O(n log n) y el algoritmo de Prim es menos eficiente. Sin embargo, si el algoritmo de Prim se implementa con montículos, el tiempo requerido por este algoritmo está, como el de Kruskal, en O(a log n). +
- +
-  * Si a es aproximadamente igual a n (grafo con pocos arcos) conviene usar Kruskal  +
-  * Si a es aproximadamente igual a n2 (grafo denso) conviene usar Prim +
- +
-En cualquier caso, la complejidad del algoritmo de Kruskal depende de la técnica de ordenación empleada. El algoritmo de Prim requiere más memoria que el algoritmo de Kruskal. Ambos algoritmos son relativamente fáciles de paralelizar. Puede encontrar más información en: +
-  * R.C. Prim, Shortest connection networks and some generalizations, //Bell System Technical Journal//, 36, pp. 1389-1401, 1957. +
- +
- +
-===algoritmo de Ford-Fulkerson=== +
-**//flujo máximo//** +
- +
-Se puede considerar un grafo como una red de flujo. Donde un nodo fuente produce o introduce en la red cierta cantidad de algún tipo de material, y un nodo sumidero lo consume. Cada arco, por tanto, puede considerarse como un conducto que tiene cierta capacidad de flujo. De igual modo que en redes eléctricas (Ley de Kirchhoff), la suma de flujos entrantes a un nodo, debe ser igual a la suma de los salientes (principio de conservación de energía), excepto para el nodo fuente y el nodo sumidero. +
- +
-Por tanto, el problema de flujo máximo se enuncia como: ¿cuál es la tasa a la cual se puede transportar el material desde el nodo fuente al nodo sumidero, sin violar las restricciones de capacidad?. Este algoritmo se puede usar para resolver modelos de: transporte de mercancías (logística de aprovisionamiento y distribución), flujo de gases y líquidos por tuberías, componentes o piezas en líneas de montaje, corriente en redes eléctricas, paquetes de información en redes de comunicaciones, tráfico ferroviario, sistema de regadíos, etc. +
- +
-Una red de flujo es un grafo dirigido G=(V,E) donde cada arco (u,v) perteneciente a E tiene una capacidad no negativa. Se distinguen dos nodos: la fuente o nodo s, y el sumidero o nodo t. Si existen múltiples fuentes y sumideros, el problema se puede simplificar añadiendo una fuente común y un sumidero común. Este algoritmo depende de tres conceptos principales+
-  * Un camino de aumento, es una trayectoria desde el nodo fuente s al nodo sumidero t que puede conducir más flujo. +
-  * La capacidad residual es la capacidad adicional de flujo que un arco puede llevar c_f (u,v) = c(u,v) - f(u,v) +
-  * Teorema de Ford-Fulkerson (1962): En cualquier red, el flujo máximo que fluye de la fuente al destino es igual a la capacidad del corte mínimo que separa a la fuente del destino. +
- +
-El algoritmo es iterativo, se comienza con f(u,v)=0 para cada par de nodos y en cada iteración se incrementa el valor del flujo buscando un camino de aumento. El proceso se repite hasta no encontrar un camino de aumento. A continuación se muestra el pseudocódigo del algoritmo: +
- +
-<code> +
-Ford-Fulkerson (G,s,t) +
- +
-para cada arco (u,v) de E +
- +
-f(u,v) = 0 +
-f(v,u) = 0 +
- +
-mientras exista un camino p desde s a t en la red residual G_f +
- +
-c_f (p) = min {c_f (u,v) : (u,v) está sobre p} +
- +
-para cada arco (u,v) en p +
- +
-f(u,v) = f(u,v) + c_f (p) +
-f(u,v) = -f(u,v) +
-</code> +
- +
-Una variación del algoritmo de Ford-Fulkerson es el algoritmo de Edmonds-Karp (J. Edmonds; R.M. Karp - 1972). En éste, el 'camino de aumento' es elegido usando una búsqueda por niveles o en anchura (breadth-first search). El algoritmo de Edmonds-Karp requiere O(VE2) tiempo de computación, donde V es el número de nodos o vértices, y E el número de arcos del grafo. +
- +
-Puede encontrar más información en: +
- +
-  * Ford, L. R. and Fulkerson, D. R. Flows in Networks. Princeton, NJ. Princeton University Press, 1962. +
-  * Edmonds, J. and Karp, R. M. Theoretical Improvements in Algorithmic Efficiency for Network Flow Problems. //J. ACM// 19, 248-264, 1972. +
-  * Berge, C. Two Theorems in Graph Theory. Proc. Nat. Acad. Sci. USA 43, 842-844, 1957. +
- +
- +
-===problema de transbordo / transporte=== +
-**//a coste mínimo//** +
- +
-En este apartado se comentará la aplicación de la teoría de grafos para la resolución y optimización del flujo en una red. Concretamente se hablará de los Problemas de Suministro y Demanda. +
- +
-Dado un grafo G con vértices o nodos V conectados entre sí y clasificados en dos conjuntos X e Y. Los nodos x se considerarán como elementos de suministro (por ejemplo plantas productivas o proveedores), mientras que los nodos y se entenderán como elementos de demanda (clientes cuya demanda hay que  satisfacer). El objetivo será encontrar el flujo (transporte de mercancías a través de la red) con origen en los nodos x y destino en los y, que satisfaga una serie de restricciones que dependerán del problema particular a resolver. +
- +
-En la literatura, existen multitud de heurísticas y algoritmos optimizadores para resolver algunos de estos casos particulares (por ejemplo una versión especial del Algoritmo Simplex para Programación Lineal llamado Network Simplex Algorithm). Asimismo, también existen generalizaciones del problema ('multiterminal'), o incluso variantes con perdida de flujo en los arcos (por ejemplo la evaporación de agua en canales de riego). +
- +
-En cualquier caso, este tipo de problemas es uno de los más interesantes de la teoría de grafos y de la investigación operativa. Su aplicación es visible y de gran importancia para la resolución de problemas reales en la Dirección de Operaciones y Logística. +
- +
-**problema del transbordo (coste mínimo)** +
- +
-Se puede considerar un grafo como una red de flujo. Donde los nodos proveedor producen o introducen en la red cierta cantidad de algún tipo de material, y los nodos cliente lo consumen. Cada arco, por tanto, puede considerarse como un conducto que tiene cierta capacidad de flujo (mínima y/o máxima) y un coste de transporte por unidad de material. +
- +
-Dado un grafo dirigido G=(V,E) con capacidades c (mínima y/o máxima) no negativas y también con coste de transporte no negativo (expresado por unidad de flujo) para los arcos E. +
- +
-Dado un conjunto de nodos X proveedores (con una capacidad b<0 de suministro), y también un conjunto Y de nodos clientes (con una demanda b>0). En este caso particular, además se consideran nodos de transbordo (con valor de b=0), esto es nodos, que ni aportan ni consumen mercancías y donde éstas simplemente cambian de arco o hacen un transbordo. +
- +
-Además, se exige la condición de continuidad en los nodos. Esto es, la suma de flujos entrantes a un nodo menos la suma de los salientes, debe ser mayor o igual a la capacidad b del nodo. +
- +
-Por tanto, el problema de flujo máximo se enuncia como: ¿cuál es el flujo de transporte de cada arco con el cual se puede transportar el material desde los nodos proveedores a los nodos cliente, sin violar las restricciones de capacidad y continuidad y todo ello minimizando el coste total de transporte?+
- +
-MODELO MILP +
- +
-En el caso de Grafos, este problema se aborda a través del modelado y resolución mediante Programación Lineal. Igualmente, se pueden resolver problemas de: transporte de mercancías (logística de aprovisionamiento y distribución), flujo de gases y líquidos por tuberías, componentes o piezas en líneas de montaje, corriente en redes eléctricas, paquetes de información en redes de comunicaciones, tráfico ferroviario, sistema de regadíos, etc. +
- +
-El problema de transbordo, se puede transformar en un problema clásico de flujo mínimo coste añadiendo un único nodo proveedor s y un único nodo de demanda t (ver Hitchcock-Koopmans, método Out-of-Kilter). Para que dicho problema sea factible, la suma del suministro total debe ser mayor o igual que el total de demanda (equilibrado). +
- +
-**problema del transporte (coste mínimo)** +
- +
-El problema del transporte es un problema de transbordo pero con un grafo dividido G=(S,T,E), con todos los nodos suministradores en S y los de demanda en T. Además, todos los arcos van dirigidos de S a T y no existen nodos de transbordo. +
- +
-El Problema de Asignación es un caso especial del problema de transporte, en el cual hay el mismo número de nodos suministradores que de demanda y los valores de nodos b= ± 1. +
- +
-Puede encontrar más información en: +
-   * Hitchcock, F. L.,The distribution of Product from Several Sources to Numerous Localities, //J. Math. Phys.//, 20, no. 2 (April 1941), 224-30. +
-  * Kuhn, H. W., The Hungarian Method for the Assignment Problem, //Naval Research Logistics Quaterly//, 2, nos. 1 and 2 (1955), 83-97. +
-  * Ford, L. R. and Fulkerson, D. R. Flows in Networks. Princeton, NJ: Princeton University Press, 1962. +
-  * Edmonds, J. and Karp, R. M. Theoretical Improvements in Algorithmic Efficiency for Network Flow Problems. //J. ACM// 19, 248-264, 1972. +
-  * Zadeh. N, A Bad Network Problem for the Simplex Method and other Minimum Cost Flow Algorithms, //Math. Prog.//, 5, no. 3 (December 1973), 255-66. +
-===problema de asignación=== +
-**//a coste mínimo//** +
- +
-El problema de asignación (Assignment Problem), es un problema de complejidad NP-completo. Esto es así, porque el número de posibles soluciones crece O(n^3). +
- +
-El problema de asignación debe su nombre a la aplicación de asignar hombres a trabajos (trabajos a máquinas, o fardos en un contenedor en su variante del problema de la mochila). Esta asignación se hará con la condición de que cada hombre puede ser asignado sólo a un trabajo y que cada trabajo sólo tendrá asignada una persona. Los problemas de asignación presentan una estructura y un proceso de resolución muy similar a los de transporte, pero con dos diferencias: asocian igual número de nodos origen con igual número de nodos de demanda; el valor de oferta en cada nodo origen es de valor uno, como lo es la demanda en cada nodo destino. +
- +
-La condición necesaria y suficiente para que este tipo de problemas tenga solución, es que se encuentre balanceado, es decir, que los recursos totales sean iguales a las demandas totales. Si hay más máquinas que trabajos se formula con desigualdades, y se resuelve con trabajos ficticios. +
- +
-Su aplicación es visible y de gran importancia para la resolución de problemas reales en la Dirección de Operaciones y Logística. Por ejemplo: vehículos a rutas, trabajadores, oficinas al personal, máquinas y tareas, productos a fabricar, agentes comerciales a regiones, etc. +
- +
-**problema de asignación (mínimo coste total)** +
- +
-Este problema es de especial interés ya que una de las preocupaciones de los gerentes de las empresas es la utilización más eficiente de sus recursos escasos. En este caso el problema tratará de asignar un conjunto de recursos limitados a un conjunto de actividades competitivas de la mejor manera posible (óptima). +
- +
-El modelo de asignación es un caso especial del modelo de transporte, en el que los recursos se asignan a las actividades en términos de uno a uno, haciendo notar que la matriz correspondiente debe ser cuadrada. Así entonces cada recurso debe asignarse, de modo único a una actividad particular o asignación. +
- +
-Este problema es fácil de enunciar. Se trata por ejemplo de un conjunto de //n// tareas que se deben asignar de la manera más eficiente posible a otro conjunto de m máquinas. Sea //x_ij// una variable binaria que indica si la tarea //i// se realizará con la máquina //j//. Mientras que //c_ij// representa el coste de dicha asignación, o lo que es lo mismo el de realizar la tarea //i// con la máquina //j//. Cada tarea debe asignarse a una y sólo a una máquina. Cada máquina realizará una y sólo una tarea. El problema es por tanto, decidir el modo en el que deben realizarse todas las asignaciones para minimizar los costos totales. A continuación se muestra el modelo completo del problema: +
- +
-MODELO MILP +
- +
-El problema es lineal porque la función coste a optimizar así como las restricciones pueden ser expresadas como ecuaciones lineales. En el caso de Grafos, este problema se aborda a través del modelo anteriormente expuesto y su resolución mediante Programación Lineal Entera Mixta. El Algoritmo Húngaro de Kuhn (1955) es uno de los más utilizados para resolver este tipo de problemas. +
- +
-Otra estrategia para solucionar este problema además de la PLEM en la literatura existen multitud de estrategias de resolución para este problema: técnicas de aproximación, heurísticas, relajaciones, post-optimizaciones, óptimos locales, enumeración completa, meta-heurísticas y técnicas evolutivas, otras.+
  
-Más información en: +  * [[algoritmo_dijkstra|algoritmo de Dijkstra (camino mínimo)]] 
-  * Kuhn, H. W. (1955). The hungarian method for the assignment problem. //Naval Res. Logistic Quart.// 3, 253-258.+  * [[algoritmo_bellman_ford|algoritmo de Bellman-Ford (camino mínimo)]] 
 +  * [[algoritmo_floyd_warshall|algoritmo de Floyd-Warshall (todos los caminos mínimos)]] 
 +  * [[algoritmo_kruskal|algoritmo de Kruskal (árbol de coste total mínimo)]] 
 +  * [[algoritmo_prim|algoritmo de Prim (árbol de coste total mínimo)]] 
 +  * [[algoritmo_ford_fulkerson|algoritmo de Ford-Fulkerson (flujo máximo)]] 
 +  * [[problema_transbordo_transporte|problema de transbordo/transporte (a coste mínimo)]] 
 +  * [[problema_asignacion|problema de asignación (a coste mínimo)]] 
 +  * problema de localización (a coste mínimo) 
 +  * [[algoritmo_hierholzer|circuito euleriano algoritmo de Hierholzer (próximamente)]] 
 +  * [[problema_tsp|problema del viajante de comercio TSP (distancia total mínima)]] 
 +  * [[problema_mtsp|problema de los m-viajantes de comercio m-TSP (distancia total mínima)]] 
 +  * problema de rutas (paso por nodos seleccionados a coste mínimo) 
 +  * [[problema_cvrp|problema de rutas con vehículos capacitados - CVRP (distancia total mínima)]]
  
-===algoritmo===+Como puede observar Grafos incorpora un buen conjunto de algoritmos, pero el desarrollo sigue. En el futuro se incorporarán más algoritmos de análisis, nuevas funciones de dibujado y edición. Gracias por utilizar Grafos. 
 +====librería de Grafos====
  
 +:-? **DISCULPA LAS MOLESTIAS, EL SERVICIO DE LIBRERÍA DE GRAFOS NO ESTÁ DISPONIBLE**
  
-===algoritmo===+Desde la [[libreria|librería de Grafos]] podrá descargarse grafos de ejemplo para aprender a usar el programa, utilizar en sus clases, etc. Con la última versión de Grafos podrá subir a la nube y compartir con el resto sus mejores grafos.
  
 ---- ----