Группирование соединенных комнат или томов - сложный вопрос - PullRequest
1 голос
/ 25 марта 2020

Эта проблема оказалась сложнее, чем я думал. У меня есть список подключенных комнат. Каждая из комнат может иметь закрытую или открытую дверь. В любой момент я хотел бы знать, какие комнаты соединены вместе через открытые двери, и пометить их как «Связанные комнаты 1», «Связанные комнаты 2» и т. Д. c.

В stackoverflow есть сообщение , в котором обсуждается, как генерировать случайно соединенные комнаты и отслеживать, какие комнаты подключены. В основном определяют матрицу / массив conn[a][b]. Затем вы можете заполнить массив значениями true или false, если комната подключена. Так что если комнаты 2 и 4 соединены, то conn[2][4] = true и аналогично conn[4][2] = true. Матрица будет выглядеть следующим образом:

+--------+--------+--------+--------+--------+
| Rooms  | Room 1 | Room 2 | Room 3 | Room 4 |
+--------+--------+--------+--------+--------+
| Room 1 | N/A    | false  | false  | false  |
| Room 2 | false  | N/A    | false  | true   |
| Room 3 | false  | false  | N/A    | false  |
| Room 4 | false  | true   | false  | N/A    |
+--------+--------+--------+--------+--------+

Более сложная ситуация может быть следующей (комната 2 и комната 3 имеют закрытую дверь):

+----+----+----+
| R1   R2 | R3 |
+    +----+    +
| R5 |    | R4 |
+----+    +----+

Матрица будет выглядеть как следующее:

+--------+--------+--------+--------+--------+--------+
| Rooms  | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A    | true   | false  | false  | true   |
| Room 2 | true   | N/A    | false  | false  | false  |
| Room 3 | false  | false  | N/A    | true   | false  |
| Room 4 | false  | false  | true   | N/A    | false  |
| Room 5 | true   | false  | false  | false  | N/A    |
+--------+--------+--------+--------+--------+--------+

Я думал, что у меня есть умная идея, сгруппировав связанные комнаты, просматривая только ячейки, расположенные над N / As, и обрабатывая каждый ряд как отдельную 'Группу связанных комнат ':

+--------+--------+--------+--------+--------+--------+
| Rooms  | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A    | true   | false  | false  | true   |
| Room 2 |        | N/A    | false  | false  | false  |
| Room 3 |        |        | N/A    | true   | false  |
| Room 4 |        |        |        | N/A    | false  |
| Room 5 |        |        |        |        | N/A    |
+--------+--------+--------+--------+--------+--------+

даст:

Connected Group 1: [1, 2, 5]
Connected Group 2: [3, 4]

Однако этот метод не работает для более сложных ситуаций (Соединение комнат 4 и 5):

+----+----+----+
| R1   R2 | R3 |
+    +----+    +
| R5        R4 |
+----+----+----+

Матрица:

+--------+--------+--------+--------+--------+--------+
| Rooms  | Room 1 | Room 2 | Room 3 | Room 4 | Room 5 |
+--------+--------+--------+--------+--------+--------+
| Room 1 | N/A    | true   | false  | false  | true   |
| Room 2 |        | N/A    | false  | false  | false  |
| Room 3 |        |        | N/A    | true   | false  |
| Room 4 |        |        |        | N/A    | true   |
| Room 5 |        |        |        |        | N/A    |
+--------+--------+--------+--------+--------+--------+

даст:

Connected Group 1: [1, 2, 5]
Connected Group 2: [3, 4]
Connected Group 3: [4, 5]

Принимая во внимание, что фактический объем будет связан, так что должен быть только один Connected Group 1: [1,2,3,4,5]

I Я решил рассказать о своей проблеме, используя комнаты и двери, но моя настоящая проблема немного отличается. На высоком уровне я делаю инструмент анализа, где пользователь может изолировать объемы, открывая / закрывая клапан между объемами. Инструмент должен группировать отдельные объемы вместе по разным причинам, таким как визуальное указание подключенных объемов и выполнение расчетов выравнивания давления для каждого из сгруппированных объемов.

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

Я полагаюсь на программирование этого в python, но я хорошо владею несколькими языками. Не стесняйтесь ответить на вопрос концептуально или через ваш любимый не-archai c язык.

1 Ответ

3 голосов
/ 25 марта 2020

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

Вот ссылка на некоторый псевдокод для алгоритма, который должен решить вашу проблему как в DFS, так и в BFS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...