Flujo máximo incremental en gráficos dinámicos

12

Estoy buscando un algoritmo rápido para calcular el flujo máximo en gráficos dinámicos. es decir, considerando un gráfico y s , t V tenemos máximo flujo F en G de s a la t . Entonces nuevo / viejo nodo u añadido / borrado con sus correspondientes bordes para formar un gráfico G 1 . ¿Qué es un flujo máximo en un gráfico recién creado? ¿Hay alguna manera de evitar recalcular el flujo máximo?G=(V,E)s,tVFGstuG1

Se aprecia cualquier preprocesamiento que no consuma mucho tiempo / memoria.

La idea más simple es volver a calcular el flujo.

Otra idea simple es la siguiente: guardar todas las rutas de aumento que se usaron en el cálculo de flujo máximo anterior, para agregar un vértice , podemos encontrar rutas simples (en el gráfico de capacidad actualizado por paso anterior) que comienzan desde la fuente, van a la v y luego van al destino, pero el problema es que este camino debería ser simple, no pude encontrar mejor que O ( n m ) para este caso, para m = | E | . (También tenga en cuenta que si solo se tratara de una ruta, esto podría hacerse en O ( n + m ) pero no es así).vvO(nm)m=|E|O(n+m)

También para eliminar el nodo anterior la idea no funciona.

También ya vi documentos como el enfoque incremental para bordes , pero parece que no son lo suficientemente buenos en este caso, es más que para cada borde y parece que no es una extensión adecuada en este caso (simplemente recalculamos un flujo). También actualmente estoy usando el algoritmo de flujo máximo de Ford-Fulkerson. Si hay una mejor opción para los algoritmos en línea, es bueno saberlo.O(m)

Saeed
fuente
¿Podría por favor aclarar parte "pero el problema es que esta ruta debería ser simple"? No lo entendí.
Dmytro Korduban
@ maldini.ua, de hecho, la ruta que va de la fuente a y luego la ruta de v al destino no debería tener un vértice común (excepto v ). Suponga que v es un nuevo nodo agregado. Si no fuera así, podemos omitir algunas comprobaciones y podemos tener un algoritmo más rápido (en promedio, o puede ser asintótico). vvvv
Saeed
Lo tengo, pero en cuanto a mí, no es algo especial sobre . Creo que la idea de recálculo más simple es la siguiente: 1) agregar un nuevo vértice con bordes al gráfico residual ; 2) encuentre el flujo máximo en el gráfico residual actualizado utilizando un algoritmo de flujo máximo de su elección. El caso que sugirió será procesado "automáticamente" por el algoritmo de flujo máximo (por ejemplo, no encontrará ninguna ruta de aumento, etc.). Si está interesado en eliminar nodos, puedo escribirlo en respuesta. PD: Para ser claros, ¿tienes un gráfico dirigido o no dirigido? v
Dmytro Korduban
@ maldini.ua, agrega recalculación normal complejidad a la solución actual, por lo que no creo que sea bueno (puede ser bueno sabiendo que normalmente demasiados bordes son inútiles y, de hecho, no causa un problema de rendimiento muy alto), pero si tiene idea de eliminar nodo, me interesa ver tu idea, también se dirige el gráfico. PD: pero estoy interesado en ambos casos. |G|
Saeed
Recuerde que lo ejecuta en el gráfico residual, debe haber muchos bordes de capacidad cero en este momento. Por lo general, funciona bastante rápido, especialmente en gráficos dispersos (al menos funcionó para mí). Por otro lado, el enfoque de "camino simple" me suena un poco a una sofisticación adicional. Además, no olvide que tiene limitado en el tiempo de ejecución del Ford-Fulkerson (donde | f | está limitado por la suma de las capacidades de los bordes adyacentes de v ). O(|f||E|)|f|v
Dmytro Korduban

Respuestas:

6

El enfoque descrito puede no ser teóricamente óptimo. Es solo una solución práctica simple que puede funcionar para el autor. No puedo proporcionar ninguna referencia porque siempre pensé que es un folklore ampliamente conocido, pero, curiosamente, nadie lo publicó en la respuesta. Entonces lo hago.

