Планування територіального патрулювання


14

Я розробляю гру / симуляцію, де агенти борються за землю. У мене ситуація показана на малюнку нижче:

Зелена та червона кахельна ділянка з подібними кольорами "істот"

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

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

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

  • Площа суші дуже випадкова, як видно на малюнку. Досить складно зрозуміти, де межі в кожному напрямку.
  • Як вони повинні агенти розділити регіони на патрулювання?
  • Земельні ділянки можуть бути непересічними, оскільки протилежна команда може зайняти територію з середини.

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

Як слід підходити до цієї проблеми?


1
Можливо, ви могли переглянути деякі методи обробки зображень для ідей? Різні алгоритми росту регіону, що працюють одночасно, можуть виходити від кожного агента, поки всі плитки, що належать їх команді, не будуть призначені агентом патрулювання.
Quetzalcoatl

@Quetzalcoatl: Хороша ідея, проста у виконанні, але це призведе до дуже нерівних патрульних регіонів. Розгляньте зелені агенти на зображенні вище. Правий верхній агент мав би ~ 15 квадратів для покриття, той, що знаходиться в центрі, лише 2.
Junuxx

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

1
Дійсно, це недосконало. Можливо, замість того, щоб використовувати агенти під час вирощування насіння для регіону, насіння можна було б посадити випадковим чином спочатку (по одному на агент). Після закінчення росту регіону, можливо, може бути виконаний крок балансування, обробляючи кожну область, як кластер класу, з плитками як вузлами. KNearestNeighbour або KMean або подібне може повторюватись до певної форми конвергенції, після чого регіони можна вважати приблизно збалансованими, при цьому кожен агент буде призначений до найближчого насіння (евклідова відстань?). (Я думаю, що я, мабуть, надмірно ускладнюю це. Має бути простіший спосіб ...)
Quetzalcoatl

1
Можливо, кожен агент міг би почати з відштовхування всіх інших агентів, як магніти. Це змусить агентів до різних куточків регіону. Коли агенти відпочивають, тоді розділіть землю, як запропонував Кетцалькоатл. Регіони повинні бути приблизно рівними.
tyjkenn

Відповіді:


9

Захоплююче питання. Я думаю, що одне з перших питань, з яким ви маєте звернутися, - це ви хочете, щоб поведінка патрулювання була "оптимальною" патрулювання або "реалістичним" патрулювання. Я просто складаю ці слова, але я маю на увазі:

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

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

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

  • Уникнення (за межами території) - Агенти намагаються перебувати на своїй території та уникати переїзду за її межі. Для деякого реалізму вплив "виходу за межі" території не повинен бути на 100% тут. Трохи "вирізання кутів" для виходу за межі району, ймовірно, дозволить зробити більш реалістичним рух.

  • Блукання - агенти намагаються продовжувати рухатися і досліджувати. Цей ви хочете зважити велику вагу, інакше агенти намагатимуться знайти оптимальну точку відриву від інших, а потім "залишитись".

  • Поділ (інші агенти) - Агенти намагаються тримати відстань від інших агентів (щоб вони покривали максимум ґрунту і не збивалися).

  • Шукати (загарбників) - Агенти намагаються закрити будь-яких окупантів, яких вони виявили.

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

В Інтернеті є досить багато ресурсів про те, як реалізувати "боїди", які відповідають описаним моделям поведінки. Рекомендую openteer реалізації з відкритим кодом .


2

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

Звичайно, це передбачає, що територія пов'язана.

Це не ідеальне рішення, але просте кодування, адаптивне до мінливих обставин та ефективне. Я успішно використовував цей алгоритм для розвідувальних атак та домагань у rts ai, про який я писав ще раз.

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