Як побудувати "AI трафіку"?


21

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

На сьогодні доступні шляхи попередньо розраховуються, тому вузли генеруються автоматично для перетинів, які самі з'єднані між собою ребрами. Коли персонаж / агент з'являється у світі, він починається на якомусь вузлі і знаходить шлях до цільового вузла за допомогою простого алгоритму A *. Агент слідує шляхом і в кінцевому рахунку досягає свого призначення. Поки що жодних проблем.

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

Важко описати, але я думаю, ви зрозуміли, що я маю на увазі. Чи є у мене якісь рекомендації щодо того, з чого почати шукати? Будь-які документи, зразки проектів чи подібні речі, які могли б мене почати?

Я вдячний за твою допомогу!


Спільна дифузія може вам щось допомогти. Це простий спосіб вирішити пошук шляху для кількох агентів одночасно + агенти, уникаючи себе. Будь ласка, поділіться своїм досвідом з цим десь, дякую. ;)
користувач712092

Відповіді:


12

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

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

    виявлення - визнання того, що ви та зустрічний автомобіль зазнаєте аварії, якщо не уникнете один одного

    реакція - уповільнення та вступ у фазу переговорів.

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

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

  • Припустимо найгірше. Навіть у досконалій системі можуть скластись дивні ситуації, і ваші актори повинні діяти розважливо. Це ще ймовірніше, якщо гравець може втручатися (штучно блокувати місця тощо). Часто зупинка взагалі є єдиною розумною відповіддю (блокування!), Що крутиться на місці або, очевидно, перебуває у зламаному стані - це збій AI. Зупинка взагалі є принаймні правдоподібною в реальному світі.

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

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

  • Шлях пошуку відбувається з пам'яті, але ситуативне усвідомлення базується на сприйнятті. Не намагайтеся зробити своїх агентів ідеальними. Вони знають шлях від свого дому до офісу, тому вони знають, які повороти зробити. Але вони не знають, що вулиця в 2 милях заблокована. Не намагайтеся зробити так, щоб ваші агенти побудували ідеальний шлях, оскільки таких немає - навіть якщо він починається ідеальним, інші фактори можуть перекрити їх шлях. Агенти повинні планувати лише кілька вулиць попереду, куди вони їдуть.

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


Дякую за вашу детальну відповідь. Ваша порада повинна бути дуже корисною, коли я переходжу до регулярного дорожнього руху. Але я, мабуть, пропустив відзначити два важливі аспекти у своєму початковому пості: 1. Гравець сам не бере участі у трафіку. Це більше схоже на бізнес-сім, і він будує мережу. 2. Односпрямовані шляхи трапляються особливо в аеропортах, але в аеропортах агенти не "самі на себе", але мають вежу, яка говорить їм, куди йти. Вежа повинна визначати складні ситуації, але також має загальні знання, тому я гадаю, що це на один шар вище описаних ситуацій / поведінки.
Лунікон

5

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

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

2) Якась логіка розкручувати пробки, якщо вона виникає. Я спостерігав за ситуаціями, коли поводження з пробками поширювалося лише на транспортні засоби, які намагалися наїхати один на одного, але абсолютно не вдається, зіткнувшись із схемою -> -> <- <-. Я пригадую одну карту, яка була схильна до цього - це була чудова точка, яка покликала ускладнити атаку на базу ШІ, але рано чи пізно два комбайни, що збираються на ресурсах, приїжджатимуть, поки група нападів прямує, і це було все. Підрозділи, які контактували, оберталися б, намагаючись знайти маршрут, але вони не мали законних кроків. Це не відкликало і з'ясувало, що якийсь інший підрозділ повинен рухатись спочатку, і, таким чином, ШІ не вживав корисних дій, поки блок-блок не був знятий. (Ви можете спостерігати, як підрозділи контактують навколо, і більше нічого не роблять.)

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

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

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


2
Хороша відповідь - мені подобається поняття про трансляцію "застряглих" повідомлень, щоб кожен, хто може вийти.
MrCranky

4

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

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

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

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

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

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


Так, слід використовувати дві смуги (тому що просто дві доріжки), але це не вирішує жодних проблем, які вирішують питання про дорогу (що більшість проблем, про які опитував кандидат)
Барт ван Хекелом

4

Ви сказали, що переглянули кілька статей про поведінку керма, хоч на всякий випадок, ви подивилися наступну?

http://www.red3d.com/cwr/steer/

Якщо ні, це може дати вам відповіді, оскільки воно охоплює деякі названі вами проблеми, наприклад, проблему з вузьким місцем (Черга).


0

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

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

A * (Зірка) - це дуже простий алгоритм пошуку шляху, який, ймовірно, ви просто можете легко перекласти код psuedo у wikipedia на вашу обрану мову, і він буде працювати: http://en.wikipedia.org/wiki/A*_search_algorithm


4
Як я вже згадував у своєму початковому дописі, я вже реалізував алгоритм A * і мав відповідні структури даних. Крім того, лише зменшення швидкості будь-якого з агентів мені здається занадто "легким".
Lunikon

Це не проблема пошуку шляху, це проблема моделювання агента. Шлях пошуку є лише найнижчим рівнем інтелекту, який потрібно застосовувати акторам.
MrCranky

Занадто просто? ха-ха. Ну ось що я роблю, коли їду! Якщо я можу передбачити зіткнення з моїм поточним шляхом, я змінюю швидкість.
justin.m.chase

А світлофори? А що робити, коли ваш шлях перекритий іншим транспортним засобом? Що робити, коли ваш шлях говорить рухайтеся вперед, але швидкість дорівнює нулю, щоб уникнути зіткнення. Зіткнення з іншим автомобілем, шлях якого говорить пройти вперед (через вас), а швидкість їх також дорівнює нулю?
MrCranky

У сценарії з односмуговою смугою, якщо ви використовуєте швидкість інших автомобілів для обчислення їх майбутніх напрямків, коли перша машина виявить зіткнення та зупиняє інший автомобіль, також не потрібно буде зупинятися, оскільки швидкість першого автомобіля зараз 0. Це передбачає, що ви Я зможу зазирнути досить далеко вперед, щоб побачити зіткнення з автомобілями по довгих односмугових дорогах. Мій друг пропонує вам також додати вузол STOP до свого алгоритму A *. Зважаючи на це, з точки зору будь-якого окремого автомобіля ви просто вважатимете інші автомобілі перешкодою. Припинення може розблокувати ваш шлях, якщо виконано досить довго.
justin.m.chase

0

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

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