Dimensione minima di contrarre un DAG in un nuovo DAG


15

Abbiamo un DAG. Abbiamo una funzione sui nodi F:VN (parlando liberamente, contiamo i nodi). Vorremmo creare un nuovo grafico diretto con queste regole:

  1. Solo i nodi con lo stesso numero possono essere contratti nello stesso nuovo nodo. . (Tuttavia, .)F(x)F(y)xyxyF(x)F(y)
  2. Aggiungiamo tutti i bordi vecchi tra i nuovi nodi: (x,y)Exy(x,y)E .
  3. Questo nuovo grafico è ancora un DAG.

Qual è il minimo |V|? Che cos'è un algoritmo che crea un nuovo grafico minimo?


1
Quindi il problema decisionale sembra essere: dato un DAG color vertice e un intero , decidere se esiste un DAG con al massimo vertici formati contraendo vertici con lo stesso colore. kk
András Salamon,

1
Se si contraggono due nodi collegati, si ottiene un self-loop proibito?
Yuval Filmus,

1
No. Leggi 2. di nuovo: aggiungiamo il bordo solo se i due nodi dopo la contrazione sono ancora diversi. Se due nodi si contraggono in uno, non aggiungeremo il limite.
chx,

1
@chx Stai chiedendo "minimo" o "minimo"?
Realz Slaw,

1
puoi dare qualche motivazione / bkg?
vzn

Risposte:


5

Un approccio per risolvere questo problema sarebbe quello di utilizzare la programmazione lineare intera (ILP). Affrontiamo la versione decisionale del problema: dato , c'è un modo per contrarre vertici dello stesso colore per ottenere un DAG di dimensioni k ?kk

Questo può essere espresso come un'istanza ILP usando tecniche standard. Ci viene dato il colore di ciascun vertice nel grafico originale. Suggerisco di etichettare ogni vertice con un'etichetta in ; tutti i vertici con la stessa etichetta e lo stesso colore verranno contratti. Quindi, il problema decisionale diventa: esiste un'etichettatura, tale che contrarre tutti i vertici dello stesso colore dello stesso colore produce un DAG?{1,2,,k}

Per esprimerlo come un programma lineare intero, introdurre una variabile intera per ciascun vertice v , per rappresentare l'etichetta sul vertice v . Aggiungi la disuguaglianza 1 vk .vvv1vk

Il passaggio successivo consiste nell'esprimere il requisito secondo cui il grafico contrattato deve essere un DAG. Si noti che se esiste un'etichettatura del modulo sopra elencato, senza perdita di generalità esiste una tale etichettatura in cui le etichette inducono un ordinamento topologico sul grafico contratto (cioè, se precede w nel grafico contratto, quindi l'etichetta v è più piccolo dell'etichetta di w ). Quindi, per ogni bordo v w nel grafico originale, aggiungeremo il vincolo che v e w abbiano la stessa etichetta e lo stesso colore, altrimenti l'etichetta v è più piccola dell'etichetta w . In particolare, per ciascun bordo vvwvwvwvwvw nel grafico iniziale in cui v , w ha lo stesso colore, aggiungere la disuguaglianzavw . Per ogni bordo v w dove v , w hanno colori diversi, aggiungere la disuguaglianzav < w .vwv,wvwvwv,wv<w

Ora vedi se esiste una soluzione fattibile per questo programma lineare intero. Ci sarà una soluzione fattibile se e solo se l'etichettatura è nella forma desiderata (cioè, contrarre tutti i vertici dello stesso colore dello stesso colore produce un DAG). In altre parole, ci sarà una soluzione fattibile se e solo se c'è un modo per contrarre il grafico originale su un DAG di dimensioni . Possiamo usare qualsiasi risolutore di programmazione lineare intero; se il risolutore ILP ci dà una risposta, abbiamo una risposta al problema decisionale originale.k

Naturalmente, questo non è garantito per il completamento in tempo polinomiale. Non ci sono garanzie Tuttavia, i solutori di ILP sono diventati piuttosto buoni. Mi aspetto che, per un grafico di dimensioni ragionevoli, si abbia una buona possibilità che un risolutore di ILP sia in grado di risolvere questo problema in un ragionevole lasso di tempo.

È anche possibile codificarlo come istanza SAT e utilizzare un solutore SAT. Non so se sarebbe più efficace. La versione ILP è probabilmente più facile da pensare, però.

(Spero che sia giusto. Non ho controllato attentamente ogni dettaglio, quindi per favore ricontrolla il mio ragionamento! Spero di non essere andato storto da qualche parte.)


Aggiornamento (10/21): sembra che gli ILP di questo modulo possano essere risolti in tempo lineare, elaborando il DAG in ordine topologicamente ordinato e tenendo traccia del limite inferiore sull'etichetta per ciascun vertice. Questo mi fa sospettare della mia soluzione: ho fatto un errore da qualche parte?


