Який хороший метод випадкового генерування ребер між вузлами графіків?


10

Я роблю генератор випадкових карт для космічної гри 4X.

Кожен вузол у грі розміщується на випадковій (x, y) координаті на 2d сітці. Вузол може мати один або кілька двонаправлених ребер до іншого вузла (представляючи червотоки). Усі вузли повинні мати принаймні одну червоточину, і всі вузли повинні належати одному графіку.

В ідеалі червоточина не повинна перевищувати максимальну довжину і, якщо можливо, червиві отвори не повинні перетинатися один з одним.

Моя наївна реалізація полягає в переході до всіх вузлів і посилань на вузол до найближчих 3-х вузлів. Однак я закінчую численні під графіки. Який хороший метод для створення країв вузлів?


як вузли розкидані по галактиці? Я маю на увазі, чи можу я припустити, що для кожної точки (X, Y) у галактиці існує вузол? або принаймні для більшості з них чи ні?
Ali1S232

Не всі координати матимуть вузол. Близько 40% я б сказав.
Екстракун

Відповіді:


9

Ось хороша відповідь на подібне запитання.

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


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


+1, оскільки це дуже хороша відповідь, але мені просто не подобається таке покоління, тому я буду замислюватися про кращий алгоритм у найближчі кілька днів!
Ali1S232

Так, немає «правильної» відповіді на це, мені цікаво подивитися, що придумують інші.
Філіп

Offtopic, але я теж збирався посилатись на свою відповідь! : p
r2d2rigo

Таким чином я отримую за це бали, га!
Філіп

7

Основні обмеження вашої проблеми двоякі: створення 1-підключеного графіка; і створюючи його за допомогою проксимальних зв’язків. Хоча дещо цінна відповідь Філіпа, не вирішує усіх обмежень вашої проблеми

В ідеалі червоточина не повинна перевищувати максимальну довжину і, якщо можливо, червиві отвори не повинні перетинатися один з одним.

Коли ви наївно з'єднуєте точки в хмарі, ви ризикуєте (і при цьому високою) ці умови не виконати.

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

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

  1. Випадково створіть свою повну хмару точок.
  2. Дело-триангулюйте його.
  3. Побудуйте графік (з'єднання точок). У цьому випадку ви можете згенерувати спочатку весь графік (кожну зірку), а потім вивести графік як неповнолітні, що представляють ваші регіони, пов'язані з червоточиною, під час виконання кроку 4. Альтернативно, ви можете працювати навпаки, генеруючи лише регіони, пов'язані з червоточиною. спочатку як вузли суперграфа, а потім на другій фазі генерують окремі зірки в межах обмежувальних обсягів цих регіонів (для цього я отримав би графік триангуляції Делоне - діаграма Вороного в трьох вимірах) як підграф. Тепер у вас є зв'язані між собою зоряні кластери, і всі кластери з'єднані більш рідкими червоточинами: ваша топологія та топографія мають сенс для гравця.
  4. Застосуйте інтелектуальні методи для формування супер- та підграфів, залежно від того, як ви вирішили обробити його на кроці 3.

Важливо бачити, що це ієрархічний процес. Перший рівень стосується підключення до черв'якових отворів; другий стосується відстаней, імовірно, пройдених за допомогою стандартного приводу судна. Ви можете застосувати Делоне на одному або обох рівнях, щоб задовольнити свої обмеження.

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


Триангуляція Делоне є хорошою ідеєю, але вона не створює випадкових ребер. Ви можете видалити краї випадковим чином із країв, створених триангуляцією Делоне, але тоді ви ризикуєте отримати окремі графіки знову ...
bummzack

@Bummzack "Це не створює випадкових ребер". Коли-небудь чули про неповнолітніх графів? Після того, як у вас виникнуть більш складні обмеження за допомогою Delaunay, виконувати доповнення або видалення на цьому графіку неприємно, як вам подобається.
Інженер

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