Восстановите максимальное двойное соответствие от maxFlowFordFulkerson в R - PullRequest
1 голос
/ 03 октября 2019

Я хочу найти максимальное двустороннее соответствие, поэтому я буду использовать алгоритм Flow Ford Fulkerson, как объяснено здесь .

Но когда я реализую функцию, я получаю только значениемаксимального потока, но меня интересует сам поток, так что я могу найти соответствие.

Кто-нибудь может мне помочь?

Я использовал функцию maxFlowFordFulkerson в R.

1 Ответ

0 голосов
/ 08 октября 2019

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

Используя пример со страницы, на которую вы ссылаетесь (воспроизведено ниже дляпростота использования):

enter image description here

> library("optrees")
> vertices <- 1:14
> edges <- matrix(c(1,2,1, 1,3,1, 1,4,1, 1,5,1, 1,6,1, 1,7,1, 2,9,1, 2,10,1, 4,8,1, 4,11,1, 5,10,1, 6,11,1, 7,13,1, 8,14,1, 9,14,1, 10,14,1, 11,14,1, 12,14,1, 13,14,1), byrow = TRUE, ncol = 3)
> maxFlowFordFulkerson(vertices, edges, source.node = 1, sink.node = 14)
$s.cut
[1] 1 3

$t.cut
 [1]  2  4  5  6  7  8  9 10 11 12 13 14

$max.flow
[1] 5

Здесь вершины в двух разделах равны 2: 7 и 8:13 соответственно, так что это говоритнам, что вершина 3, то есть вторая вершина сверху в левом разделе, остается непревзойденной, но кроме этого она ничего не говорит о сопоставлении.

Если вы хотите придерживаться igraph, вы можетеиспользуйте maximum.bipartite.matching, чтобы получить то, что вы хотите. Так как этот работает непосредственно над двудольными графами, нам вообще не нужно связываться со вспомогательными вершинами источника / приемника. В приведенном выше примере:

> library("igraph")
> A <- matrix(c(0,1,1,0,0,0, 0,0,0,0,0,0, 1,0,0,1,0,0, 0,0,1,0,0,0, 0,0,1,1,0,0, 0,0,0,0,0,1), byrow = T, ncol = 6)
> g <- graph.incidence(A)
> maximum.bipartite.matching(g)
$matching_size
[1] 5

$matching_weight
[1] 5

$matching
 [1]  8 NA  7  9 10 12  3  1  4  5 NA  6

Здесь левый раздел представлен 1: 6, а правый раздел - 7:12. Из $matching мы читаем, что 6 вершин в левом разделе соответствуют 8, ничему, 7, 9, 10 и 12 соответственно.

...