Grazie per la risposta dettagliata! Ottengo le restrizioni e sembrano ragionevoli. Tuttavia, anche se non sono esperto di ILP, ho pensato che la programmazione lineare intera avesse bisogno di una funzione che volevi massimizzare (o minimizzare) e non la vedo da nessuna parte. Ho controllato solo su Wikipedia, quindi potrei sbagliarmi.
chx,

@chx, sto usando ILP per testare la fattibilità dei vincoli. Questo può essere fatto chiedendo al risolutore di ILP di massimizzare qualsiasi funzione obiettiva che ti piace (ad esempio, massimizzare 0), e quindi ignorare il valore della funzione obiettivo e solo cercando di vedere se l'ILP è fattibile o meno. O il solutore ILP risponde "Non realizzabile" (il che significa che non esiste un DAG contrattato di dimensioni ) oppure risponde "Fattibile" e fornisce il miglior valore della funzione obiettiva che potrebbe trovare; in quel caso ignori il valore della funzione obiettivo (e sai che esiste un DAG di dimensioni k ). kk
DW

Vedi, ad esempio, engineering.purdue.edu/~engelb/abe565/… ("Voglio solo sapere se esiste o meno una soluzione fattibile .")
DW

Per quanto riguarda la soluzione del tempo lineare; Non ho digerito la tua formulazione ILP, quindi non posso giudicarla, ma sono abbastanza sicuro di poter dimostrare che il problema è NP-difficile, il che renderebbe una soluzione di tempo lineare abbastanza utile: P. Lo pubblicherò presto.
Realz Slaw,

@RealzSlaw, grazie! In tal caso, sospetto fortemente che avrei potuto sbagliare da qualche parte (anche se non sono ancora sicuro di dove).
DW

5

NOTA: AFAICT, DW ha trovato un buco in questa riduzione ed è sbagliato (vedi commenti). Conservandolo qui per motivi storici.

Intro : prima ridurrò il problema Monotone 3SAT al nostro problema. Sebbene il problema Monotone 3SAT sia banalmente soddisfacente, il nostro problema può ulteriormente risolvere il problema minimo True Monotone 3SAT , che è NP-difficile; quindi questo problema è NP-difficile.

Riduzione da Monotone 3SAT al nostro problema

Abbiamo una formula booleana monotona espressa come una sequenza di variabili e una sequenza di clausole. Il CNF ha la forma tale che:Φ=(V,C)

e

(ciC) ci=(xjxkxl)||(xj,xk,xlV)

i=1nci|ciC,n=|C|.

Conversione

Costruiamo un grafico, . Ogni vertice in G ' ha un'etichetta; i vertici con la stessa etichetta sono idonei alla contrazione.G=V,EG

Innanzitutto costruiamo il grafico come segue: per ogni , creiamo due nodi, ciascuno etichettato x i , e un bordo diretto da uno all'altro (fare clic sulle immagini per una vista ad alta risoluzione).xiVxi

enter image description here

Questi nodi possono ovviamente essere contratti, perché hanno la stessa etichetta. Considereremo variabili / nodi che vengono contrattati valutati come falsi e quelli che non sono contrattati vengono valutati come veri :

enter image description here

V2|V|ciC, ci=(xjxkxl)|xj,xk,xlVcio

enter image description here

cio1cio

2|V|+|C|

XioXj XKcici

Ecco un'altra visualizzazione, srotolando il vincolo della clausola:

enter image description here

Pertanto, ogni vincolo di clausola richiede che almeno una delle variabili che contiene rimanga non contrattata; poiché i nodi non contratti sono valutati come veri, ciò richiede che una delle variabili sia vera; esattamente ciò che richiede Monotone SAT per le sue clausole.

Riduzione dal minimo True Monotone 3SAT

Monotone 3SAT è banalmente soddisfacente; puoi semplicemente impostare tutte le variabili su true.

Tuttavia, poiché il nostro problema di minimizzazione del DAG è trovare la maggior parte delle contrazioni, ciò si traduce nella ricerca dell'assegnazione soddisfacente che produce il maggior numero di variabili false nel nostro CNF; che equivale a trovare le variabili minime vere. Questo problema viene talvolta chiamato Minimo True 3SAT minimo o qui (come problema di ottimizzazione o problema decisionale) o k-True Monotone 2SAT (come problema di decisione più debole); entrambi i problemi NP-difficili. Quindi il nostro problema è NP-difficile.


Riferimenti:

Fonti del grafico:


1
wow. then D.W.'s solution must be wrong (or we have proven NP=P which I somewhat at least doubt :P ) -- but where?
chx

I think there's something wrong with this reduction. Consider (x1x2x6)(x1x4x5)(x3x4x6). Your reduction rules out the assignment x1=x4=x6=False x2=x3=x5=True, as that would create a cycle c1x1x4x6c1. However, that assignment should not be ruled out, as it satisfies the formula (it doesn't violate any of the clauses). More fundamentally, the answer lacks a proof that solutions to the DAG problem map one-to-one to satisfying assignments to the 3SAT formula.
D.W.

