Мінімальний розмір укладання DAG у новий DAG


15

У нас є DAG. Ми маємо функцію на вузлах F:VN (вільно кажучи, нумеруємо вузли). Ми хотіли б створити новий спрямований графік із цими правилами:

  1. F(x)F(y)xyxyF(x)F(y)
  2. Додамо всі старі ребра між новими вузлами: .(x,y)Ех'у'(х',у')Е'
  3. Цей новий графік все ще є DAG.

Який мінімум? Що таке алгоритм створення мінімально нового графіка?|V'|


1
Отже, проблема вирішення здається такою: задавши вершину DAG з кольором вершини та ціле число , вирішіть, чи існує DAG з максимум вершинами, утвореними шляхом стискання вершин одного кольору. kкк
Андраш Саламон

1
Якщо ви укладете контракт з двома підключеними вузлами, чи отримуєте ви заборонений самостіп?
Yuval Filmus

1
Ні. Прочитайте ще раз: ми додаємо край лише у тому випадку, якщо два вузли після скорочення все-таки різні. Якщо два вузли стискаються в один, краю не додаємо.
chx

1
@chx Ви запитуєте "мінімальний" або "мінімальний"?
Realz Slaw

1
чи можете ви дати мотивацію / кг?
vzn

Відповіді:


5

Одним із підходів до вирішення цієї проблеми було б використання цілого лінійного програмування (ILP). Давайте візьмемось за версію рішення проблеми: заданий , чи є спосіб укласти одноколірні вершини для отримання DAG розміром k ?kk

Це можна виразити як примірник ILP, використовуючи стандартні методи. Колір кожної вершини нам надається в оригінальному графіку. Я пропоную позначити кожну вершину міткою в ; всі вершини з однаковою міткою та одним кольором будуть укладені. Отже, проблема вирішення стає такою: чи існує маркування таким чином, що укладання всіх одноколірних вершин однотипних ярликів дає DAG?{1,2,,k}

Щоб виразити це цілою лінійною програмою, введіть цілу змінну для кожної вершини v , щоб представити мітку на вершині v . Додайте нерівність 1 vk .vvv1vk