Supongamos que tenemos una red no dirigida . Suponga que está almacenado en una estructura de datos que permite inserciones / eliminaciones de vértices / arcos fáciles. A veces usaremos la red residual G f (es decir, con capacidades actualizadas c f = c - f ).G=(V,E,c)Gfcf=cf

La primera parte es cómo procesar inserciones / eliminaciones de vértices. Es más o menos sencillo para las inserciones:

  1. Agregue un nuevo vértice con los bordes correspondientes a la red residual.
  2. Encuentre un flujo máximo en la red residual actualizada utilizando un algoritmo de flujo máximo de su elección.

Para las eliminaciones las cosas se volvieron más complicadas. Imaginemos que dividimos el vértice estamos a punto de eliminar en 2 mitades V i n y V o U t tal que todos en-arcos puntos a v i n , todos fuera arcos va de V o U t y este nuevo vértices están conectados por un arco de capacidad infinita. Entonces, la eliminación de v es equivalente a la eliminación del arco entre v i n y v o u t . ¿Qué pasará en este caso? Vamos a denotar por f vvvinvoutvinvoutvvinvoutfvel flujo que pasa por el vértice . Entonces v i n experimentará el exceso de f v unidades de flujo y V o U t experimentarán escasez de f v unidades de flujo justo después de su eliminación (las restricciones de flujo serán obviamente rotos). Para que las restricciones de flujo se mantengan nuevamente, debemos reorganizar los flujos, pero también queremos mantener el valor del flujo original lo más alto posible. Veamos primero si podemos reorganizar sin disminuir el flujo total. Para verificar eso, encuentre un flujo máximo ~ f v de v i n a v o uvvinfvvoutfvfv~vin en la red residual "cortada" (es decir, sin el arco que conecta v i n y v o u t ). Deberíamos limitarlo por f v obviamente. Si resulta ser igual a f v, entonces tenemos suerte: hemos reasignado el flujo que pasaba porvde tal manera que no se modificó el flujo total. En el otro caso, el flujo total debe reducirse en exceso "inútil" deunidadesΔ= f v - ~ f v . Para hacer eso, Conecte temporalmentesytvoutvinvoutfvfvvΔ=fvfv~stmediante un arco de capacidad infinita y ejecute el algoritmo maxflow nuevamente de a v o u t (debemos unir el flujo por Δ ). Eso arreglará la red residual y hará que las restricciones de flujo se mantengan nuevamente, disminuyendo automáticamente el flujo total en Δ .vinvoutΔΔ

La complejidad temporal de tales actualizaciones puede depender del algoritmo de maxflow que usemos. Sin embargo, los peores casos pueden ser bastante malos, pero aún así es mejor que el recálculo total.

