Як зобразити графік з кількома краями, дозволеними між вузлами та ребрами, які можуть вибірково зникати


11

Я намагаюся розібратися, яку структуру даних використовувати для моделювання гіпотетичного, ідеалізованого використання мережі.

За моїм сценарієм, кількість користувачів, які ворогують один з одним, намагаються сформувати мережі комп’ютерів, де відомі всі потенційні зв’язки. Комп'ютери, до яких потрібно підключити одного користувача, можуть бути не такими, як ті, з якими потребує інший користувач; користувачеві 1 може знадобитися підключити комп'ютери A, B і D, тоді як користувачеві 2 може знадобитися підключити комп'ютери B, C і E.

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

Зображення, створене за допомогою NCTM Graph Creator

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

  1. краї можуть стати обмеженими; тобто якщо один користувач набуває задане мережеве з'єднання, жоден інший користувач не може використовувати це з'єднання
    • у прикладі, зелений користувач не може підключитися до комп'ютера A, але червоний користувач підключив B до E, незважаючи на відсутність прямого зв’язку між ними
  2. в деяких випадках дана пара вузлів буде з'єднана більш ніж одним ребром
    • у прикладі є два незалежні кабелі, що працюють від D до E, тому користувачі зеленого та синього кольорів мали змогу безпосередньо підключити ці машини; проте червоний вже не може здійснювати таке з'єднання
  3. якщо два комп’ютери підключені більш ніж одним кабелем, кожен користувач може мати не більше одного з цих кабелів

На цьому графіку потрібно буде виконати кілька операцій, таких як:

  • визначення того, яка певна пара комп'ютерів підключена для даного користувача
  • визначення оптимального шляху для даного користувача для підключення цільових комп'ютерів
  • ідентифікація з’єднання з найвищою затримкою для даного користувача (тобто найдовший шлях без розгалуження)

Першою моєю думкою було просто створити колекцію всіх країв, але це страшно для пошуку. Найкраще, що я можу зробити зараз, - це зміни списку суміжності, щоб кожен елемент у списку містив не тільки довжину краю, але і його вартість та поточного власника. Це розумний підхід? Якщо припущення простір не викликає занепокоєнь, чи було б розумним створити кілька копій графіка (по одному для кожного користувача), а не один графік?


Це якось здається актуальним. youtube.com/watch?v=xdiL-ADRTxQ
RubberDuck

Я не дуже бачу, як це допоможе тут.
Попс

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

Відповіді:


6

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

Мені здається, ви повинні використовувати те, що ми могли б позначити "шаруватими графами", тобто додати комбінатор для графіків, скажімо @, так що:

  • Якщо A і B - графіки, то A @ B також є графіком (тобто може подаватися до алгоритмів вашої бібліотеки графіків).
  • Сукупність вершин в A @ B - це об'єднання вершин в A і B.
  • Сукупність ребер в A @ B - це об'єднання ребер в A і B.
  • Структура A @ B не має жодної вершини чи ребра, а скоріше використовує A і B як контейнери даних.

За допомогою таких шаруватих графіків ви можете визначити K як загальну доступну інформацію, а R, G, B кожну приватну інформацію, так що кожен гравець насправді бачить R @ K, G @ K, B @ K.

Щоб реально реалізувати це, ви можете шукати бібліотеку графіків, що реалізує алгоритми загалом, тобто таким чином, щоб алгоритм найдовшого шляху тощо був параметризований фактичним поданням вашого графіка. Тож якщо ваша бібліотека каже

ConcreteGraphAlgorithms = GenericAlgorithms(ConcreteGraphImplementation)

ви можете легко замінити його

LayeredGraphAlgorithms = GenericAlgorithms(LayeredGraphs(ConcreteGraphImplementation))

куди ви постачаєте LayeredGraphsта позичаєте решту у бібліотеки.


Ну, ігноруй мій попередній коментар, я трохи перечитав твою відповідь. Це в основному те, що я роблю, хоча мені не вдалося скористатися наявними бібліотеками графіків, тому що я дурно не думав перевірити, чи існували якісь.
Попс

1

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

Щоб представити графік, що приписується, ви можете використовувати список суміжності, додавши додаткові стовпці або матриці суміжності, додавши більше інформації в кожну клітинку. Більшість алгоритмів для неатрибутованих графіків працюватимуть, якщо ви фільтруєте дуги на основі атрибутів. Для алгоритмів, що приписуються, було розроблено багато алгоритмів, тому я їх тут не опишу.


1
безумовно, матриця суміжності зазвичай не може представляти більше 1 ребра між кожною парою вузлів
jk.

1
@jk, як правило, ти маєш рацію. Але інформація, що додається до матриці суміжності, може мати кількість дуг та окремі атрибути для кожної дуги. Але в більшості випадків я б використовував список суміжності, оскільки це було б простіше.
walrii

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