2012-05-13 18 views
5

Pregunta: Los problemas de circulación le permiten tener un límite inferior y un límite superior en el flujo a través de un arco en particular. El límite superior lo entiendo (como las tuberías, hay tantas cosas que pueden pasar). Sin embargo, estoy teniendo dificultades para entender la idea del límite inferior. Qué significa eso? ¿Algún algoritmo para resolver el problema ...¿Qué significa el "límite inferior" en los problemas de circulación?

  • intenta asegurarse de que cada arco con un límite inferior obtenga al menos ese flujo, fallando completamente si no puede encontrar la manera?
  • ¿simplemente descartar el arco si el límite inferior no se puede cumplir? Esto haría más sentido para mí, pero significaría que podría haber arcos con un flujo de 0 en la gráfica resultante, es decir lower ≤ f ≤ upper v f = 0

Contexto: Estoy tratando de encontrar una manera de programar rápidamente un conjunto de eventos, que tienen una longitud y un conjunto de posibles horarios en los que pueden programarse. Estoy tratando de reducir este problema a un problema de circulación, para el cual existen algoritmos eficientes.

Pongo cada evento en un gráfico dirigido como un nodo, y le proporciono la cantidad de ranuras de tiempo que debe llenar. Luego añadir todos los posibles tiempos como nodos, así, y finalmente todos los intervalos de tiempo, como esto (todos los arcos apuntan a la derecha):

 

My graph

 

El los primeros dos eventos tienen un único tiempo posible y una longitud de 1, y el último evento tiene una duración de 4 y dos veces posibles.

¿Tiene sentido este gráfico? Más específicamente, ¿la cantidad de espacios de tiempo que se "llenan" será de 2 (solo los "fáciles") o seis, como en la imagen?

(estoy usando un algoritmo de push-reetiquetado de la biblioteca LEMON si hay alguna diferencia.)

+1

fyi: el flujo máximo es un problema de circulación especial donde el límite inferior es cero. Ellos no son lo mismo. – KillianDS

+0

Se ha eliminado la etiqueta. ¡Gracias! –

+1

Los límites inferiores podrían significar que el usuario necesita que exista al menos un flujo X en una tubería para que sea útil para ellos. Por ejemplo, si estaban tratando de impulsar algo del flujo? Piensa en molinos de agua o bombillas o algo así. (Así es como funciona en mi cabeza de todos modos.) – Helen

Respuesta

4

En cuanto al problema de circulación general:

Estoy de acuerdo con @Helen; aunque no sea tan intuitivo concebir un uso práctico de un límite inferior, es una restricción que debe cumplir. No creo que puedas descartar esta restricción, incluso cuando ese flujo sea cero.

El caso de flujo = 0 se apega al problema de flujo máximo más intuitivo (como lo señala @KillianDS). En ese caso, si el flujo entre un par de nodos es cero, entonces pueden no afectan a la "conservación de la suma de flujo": enter image description here

Cuando no hay límite inferior se da a continuación (flujos suponiendo son no negativo) un cero no puede fluir influir en el resultado, porque

  1. no puede introducir una violación a las restricciones
  2. no puede influir en la suma (ya que añade un término cero).

Un ejemplo práctico de un flujo mínimo podría existir debido a alguna restricción externa (un problema asociado requiere que al menos X agua atraviese una tubería determinada, como lo señala @Helen). Las restricciones de límite inferior también podrían surgir de un problema dual equivalente, que minimiza el flujo de tal manera que ciertos bordes tienen un límite inferior (y encuentra un equivalente óptimo a un problema de maximización con un límite superior).

Para su problema específico:

Parece que usted está tratando de obtener la mayor cantidad de eventos realizados en un conjunto fijo de intervalos de tiempo (en los que no hay dos eventos pueden superponerse en un intervalo de tiempo).

Considere los conjuntos de intervalos de tiempo que pueden ser asignados a un determinado evento:

E1 - {09:10}
E2 - {09:00}
E3 - {9 : 20, 9:30, 9:40, 9:50}
E3 - {9:00, 9:10, 9:20, 9:30}

Así que usted quiere maximizar el número de tareas asignadas (es decir, eventos incidentales a los bordes que se activan) st los conjuntos resultantes son disjuntos por parejas (es decir, ninguno de los solados de tiempo asignados se superponen).

Creo que esto es NP-Hard porque si pudieras resolver esto, podrías usarlo para resolver el maximal set packing problem (es decir, el empaquetado de conjunto máximo se reduce a esto). Su problema puede resolverse con programación lineal entera, pero en la práctica estos problemas también se pueden resolver muy bien con métodos codiciosos/branch y bound.