La segunda parte es qué algoritmo maxflow usar. Hasta donde entiendo, el autor no necesita un algoritmo muy complejo (pero aún eficiente) con una pequeña constante oculta para ejecutarlo en una plataforma móvil. Su primera elección de Ford-Fulkerson (espero que sea Edmonds-Karp ) no se ve muy mal desde este punto de vista. Pero hay algunas otras posibilidades. El que recomendaría probar primero es la variante del algoritmo de Dinic porque es bastante rápido en la práctica y se puede implementar de una manera muy simple. Otras opciones pueden incluir el escalado de capacidad de Ford-Fulkerson en O ( | E |O(|V|2|E|) y, después de todo, diferentes versiones de push-relabel con heurística. De todos modos, el rendimiento dependerá de un caso de uso, por lo que el autor debe encontrar el mejor empíricamente.O(|E|2logCmax)

Dmytro Korduban
fuente
Después de leer la última respuesta de vzn, he encontrado el enfoque similar descrito en la página 90 de este .
Dmytro Korduban
fv~fvfv~Δ
vucf(v,u)cf(u,v)f(v,u)=f(u,v)
¿Alguna idea de cómo haría esto si desea cambiar una capacidad de borde?
Chet
-1

Ok, teniendo en cuenta la nueva información y evitando algunos trucos de inicio falso falso / referencias de arenque rojo (mea culpa), aquí hay algunas referencias nuevas sobre esto.

Solución rápida de una secuencia en línea de problemas de flujo máximo con extensiones para calcular cortes mínimos robustos Doug Altner y Özlem Ergun

esta referencia considera secuencias en línea de MFP y "arranques en caliente", es decir, construyendo sobre cambios incrementales a un MFP anterior. "Demostramos que nuestros algoritmos reducen el tiempo de ejecución en un orden de magnitud cuando se comparan códigos similares que usan un solucionador MFP de caja negra. En particular, mostramos que nuestro algoritmo para cortes mínimos robustos puede resolver instancias en segundos que requerirían más de cuatro horas usando un solucionador de flujo máximo de caja negra ".


avances en problemas que involucran flujos máximos Altner, Douglas S., georgia tech

En esta tesis doctoral de 2008 (pdf descargable), el autor considera el problema de agregar arcos de forma incremental que parece estar "lo suficientemente cerca" del problema de agregar nuevos vértices (con múltiples arcos nuevos).

Gran parte de esta referencia está relacionada con la eliminación de partes de la red (cortes / "interdicción") como se indica en la primera parte del resumen.

ver esp "IV SOLUCIÓN DE SECUENCIAS EN LÍNEA DE FLUJOS MÁXIMOS....... p63".

p 63 "Sin embargo, el objetivo de este capítulo es convencer al lector de que el uso iterativo de un solucionador de flujo máximo de caja negra para resolver una gran secuencia de dispositivos multifunción puede conducir a una enorme cantidad de cálculos innecesarios".

p66 "En las aplicaciones mencionadas anteriormente, las MFP son típicamente topológicamente similares. Es decir, la siguiente MFP en la secuencia difiere de la anterior al agregar o eliminar un pequeño número de arcos o al cambiar previsiblemente las capacidades de un conjunto de arcos localizados. Además , cuando se resuelven estas instancias, el tiempo y el espacio necesarios para almacenar cualquier cosa más allá de la solución del problema anterior generalmente no se justifica ".

El autor de p67 también utiliza el enfoque de "inicio en caliente" aquí. "Una estrategia efectiva para resolver rápidamente una secuencia completa en línea de problemas de optimización es desarrollar heurísticas de reoptimización eficientes. Para este fin, desarrollamos un algoritmo de flujo máximo modificado que está diseñado para arranques en caliente eficientes".

vea esp p71 que tiene el problema incremental específico del nuevo arco:

Nuevo problema de reoptimización de flujo máximo de arco (NAMFRP)

el autor considera los problemas más generales p67

Problema de reoptimización de flujo máximo (MFROP)
Problema de reoptimización de arco único de flujo máximo (MFSAROP)

vzn
fuente
-3

de alguna búsqueda rápida parece que la versión en línea es un área de investigación activa. no menciona el área de aplicación que podría ayudar a reducir la búsqueda de literatura. Una opción es buscar un área de aplicación donde haya más o la última innovación. por lo tanto, hay alguna aplicación de flujo máximo incremental en sistemas de visión y algunos algoritmos para ello allí; pruebe los flujos máximos por amplitud de búsqueda primero en los laboratorios de investigación de microsoft. Parafraseando la introducción de este artículo, aparentemente para los casos de visión, el algoritmo de Boykov y Kolmogorov funciona bien y no hay contraejemplos de tiempo exponencial conocidos, aunque fuera de las aplicaciones de visión podría funcionar mal. Por lo tanto, podría valer la pena probar el algoritmo B&K en sus datos y ver cómo funciona y

Parece que está diciendo que un algoritmo incremental que es lineal en el número de bordes del gráfico no es suficiente velocidad? ¿Pero no es esa eficiencia bastante alta? ¿Con cuántas aristas estás tratando? quizás el enfoque podría ser disminuir el costo de atravesar el gráfico si eso es costoso o un factor significativo (por ejemplo, gráfico almacenado en db frente a gráfico almacenado en la memoria)

Aquí hay un artículo interesante que argumenta que mientras el algoritmo no incremental para flujo máximo está en P, la versión incremental es NP completa. "Hasta donde sabemos, nuestros resultados son los primeros en encontrar un problema de tiempo P cuya versión incremental es NP completa".

Flujo incremental de Hartline, Sharp

vzn
fuente
Gracias, no leí sus documentos de referencia, los echaré un vistazo (veo algunos documentos antes y los encontré inútiles), pero sobre mi área problemática, es un problema en una situación de trabajo real en el mercado de valores. Es un poco complicado decir lo que sucedió cuando descubrí que debería resolver este problema. De hecho, no pensé que fuera difícil a primera vista, pero después de probar un código, veo que no es tan fácil. este algoritmo se ejecutará en teléfonos móviles, no son tan rápidos (y a los clientes no les gusta mi algoritmo :). También a veces vendrán demasiados bordes con un nuevo nodo. Y esto es un cuello de botella.
Saeed
interesante. Parece que probablemente deberías elegir heurísticas basadas en una potencia de procesamiento limitada y la necesidad de actualizaciones rápidas. ¿se puede mover el procesamiento del "cliente" (en su caso, aparentemente los teléfonos) al servidor? ¿Cada cliente tiene que calcular una versión diferente (es decir, datos diferentes) del problema?
vzn
En Irán, el mayor problema es la velocidad de conexión a Internet, por lo que no puedo moverlo al lado del servidor. Si estaba bien (buena velocidad), seguro que volver a calcular no sería malo.
Saeed
66
No veo cómo esto responde a la pregunta original, que se trata de un gráfico que evoluciona con el tiempo mediante la adición de nodos y bordes. El primer artículo describe un algoritmo incremental para el problema estándar de flujo máximo de un disparo. El segundo documento describe un documento para un problema diferente de "flujo máximo incremental", donde el conjunto de bordes es fijo pero sus capacidades crecen con el tiempo.
Jeffε
1
@ Jɛ ff E, sí, tienes razón :) de hecho, antes de eso veo documentos similares a los documentos referenciados, pero como dijiste que no están relacionados con mi problema, el papel más cercano que veo hasta ahora es lo que hice referencia.
Saeed
-5

