Нахождение минимальных наборов разрезов между ограниченными подграфами

Если игровая карта разбита на подграфы, как минимизировать ребра между подграфами?

У меня проблема, я пытаюсь выполнить поиск A* в играх, основанных на сетке, таких как pacman или sokoban, но мне нужно найти «корпуса». Что я имею в виду под корпусами? подграфы с как можно меньшим количеством разрезов с учетом максимального и минимального размера числа вершин для каждого подграфа, которые действуют как мягкие ограничения.
В качестве альтернативы можно сказать, что я ищу мосты между подграфами, но в целом это та же проблема.


Пример

http://dl.dropbox.com/u/1029671/map1.jpg

Учитывая игру, которая выглядит так, я хочу найти ограждения, чтобы я мог правильно найти входы в них и, таким образом, получить хорошую эвристику для достижения вершин внутри этих ограждений.

замещающий текст http://dl.dropbox.com/u/1029671/map.jpg< /а>

Итак, я хочу найти эти цветные регионы на любой карте.


Моя мотивация

Причина, по которой я потрудился сделать это, а не просто довольствоваться производительностью простой эвристики манхэттенского расстояния, заключается в том, что эвристика ограждения может дать более оптимальные результаты, и мне не нужно было бы на самом деле выполнять A *, чтобы получить некоторые правильные расчеты расстояния и также для последующего добавления конкурентной блокировки противников в этих ограждениях при игре в игры типа сокобан. Также эвристику ограждения можно использовать для минимаксного подхода к более правильному поиску целевых вершин.

Возможное решение

Возможным решением проблемы является алгоритм Kernighan Lin:

function Kernighan-Lin(G(V,E)):
  determine a balanced initial partition of the nodes into sets A and B
  do
     A1 := A; B1 := B
     compute D values for all a in A1 and b in B1
     for (i := 1 to |V|/2)
      find a[i] from A1 and b[i] from B1, such that g[i] = D[a[i]] + D[b[i]] - 2*c[a][b] is maximal
      move a[i] to B1 and b[i] to A1
      remove a[i] and b[i] from further consideration in this pass
      update D values for the elements of A1 = A1 / a[i] and B1 = B1 / b[i]
    end for
    find k which maximizes g_max, the sum of g[1],...,g[k]
    if (g_max > 0) then
       Exchange a[1],a[2],...,a[k] with b[1],b[2],...,b[k]
 until (g_max <= 0)
 return G(V,E)

Моя проблема с этим алгоритмом заключается в его времени выполнения при O (n ^ 2 * lg (n)), я думаю об ограничении узлов в A1 и B1 границей каждого подграфа, чтобы уменьшить объем проделанной работы.

Я также не понимаю стоимость c[a][b] в алгоритме, если a и b не имеют ребра между ними, считается, что стоимость равна 0 или бесконечности, или я должен создать ребро на основе некоторой эвристики.

Знаете ли вы, что должно быть c[a][b], когда между a и b нет ребра? Как вы думаете, подходит ли моя проблема для использования многоуровневого метода? Почему или почему нет? У вас есть хорошая идея, как уменьшить работу, выполняемую алгоритмом Кернигана-Лина для моей задачи?


person Tore    schedule 06.04.2010    source источник
comment
Я не понимаю, как вы пришли к такому цвету на втором изображении. Каковы ваши критерии? Почему желтая капля не разделена на части? Как вы определяете график? Верт — это пятно, а его соседи — (не более) четыре пятна на севере, юге, востоке и западе?   -  person ziggystar    schedule 06.04.2010
comment
да, именно так я определяю граф, каждый квадрат (вершина) имеет своих соседей на севере, востоке, юге и западе. Изображение просто для иллюстрации, вы можете разделить желтый, красный, черный и т. д. на несколько замыканий, это просто ограничения максимального/минимального количества вершин на замыкание, регулирующие характер подразделения. Таким образом, если мое минимальное ограничение равно 8 вершинам, то это желтое замыкание заполнит ограничение, но если минимальное ограничение равно 4, оно может закончиться чуть ниже прямоугольника. Поиск алгоритма, который обычно работает для нескольких карт и замыканий, - это то, что мне нужно.   -  person Tore    schedule 06.04.2010
comment
Вы хотите разделить карту на подграфы. Размер подграфов должен соответствовать некоторым ограничениям (максимальный, минимальный размер), а количество ребер между разделами должно быть минимальным?   -  person ziggystar    schedule 06.04.2010
comment
правильный. Это именно то, что я хочу сделать.   -  person Tore    schedule 06.04.2010
comment
Керниган Лин дал мне странные решения при использовании его на K разных подграфах. Я думаю, это из-за того, как я делю граф на K подграфов.   -  person Tore    schedule 27.04.2010


Ответы (2)


Не уверен в вопросе, но, возможно, вы можете использовать двойственность максимального расхода/минимального разреза.

Существуют специализированные и эффективные алгоритмы для max-flow, которые можно использовать для решения первобытный.

Затем вам нужно получить двойное решение, используя метод, описанный здесь. .

PS: дайте мне знать, если вам нужна помощь с жаргоном исследования операций.

person baol    schedule 09.04.2010

Возможно, взгляните на эту ссылку в Википедии для дальнейшего чтения.

проблема разбиения графа в математике состоит в разделении графа на части так, чтобы части примерно одинакового размера и между частями мало соединений.

Раздел графа

person ziggystar    schedule 06.04.2010