Наступним кроком є ​​висловлення вимоги, що графік, що укладає контракт, повинен бути DAG. Зауважте, що якщо є маркування переліченої вище форми, без втрати загальності існує таке маркування, коли мітки індукують топологічний сортування на графіку, що укладається на контракт (тобто, якщо передує w у графіку, що контрактується, то v 's label менше, ніж ш етикетка). Отже, для кожного краю v w у початковому графіку ми додамо обмеження, що або v, і w мають однаковий ярлик і той самий колір, інакше мітка v 'менша, ніж мітка w . Зокрема, для кожного краю vvwvwvwvwvw в початковий графік, де v , w мають однаковий колір, додамо нерівністьvw . Для кожного краю v w, де v , w мають різні кольори, додайте нерівністьv < w .vwv,wvwvwv,wv<w

Тепер подивіться, чи є якесь можливе рішення для цієї цілолінійної лінійної програми. Буде можливим рішення, якщо і лише тоді, коли маркування має бажану форму (тобто, укладання всіх однокольорових вершин однієї мітки дає DAG). Іншими словами, буде можливим рішенням тоді і лише тоді, коли є спосіб скоротити початковий графік до DAG розміром . Ми можемо використовувати будь-яке цілочисельне лінійне програмування лінійки; якщо вирішувач ILP дає нам відповідь, ми маємо відповідь на оригінальну проблему рішення.k

Звичайно, це не гарантовано завершиться за полиномний час. Гарантій немає. Однак вирішувачі ILP отримали досить непогано. Я би сподівався, що для графіка розумного розміру у вас є гідний шанс, що вирішувач ILP зможе вирішити цю проблему за розумну кількість часу.

Можна також кодувати це як екземпляр SAT і використовувати розв'язувач SAT. Я не знаю, чи було б це ефективніше. Версію ILP, мабуть, простіше думати.

(Я сподіваюся, що це правильно. Я не перевіряв кожну деталь уважно, тому, будь ласка, перевірте мої міркування! Я сподіваюся, що я кудись не спробував.)


Оновлення (10/21): Схоже, ILP цієї форми можна вирішити за лінійним часом, обробляючи DAG у топологічно відсортованому порядку та відстежуючи нижню межу на мітці для кожної вершини. Це викликає підозру в моєму рішенні: чи я десь помилився?


Дякуємо за детальну відповідь! Я отримую обмеження, і вони виглядають розумно. Однак, хоча я не дуже добре розбираюся в ILP, я вважав, що цілому лінійному програмуванню потрібна функція, яку ви хотіли максимально (або мінімізувати), і я цього ніде не бачу. Я протидіяв лише Вікіпедії, щоб я помилявся.
chx

@chx, я використовую ILP для перевірки доцільності обмежень. Це можна зробити, попросивши вирішувач ILP максимізувати будь-яку вподобану функцію (наприклад, максимізувати 0), а потім ігнорувати значення цільової функції і лише роздивитись, чи можливий ILP чи ні. Або вирішувач ILP відповідає "Нездійсненний" (це означає, що немає контрактованої DAG розміром ), або він відповідає "Здійсненним" і забезпечує найкраще значення цільової функції, яку він міг би знайти; в такому випадку ви ігноруєте значення цільової функції (і ви знаєте, що існує DAG розміром k ). kk
DW

Дивись, наприклад, engineering.purdue.edu/~engelb/abe565 / ... ( «Я просто хочу знати , є чи не є допустимим рішенням існує .»)
DW

Стосовно вашого лінійного часового рішення; Я не засвоїв вашу формулу ILP, тому я не можу судити про це, але я впевнений, що можу довести, що проблема є важкою для NP, що зробить лінійне рішення часу досить зручним: P. Я скоро опублікую його.
Realz Slaw

@RealzSlaw, дякую! У цьому випадку я сильно підозрюю, що, можливо, десь помилився (хоча я ще не впевнений, де тільки що).
DW

5

ПРИМІТКА: AFAICT, DW знайшов дірку в цьому зменшенні, і це неправильно (див. Коментарі). Зберігаючи його тут з історичних причин.

Вступ : Спочатку я зведемо проблему Monotone 3SAT до нашої проблеми. Незважаючи на те, що проблема Monotone 3SAT є тривалістю задоволеної , наша проблема може додатково вирішити проблему Мінімального істинного монотону 3SAT , яка є важкою для NP; Таким чином, ця проблема є важкою для NP.

Зниження від Monotone 3SAT до нашої проблеми

Ми маємо монотонну булеву формулу, виражену як послідовність змінних, так і послідовність пропозицій. CNF має форму така, що:Φ=(V,C)

і

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

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

Перетворення

Побудуємо графік, . Кожна вершина в G ' має мітку; Вершини з однаковою міткою мають право на скорочення.G=V,EG

Спочатку побудуємо графік так: для кожного робимо два вузли, кожен із яких позначений x i , і спрямоване ребро від одного до іншого (натисніть зображення для перегляду з високою роздільною здатністю).xiVxi

введіть тут опис зображення

Ці вузли, звичайно, можна скоротити, оскільки вони мають однакову мітку. Ми вважатимемо змінні / вузли, які укладені за контрактом, оцінюватись як помилкові, а ті, що не мають контрактів, оцінювати як істинні :

введіть тут опис зображення

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

введіть тут опис зображення

ci1ci

2|V|+|C|

xixj xkcici

Ось ще одна візуалізація, знімаючи обмеження пункту:

введіть тут опис зображення

Таким чином, кожне обмеження пункту вимагає, щоб принаймні одна із змінних, що містяться в ньому, залишалася без контракту; оскільки неконтрактовані вузли оцінюються як істинні, це вимагає, щоб одна із змінних була істинною; саме те, що вимагає Monotone SAT для своїх пунктів.

Зниження від мінімального істинного монотону 3SAT

Монотон 3SAT задовольняє дрібницю; ви можете просто встановити всі змінні на true.

Однак, оскільки наша проблема мінімізації DAG полягає в пошуку більшості скорочень, це означає пошук задовольняючого завдання, яке виробляє найбільш помилкові змінні в нашій CNF; що те саме, що знайти мінімальні істинні змінні. Ця проблема іноді називається Minimum True Monotone 3SAT або тут (як проблема оптимізації, або проблема рішення), або k-True Monotone 2SAT (як проблема слабшого рішення); як NP-важкі проблеми. Таким чином, наша проблема є важкою для NP.


Список літератури:

Джерела графіка:


1
Ого. тоді рішення DW повинно бути помилковим (або ми довели NP = P, в чому я дещо принаймні сумніваюся: P) - але де?
chx

(x1x2x6)(x1x4x5)(x3x4x6)x1=x4=x6=False x2=x3=x5=Truec1x1x4x6c1

@DW Також приємно ще раз поговорити з вами: D, і удачі, якщо ми обидва вірні, ми можемо мати P = NP у вашій відповіді! / jk
Slaz Realz

(x1,x3)

@RealzSlaw, боюся, я ще не дотримуюся ... Я не бачу жодної причини, чому мою формулу потрібно було б перетворити. Я вважаю, що це вже є примірником мінімальної правдивої Monotone 3SAT. Але дозвольте мені підняти його на рівень. Загалом, я бачу запропоноване зменшення, але я не бачу жодного аргументу, що зменшення є правильним - цього немає. Щоб зменшення було правильним, воно має зіставити випадки YES з YES, а NO - з екземплярами NO. Я підозрюю, що якщо ви спробуєте написати доказ правильності зменшення, ви зіткнетесь з проблемою, коли розглянете формулу, яку я дав.
DW

1

З кожною заміною (за винятком заміни безпосередньо батько-дитина) ви додаєте нові відносини нащадка-предка, які роблять нетривіальним визначення того, хто з них насправді вартий у довгостроковій перспективі. Тому простий жадібний алгоритм вийде з ладу в загальному випадку. Однак, якщо ви застосовуєте грубу силу, ви можете визначити найменший графік:

Python-ish (не перевірено):

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)

Я не впевнений, чи це справді важка проблема, але грати з деякими графіками вручну, це здається дуже комбінаторним. Мені цікаво, чи можна щось важке звести до цієї проблеми або якщо є алгоритм з кращим часом роботи.


1
Мені теж цікаво :)
chx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.