Otra posibilidad / dirección es el algoritmo de flujo máximo push-relabel que es "uno de los algoritmos más eficientes para el flujo máximo" y puede tener mejores perfiles de complejidad dependiendo de sus datos. por ejemplo, como dice la página de wikipedia

O(V3)O(V2EO(VElog(V2/E))

vzn
fuente
3
Nuevamente, no veo cómo esta respuesta es relevante para la pregunta publicada. Push-relabel es una conocida estrategia de libro de texto para responder al problema estándar de flujo máximo.
Jeff
entonces es Ford Fulkerson ... ¿verdad? & OP pide algo mejor. ¿Sabes algo que pruebe que push-relabel es peor que ford-fulkerson? no está claro que OP esté familiarizado con push-relabel. Dios, el algoritmo que aparece en el libro de texto ciertamente no es un criterio inmediato para rechazar la respuesta aquí, ¿verdad?
vzn
3
Actualmente, si; Las preguntas que se responden en los libros de texto estándar (o wikipedia) no son de nivel de investigación. Sin embargo, la primera pregunta publicada sobre flujos incrementales es interesante y definitivamente tiene alcance. (La falta de respuestas definitivas sugiere que la respuesta correcta puede ser "Buena pregunta. Nadie lo sabe")
Jeffs
vzn, gracias por tu contribución, pero: "¿sabes algo que demuestre que push-relabel es peor que ford-fulkerson" no es una buena razón para publicarlo como respuesta, si sabes por qué es mejor "push-relabel" en algoritmos en línea que Ford-Falkerson es bueno decirlo, personalmente me gusta Ford-Falkerson por simplicidad, bajo factor constante, y lo sé del pasado. Pero como dije, no podría decir que es una buena opción en todos los casos, también estos algoritmos no son simplemente comparables, sino que necesitan pruebas prácticas.
Saeed
mire, el punto es que si tiene un algoritmo de flujo máximo que no funciona bien para sus datos, intente con otro, especialmente uno que se dice que funciona bien porque hay algunos optimizados para diferentes perfiles de datos. no, no está en línea / "vértice incremental", pero podría funcionar mejor para el caso fuera de línea si no hay otra alternativa. las versiones en línea, mientras existan, como encontré anteriormente, probablemente serán significativamente difíciles de implementar ...
vzn