Dado un 3CNF con cláusulas en las variables . Suponga que tanto como aparecen en la fórmula como máximo veces respectivamente.ϕ1,…,ϕkx1,…,xnxixi¯¯¯¯¯ki
Diseñamos un DAG color cuyos vértices constan de tres partes:G
- Vértices de "asignación" y , , . Colorea con el "color" y con .vi(j)v¯i(j)1≤i≤n1≤j≤kivi(j)xi(j)v¯i(j)xi¯¯¯¯¯(j)
- "Cláusula" vértices , , . Colorea con el color (o ) si (o , resp.) Es el literal -th de la cláusula , y es la cláusula -ésima que contiene este literal.1≤i′≤kj′=1,2,3w i ′ (j′)xi(j) ¯ x i (j) ¯ x i xij′ϕ i ′ jwi′(j′)1≤i′≤kj′=1,2,3wi′(j′)xi(j)xi¯¯¯¯¯(j)xi¯¯¯¯¯xij′ϕi′j
- "Cortar" vértices . Coloréalos con colores distintos a los anterioress=s0,s1,…,sn,sn+1,…sn+k=t
Los bordes incluyen:
- si−1vi(1) , , ;v i ( k i ) s ivi(j)vi(j+1)vi(ki)si
- ˉ v i ( j ) ˉ v i ( j + 1 ) ˉ v i ( k i ) s isi−1v¯i(1) , , ;v¯i(j)v¯i(j+1)v¯i(ki)si
- y , .w i ′ ( j ′ ) s n + i ′sn+i′−1wi′(j′)wi′(j′)sn+i′
Por ejemplo, a partir de 3CNF
se construye el siguiente gráfico (Las direcciones de los bordes son de izquierda a derecha).
(x1∨x2∨x3¯¯¯¯¯)∧(x1∨x2¯¯¯¯¯∨x3)
Ahora bien, no es difícil ver que el original es 3CNF satisfiable si y sólo si hay una - camino con diferentes colores de los vértices en .t GstG
(Por cierto, es un subproducto que la existencia de ruta - con diferentes colores de vértice en DAG coloreado es . No encontré muchas publicaciones sobre este problema en perspectiva computacional. Si ya sabes, por favor comenta!)t NP-hardstNP-hard
Entonces, ¿cuál es la relación entre el problema de y OP? Intuitivamente, lo que vamos a hacer es diseñar una matriz , de modo que cada color se asigne a una fila (que es una persona), y los bordes se asignen a columnas consecutivas (intervalos de tiempo). Por lo tanto, una programación máxima, que básicamente va de izquierda a derecha en la matriz, corresponde a una ruta - .h s tGhst
Nuestra matriz tiene columnas, con índices que comienzan desde . En el siguiente constrcution un son dos valores satisfacen . Las relaciones pueden ser grandes potencias de y . Deje .2 n + 1 + ∑ i 2 k i + k 0 X Y 1 ≪ X ≪ Y X / 1 , Y / X k n K i = 2 i + 2 ∑ i j = 1 k ih2n+1+∑i2ki+k0XY1≪X≪YX/1,Y/XknKi=2i+2∑ij=1ki
- Para cada , , sea (si la coordenada existe, la misma a continuación). 0 ≤ i ≤ n h ( s i , K i ) = h ( s i , K i - k i - 1 ) = h ( s i , K i + k i + 1 + 1 ) = Ysi0≤i≤nh(si,Ki)=h(si,Ki−ki−1)=h(si,Ki+ki+1+1)=Y
- Para cada , sea ; Para cada , dejar que .h ( x i ( j ) , K i - 1 + j ) = X ¯ x i ( j ) h ( ¯ x i ( j ) , K i - 1 + k i + 1 + j ) = Xxi(j)h(xi(j),Ki−1+j)=Xxi¯¯¯¯¯(j)h(xi¯¯¯¯¯(j),Ki−1+ki+1+j)=X
- Para cada , y una literal en la cláusula , sea . 1 ≤ i ′ ≤ k x ϕ i ′ h ( x , K n + i ′ ) = 1ϕi′1≤i′≤kxϕi′h(x,Kn+i′)=1
- Todas las otras entradas son 0.
Por ejemplo, para el gráfico de ejemplo anterior, la matriz correspondiente es
Ahora afirmamos: el 3CNF original es satisfactoria si y solo si el valor máximo es .(2n+1)Y+∑ikiX+k
Considere la programación logrando el valor máximo. Como hay exactamente columnas en contienen , todas deberían estar cubiertas. Para la columna que tiene dos opciones de , suponga que la programación la asigna a . Como la columna debe asignarse a , por la consecutividad tenemos que perder las columnas a . Lo mismo sucede si la programación asigna la columna a .h Y K i + k i + 1 Y s i K i s i K i + 1 K i + k i K i + k i + 1 s i + 1(2n+1)hYKi+ki+1YsiKisiKi+1Ki+kiKi+ki+1si+1
Por lo tanto, para tener el valor , debemos seleccionar todas las disponibles en la matriz, que corresponde a una asignación de variables. Por lo tanto, el valor de reposo de es alcanzable si y solo si la asignación satisface cada cláusula.X k∑ikiXXk
Como conclusión, la decisión del valor máximo de una programación legal se encuentra en . Quizás es por eso que todos nuestros intentos anteriores de encontrar un algoritmo fallaron.NP-hard
Esta solución tiene problemas y se eliminará pronto; ver el comentario de templatetypedef.
Puede resolver esto en tiempo polinómico usando flujo de costo mínimo . A continuación, todos los bordes tienen capacidad unitaria.
Un flujo de costo mínimo en esta red tendrá un costo total igual al negativo del mejor beneficio posible. (Este costo será negativo, pero eso no es un problema). Existe una solución integral óptima en la que cada persona tiene un borde único que deja con un flujo de 1 y un borde único que llega a con un flujo de 1, y todas las demás aristas incidentes a ambos o tienen 0 flujo. Deje que estos bordes de flujo-1 para la persona sean y : luego , ya que las únicas rutas entre -vertices son aquellas que aumentan el subíndice. SiS i t ii si ti t i i s i v j v k t i k ≥ j v k = j i i j + 1 , … , ksi ti i sivj vkti k≥j v k=j , entonces a la persona se le asignan franjas horarias; de lo contrario, a la persona se le asigna el bloque de intervalos de tiempo .i i j+1,…,k
Intuitivamente, cada persona "obtiene" 1 unidad de flujo de elige un tiempo de inicio (borde) y un tiempo de finalización (borde); estos bordes iniciales y finales son los únicos bordes con un costo distinto de cero en la red, y podemos representar el valor de un bloque como la diferencia de dos sumas de prefijos. Las capacidades de la unidad en los bordes entre los -vertices actúan para evitar que 2 personas usen el mismo intervalo de tiempo.j + 1 , … , k vs j+1,…,k v
Curiosamente, esta formulación funcionará incluso si los valores pueden ser negativos.h(i,j)
fuente