Теория графов: разделение графа

У меня есть эта проблема. У меня есть граф из n узлов, который я хочу разбить на два подграфа из узлов x и узлов n-x с учетом ограничения, заключающегося в том, что количество оставшихся ребер максимально (или минимизирует количество обрезанных ребер).

Не уверен, что это имеет смысл. Не специалист по теории графов, но это абстрактная версия моей проблемы. Какие алгоритмы я должен посмотреть, что может мне помочь?

Это НЕ проблема с домашним заданием. Интересная проблема, хотя я думаю!

Планирую реализовать на C.


person JoshDG    schedule 17.04.2012    source источник
comment
Является ли x параметром или вы просто ищете 2 подграфа? Если x не является параметром, не могли бы вы просто найти узел с наименьшим количеством ребер и вырезать его из графа?   -  person brianestey    schedule 17.04.2012
comment
да .. извините, я должен был сделать это более ясным. Скажем, x равно 10, а общее количество узлов равно 25. Мне нужны два графа, один с 10 узлами, а другой с 15... путем сокращения наименьшего количества ребер.   -  person JoshDG    schedule 17.04.2012
comment
Определенно интересная проблема. На самом деле мое первое предположение о поиске одного узла неверно — я придумал график, на котором это неверно. Удачи в поиске решения!   -  person brianestey    schedule 17.04.2012
comment
Обратите внимание, что то, что вы описываете, не обязательно будет иметь уникальное решение. Представьте себе граф из 4 узлов, организованный в виде простого квадрата, и вы выбираете x как 2. Обрезание верхнего и нижнего ребер явно не лучше, чем обрезание левого и правого ребер. Вам нужно будет либо формально определить приоритет обрезки ребер (возможно, исходя из порядка узлов), либо иначе управлять тем, что будет набор одинаково правильных решений.   -  person HostileFork says dont trust SE    schedule 17.04.2012
comment
Если бы x не был фиксированным, это была бы задача минимального разреза, и ее решение заключается в использовании максимального расхода. Я никогда не видел проблемы с исправлением x, и я не знаком с подходом для этого.   -  person Ivaylo Strandjev    schedule 17.04.2012
comment
Ваша проблема не имеет ничего общего с языком программирования, который вы планируете реализовать, не так ли? Удаление тега C.   -  person Jens Gustedt    schedule 17.04.2012


Ответы (3)


Частный случай, когда x = n - x, называется проблемой минимального деления пополам и является NP-трудным. Это также делает вашу проблему NP-трудной. В статье Википедии о разбиении графа описано несколько эвристик, включая локальный поиск (например, начать с случайный разрез и многократное переключение пар вершин, что уменьшает размер разреза) и спектральные методы (например, вычисление и пороговое значение второго собственного вектора). Если n мало, целочисленное программирование также возможно.

person uty    schedule 17.04.2012
comment
Угу. Наверное, слишком продвинуто для некомпьютерного ученого. Может быть, лучше просто использовать генетический алгоритм, если x мало? Просто взять кучу случайных наборов x = 10 и, для случаев, когда граф разделен ровно на две части, взять верхние 10% с точки зрения минимальных сокращений, а затем мутировать их для группы поколений? Как вы думаете, это может быть эффективно? Или это полностью зависит от набора данных. Думаю, я тоже могу попробовать. - person JoshDG; 17.04.2012
comment
Локальный поиск довольно легко реализовать: просто начните с разреза и попытайтесь улучшить его, внеся небольшие изменения. Вычисление собственных векторов не так уж плохо, но требует некоторых математических знаний. Целочисленное программирование сложно, но есть бесплатные библиотеки. Я не люблю генетические алгоритмы для комбинаторных задач, но они могут быть лучше, чем локальный поиск, если вы готовы потратить на них достаточно циклов. - person uty; 17.04.2012
comment
Да, на самом деле я смог написать простой алгоритм ветвей и границ, который эффективно работает для моей конкретной проблемы... Я собираюсь принять ваш ответ, потому что он явно правильный, хотя я не совсем его понимаю. Я собираюсь прочитать собственные векторы ради этого. Спасибо! - person JoshDG; 17.04.2012

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

  1. Учитывая полный набор узлов S, пусть P и P' будут множествами узлов, изначально пустыми, а K числом отрезанных ребер, изначально равным 0.
  2. Пусть S*, K* — наилучшее известное решение и его количество ребер, где K* изначально равно бесконечности.
  3. Выберите узел N для начала и назначьте его S.
  4. For each unassigned node M:
    1. Assign M to S', and add the number of edges from M to nodes in S to K.
    2. Если K > K*, то никакое решение, основанное на этом, не будет лучше лучшего, поэтому присвойте M значению S.
    3. Если |S| > X, то множество стало слишком большим; отступать.
    4. В противном случае рекурсия от 4.
  5. Если все узлы назначены и K ‹ K*, то пусть S* = S и K* = K.

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

person Edmund    schedule 17.04.2012

в основном вы смотрите на модифицированную версию задачи о минимальном сокращении.

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

В модифицированной версии после того, как вершина схлопывается x раз, вы можете остановить схлопывание и подсчитать исходящие ребра (в вашем случае это будут разрезы), сделать это подходящее количество раз, и у вас есть решение. Сложная часть заключается в том, чтобы выяснить, сколько раз нужно повторить вычисления, чтобы повысить достоверность до удовлетворительного предела.

person AntonioD    schedule 17.04.2012
comment
минимальные задачи разреза не имеют фиксированного x [количество вершин на одной из сторон разреза], а имеют определенные source и sink. Если вы имеете в виду сокращение до минимальной задачи - добавьте ее в свой ответ. - person amit; 17.04.2012
comment
Я думаю, что какая-то модификация Каргера могла бы решить эту проблему. В задачах с минимальным потоком как таковых нет стока и источника, просто некоторые алгоритмы сводят задачу к задаче с максимальным потоком. Я отредактирую ответ, если смогу придумать хорошую модификацию karger, которая обрабатывает фиксированный случай x (есть один очевидный способ, но не уверен, что он дает правильные результаты) - person AntonioD; 17.04.2012