@D.W. Also nice to talk to you again :D, and good luck, if we are both right we might have P=NP in your answer! /jk
Realz Slaw

@D.W. unless I am misunderstanding something, your formula has to be converted into the Minimum True Monotone 3SAT problem I linked, or one of the equivalent ones, before you can apply my own reduction. A solution to my own would then have to be converted back to 3SAT. Therefore, I don't think you can just point out a formula that would fail in my own; it needs to be reduced first, then you can talk about "ruling out assignment[s]". (incidentally a minimally true solution for your formula is probably (x1,x3) )
Realz Slaw

@RealzSlaw, I'm afraid I don't follow yet... I don't see any reason why my formula would have to be converted. I believe it already is an instance of Minimum True Monotone 3SAT. But let me take it up a level. More broadly, I see a proposed reduction, but I don't see any argument that the reduction is correct -- that's missing. For the reduction to be correct, it has to map YES instances to YES instances, and NO instances, to NO instances. I suspect that if you try to write out a proof of correctness for your reduction, you will run into a problem when you consider the formula I gave.
D.W.

1

With each replacement (except for direct-parent-child replacements), you add new ancestor-descendant relationships that make it non-trivial to determine which one is actually worth it in the long-term. Therefore, a simple greedy algorithm will fail in the general case. However, if you do a brute-force approach, you can determine the smallest graph:

Python-ish (not tested):

def play((V,E),F,sequence=[]):
  """
  (V,E) -- a dag.
  V     -- a set of vertices.
  E     -- a set of directed-edge-tuples.
  F     -- a function that takes a vertex, returns an integer.
  sequence -- the sequence of moved taken so far; starts with/defaults to
              an empty list, will contain tuples of the form (x,y)
              where x is removed and replaced with y.

  Returns the best recursively found solution.
  """

  #find all the integer values in the graph, remember which
  # values correspond to what vertices. Of the form {integer => {vertices}}.
  n2v = {}
  for x in V:
    n = F(x)

    #for each integer, make sure you have a set to put the vertices in.
    if n not in n2v:
      n2v[n] = set()

    #for each integer, add the vertex to the equivalent set.
    n2v[n].add(v)

  #record the best sequence/solution. You start with the current sequence,
  # and see if you can obtain anything better.
  best_solution = list(sequence)

  #Now you will try to combine a single pair of vertices, obtain a new
  # graph and then recursively play the game again from that graph. 

  #for each integer and equivalent set of vertices,
  for n,vset in n2v.iteritems():

    #pick a pair of vertices
    for x in vset:
      for y in vset:

        #no point if they are the same.
        if x == y:
          continue

        #If there is a path from x => y or y => x, then you will be
        # introducing a cycle, breaking a rule. So in that case, disregard
        # this pair.
        #However, the exception is when one is a direct child of the other;
        # in that case you can safely combine the vertices.
        if pathtest((V,E),x,y) and (x,y) not in E and (x,y) not in E:
          continue

        #combine the vertices (function is defined below), discard x,
        # replace it with y, obtain the new graph, (V',E').
        Vp,Ep = combine_vertex((V,E),x,y))

        #record the sequence for this move.
        sequencep = list(sequence) + [(x,y)]

        #recurse and play the game from this new graph.
        solution = play(Vp,Ep,F,sequencep)

        #if the returned solution is better than the current best,
        if len(solution) > len(best_solution):
          #record the new best solution
          best_solution = solution
  #return the best recorded solution
  return best_solution


def combine_vertex((V0,E0),x,y):
  """
  (V0,E0)   -- an initial digraph.
  V0        -- a set of vertices.
  E0        -- a set of directed-edge-tuples.
  x         -- vertex to discard.
  y         -- vertex to replace it with.

  returns a new digraph replacing all relationships to and from x to relate
   to y instead, and removing x from the graph entirely.
  """

  #the final vertex set will have everything except x
  V = set(V0)
  V.discard(x)

  #now you construct the edge set.
  E = set()

  #for every edge,
  for (u0,v0) in E0:
    #recreate the edge in the new graph, but replace any occurence
    # of x.  
    u,v = u0,v0
    #if x is in the edge: replace it
    if u == x:
      u = y
    if v == x:
      v == y

    #sometimes u=v=y and can now be pointing to itself, don't add that
    # edge
    if u == v:
      continue

    #add the new/replaced edge into the edge-set.
    E.add( (u,v) )
  return (V,E)

I am not sure if it really a hard problem, but playing with some graphs manually, it seems very combinatorial. I am curious if something difficult can be reduced to this problem, or if there is an algorithm with better running time.


1
I am curious too :)
chx
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.