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


13

Я намагаюся створити карту перешкод у досить великому просторі 2D-сітки, використовуючи розвідку. Я виявляю перешкоди, намагаючись перейти з одного простору в сусідній простір, і якщо це не вдається, то в просторі призначення є перешкода (в цій проблемі немає поняття датчика дальності випромінювання).

приклад сітки http://www.eriding.net/resources/general/prim_frmwrks/images/asses/asses_y3_5d_3.gif (наприклад)

Процес завершується, коли були відвідані всі доступні площі. Іншими словами, деякі простори можуть бути абсолютно недосяжними, навіть якщо вони не мають перешкод, оскільки вони оточені. Це очікується.

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

У більш досконалому методі належним чином здається розпад клітин Бустрофедона .
Розпад клітин бустрофедона

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

Як я можу ефективно відвідати (картографувати) цю сітку? Якщо він існує, я хотів би, щоб алгоритм, який працює краще, ніж щодо загальної кількості квадратів сітки ( тобто краще, ніж для сітки).O(n2)O ( n 4 ) n nO(n4)nn


Дуже цікава проблема. Для наочності ви визначаєте "ефективне" якнайменше повторне відвідування будь-якої клітини?
DaemonMaker

Це може бути одним із способів сказати це. Дійсно, я намагаюся уникати алгоритмів, які є або гірше щодо загальної кількості квадратів сітки. O(n2)
Ян

Я думаю, що це аналогічна проблема, з якою стикається програмне забезпечення для обробки верстатів з ЧПУ, яке повинне видалити матеріал, відвідавши його за допомогою ріжучого інструменту.
Rocketmagnet

@Rocketmagnet: Не зовсім, оскільки машина з ЧПУ апріорі знає «перешкоди» , тоді як я їх виявляю під час руху.
Ян

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

Відповіді:


11

Розпад клітин бустрофедона - це просто поділ середовища на ділянки, які можуть бути ефективно покриті бустрофедоновим шляхом. Трапецієподібне розкладання буде, і це може бути здійснено за допомогою алгоритму зчитування рядків. Див. [Choset 2000], цей веб-сайт , або (рекомендую!) Відмінну книгу "Обчислювальна геометрія" Марка де Берга та ін. al, для повного опису потрібних структур даних та алгоритмів.

Чосет, Хауї. Автономні роботи "Покриття відомих просторів: клітинний розпад бустрофедона" , 2000.


Наприклад, розглянемо набір перешкод як ребра та вершини. Скажімо, навколишнє середовище також обмежене спеціальним багатокутником. У нас є щось на кшталт наступного. Щоб розкласти цей простір, ми просто додаємо вертикальні ребра між кожною вершиною та найближчою лінією чи вершиною.

Для цього в коді потрібен лише тест перетину ліній сегмента, відсортований список ребер та відсортований список вершин.

  1. vi
  2. livi
  3. На кожному перехресті створіть нову вершину.

Коли це зроблено, набір нових ребер і вершин містить лише трапеції. Але наголошую, ви не можете зробити це в Інтернеті (без попереднього знання перешкод). Якщо ви хочете зробити надійне покриття без попереднього знання, ви можете подивитися на "алгоритми помилок". Зокрема, ось простий алгоритм, припускаючи, що середовище обмежене.


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

  2. У верхньому лівому куті рухайтеся праворуч, поки не стикаєтесь з межею. Потім рухайтеся вниз і вліво (Ми робимо бустрофедон всього простору).

  3. Коли ви знаходитесь на лівій правій лінії та стикаєтесь із перешкодою, у вас є два варіанти. (i) Ми можемо обійти кругообіг, поки не дійдемо ліво-правої лінії, яку ми намагаємось прикрити, а потім продовжити. (ii), ми можемо розвернутися і накрити нову ліво-праву лінію, поки не опинимось через перешкоду або знову опинимось у цій ситуації. Я проілюструю.

Ліворуч ми рухаємось навколо перешкоди, поки не зможемо повернутися до тієї «лінії», яку ми намагалися пройти. Праворуч ми продовжуємо охоплювати (меншу) зону з одного боку перешкоди.

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

Зауважте, що це визначає ваше розкладання бустрофедоном в Інтернеті : Ви покриваєте область між перешкодами або між перешкодами та межею.

Однак, наскільки мені відомо, перший метод простіше проаналізувати. Складніші алгоритми (наприклад, BFS тощо) вибираються або тому, що середовище не є обмеженим (ви не хочете витрачати вічно на межу), або є дійсно неприємна перешкода в тому, що в основному розділяє середовище. Чому це погано? подивіться на цей приклад:

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

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


Оновлення: мені довелося видалити зображення (не https) і опублікую це, що часто використовується у практичних реальних програмах. http://www.cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/yamauchi_frontiers.pdf


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

Я додав простий приклад розкладання бустрофедону.
Джош Вандер Хук

3

Врешті-решт я виявив, що найкращим способом зробити це було використання дуже простої концепції: « Затоплення затоплення» . Я використовував ітеративний підхід на основі стека замість рекурсивного варіанту та модифікував його для фізичного простору, використовуючи пошук A *, щоб знайти шлях від поточного місця до наступного місця в стеці (використовуючи лише ті квадрати сітки, які вже є відвідали, оскільки я гарантовано прокладу шлях між ними).

Ефективність видається досить розумною.


Як я, ви виявили прикордонну розвідку cs.cmu.edu/~motionplanning/papers/sbp_papers/integrated1/…, і це справді добре працює
smirkingman
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.