Змушуючи ШІ проходити різні шляху один до одного


16

У мене гра 2d зверху вниз, де AI нерестується в краях карти і біжить до центру.

Я використовую A * і сітку вузла, щоб зробити поточну обробку.

Прямо зараз AI нерестується в точці на краю карти і всі йдуть тим самим шляхом, який є найкоротшим маршрутом до центру.

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

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

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

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

Які підходи у людей знайшли найкращу роботу, щоб отримати ШІ, щоб змінити шлях, який вони проходять, виглядати переконливо і дивно?

Відповіді:


7

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

  • динамічно генеруючи очки, що тісно оточують (тобто слідують) за позицією гравця;
  • що запропонував Nevermind у частині рандомізації шляхів до цих навколишніх точок більшою чи меншою мірою.

Таким чином, ви можете гарантувати, що AI не буде приймати надмірно довгі об'їзди лише для того, щоб отримати реалістичну зміну шляху при конвергенції на програвач.

Дифузія спільної роботи робить те, що ви хочете неявно, як частину алгоритму. Але реалізувати це нетривіально.


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

Це все ще нетривіально реалізовувати внаслідок того, що це нестандартна точка зору з точки зору управління суб'єктами AI :)
Інженер

Дякую Ніку. Я думаю, що основним способом буде встановити деякі точкові точки, які оточують плеєр у центрі карти. На цьому етапі не впевнені, чи будуть вони динамічно генеровані чи будуть задіяні певні ручні роботи для кожного рівня для моєї конкретної ситуації. Знову дякую!
TerryB

12

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


Вороги в кінцевому підсумку бігатимуть як кури, і в тонкозернистому середовищі шляхи все одно не будуть такими різними. Це гарне доповнення до інших рішень, але не є рішенням саме по собі
Coyote

@Coyote Це дуже залежить від структури наві-сітки та відносин між вагою вузла, швидкістю та випадковою складовою. Тому я поставив відповідь як пропозицію спробувати, а не як однозначну відповідь.
Nevermind

Дійсно :) Я, як правило, шанувальник ентропії. Але кінцевий результат рідко чудовий.
Койот

Я фактично вважаю, що відповідь Ніка Віггілла набагато краща, ніж моя. Але якимось чином не отримую оцінок, які заслуговує.
забудьте

Це ... Але ваше перше і простіше ... ми могли б спробувати проголосувати за нього: P
Койот

3

Мені подобається відповідь Nevermind , однак, враховуючи обмеження, описане в коментарях, саме це я б спробував:

  1. Алгоритм однієї одиниці до центру записує загальну пройдену відстань.
  2. Для кожної наступної одиниці виділіть її відстань, яка є випадковою і невеликою кількістю, довшою за цю.
  3. Виконуючи A * для кожної одиниці, додайте додаткову вагу, виходячи з того, наскільки ви близькі і як далеко ви хочете подорожувати. Це, мабуть, було б щось подібне (distanceToGoal) + Max(0, desiredDistance - distanceTravelled)).

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

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


2

Як вказував Нік Віггілл, найпростішим підходом було б отримати коло, що оточує ціль.

  • довільно призначити крапку, близьку до цього кола, як точку.
  • усунути всі шляхи в колі з початкового шляху (або різко збільшити значення цих точок)
  • Тоді з цієї маршрутної точки проходьте шлях до мети.

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

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


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

Дякую Койоте, так, мабуть, я збираюся піти з рішенням Nicks, і, як запропонував DampeS8N, деякі ключові місця, що цікавлять, як точкові точки. Щоб уникнути проблеми "ІР" перетину кола ", я просто збираюся значно збільшити вартість вузлів у колі, тому A * повинен сподіватися навколо нього :)
TerryB

2

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

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

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

Я б, можливо, порекомендував би простіший погляд на це. Коли ви шукаєте шлях, не підтримуйте жодного найкращого шляху, який я знайшов-поки що. Натомість, зібрати набір кращих 5 або 10 шляхів. Використовуйте поріг, щоб відмовитись від очевидних людей. Наприклад, якщо найкращий шлях проходить 20u, щоб дістатися до цілі, наступний найкращий проходить 21u, а наступний - 50u. Встановіть поріг на 20% більше, ніж найкращий шлях, і так відмовтеся від шляху 50u, оскільки він тупо довший. Тепер у вас є кілька шляхів на вибір, і випадковим чином вибираючи з цього набору шляхів, ваші актори приймуть різні рішення.

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


1

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

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