Por ejemplo, en su problema de ejemplo. evento E1 "conflictos" con E3 y E2 entra en conflicto con E3. Si se asigna E1 (solo hay una opción), solo hay una posible asignación restante de E3 (la última asignación). Si esta asignación se toma para E3, solo hay una asignación restante para E2. Además, los subgrafos disjuntos (conjuntos de eventos que no pueden entrar en conflicto por los recursos) se pueden resolver por separado.

Si fuera yo, comenzaría con una solución codiciosa muy simple (asignar tareas con menos "ranuras" posibles primero), y luego usar eso como semilla para una sucursal y un solucionador obligado (si la solución codiciosa encontró 4 asignaciones de tareas, luego vinculadas si el subárbol recursivo de asignaciones no puede exceder 3). Incluso podría exprimir algo de rendimiento extra al crear el gráfico de intersecciones por pares entre los conjuntos y solo informar a los conjuntos adyacentes cuando se realiza una asignación. También puede actualizar su mejor número de asignaciones a medida que continúa la sucursal y el límite (creo que esto es normal), por lo que si tiene suerte al principio, converge rápidamente.

He utilizado esta misma idea para encontrar el conjunto más pequeño de proteínas que explicaría un conjunto de péptidos identificados (piezas de proteínas), y me pareció más que suficiente para problemas prácticos. Es un problema muy similar.

Si necesita una hemorragia rendimiento de borde: Cuando reformulada, la programación lineal entera puede hacer casi cualquier variante de este problema que se desea. Por supuesto, en muy malos casos puede ser lento (en la práctica, probablemente te funcione, especialmente si tu gráfica no está muy densamente conectada). Si no lo hace, las relajaciones regulares de programación lineal se aproximan a la solución del ILP y generalmente son bastante buenas para este tipo de problema.

Espero que esto ayude.

+0

¡Gracias por la respuesta completa y clara! Tenía la sensación de que esto sería NP-difícil ... Sin embargo, no entiendo completamente cuál sería una aproximación de la solución. ¿Una solución en la que no todos los eventos tienen un tiempo? ¿Una solución en la que algunos eventos tienen múltiples oportunidades? Esos serían inútiles. –

+0

@WanderNauta :) Hay dos tipos de soluciones aproximadas (terminan siendo similares al final). Uno hace una búsqueda codiciosa y luego una rama y límite imperfecto, que se detiene después de un cierto tiempo, y por lo tanto no intenta * cada * subárbol (la rama verdadera y el límite son exactos). La otra solución es escribir el problema como ILP, y luego usar una aproximación LP a ILP. max E1 + E2 + E3 s.t. todos Ei en {0,1}, E1 <= su número de asignaciones de borde, # asignaciones de borde para cada intervalo de tiempo en {0,1}, etc. Básicamente se resolvería esto w/LP (variables de constricción en [0, 1] en lugar de {0,1}, etc.). Cualquier solución distinta de cero var = 1. – user

+0

@WanderNauta Pero, en realidad, en general, pruebe branch y bound primero. Puede codificar uno recursivo rápido bastante rápido, y para muchos, muchos gráficos hará un gran trabajo (especialmente si se siembra con una buena búsqueda codiciosa). – user

1

El límite inferior en el flujo de un arco es una restricción difícil. Si las restricciones no se pueden cumplir, entonces el algoritmo falla. En tu caso, definitivamente no se pueden cumplir.

Su problema no puede modelarse con un modelo de flujo de red puro, incluso con límites inferiores. Está intentando obtener la restricción de que un flujo es 0 o al menos un límite inferior. Eso requiere variables enteras. Sin embargo, el paquete LEMON tiene un interface donde puede agregar restricciones enteras. El flujo de salida de cada una de la primera capa de arcos debe ser 0 o n, donde n es el número de intervalos de tiempo requeridos o se podría decir que, como máximo, un arco de cada "evento" tiene un flujo distinto de cero.

Tu "disyunción" restricción, lower ≤ f ≤ upper v f = 0 se puede modelar como

f >= y * lower 
f <= y * upper 

con Y limitado a ser 0 o 1. Si y es 0, entonces f sólo puede ser 0. Si y es 1, el f puede ser cualquier valor entre inferior y superior. Los algoritmos de programación de enteros mixtos tendrán órdenes de magnitud más lentos que los algoritmos de flujo de red, pero modelarán su problema.

+0

Gracias! Buscaré en la interfaz LP. –

Cuestiones relacionadas