Эффективное определение границ множества - PullRequest
3 голосов
/ 03 февраля 2011

Я пишу AI для игры RTS, используя API, который предлагает игра. Одна вещь, которую я хочу сделать, это определить набор отрезков, ограничивающих вражескую нацию. Однако в игре есть только функция, которая сообщает мне идентификатор команды из одной 2D-точки территории.

Запросы к игровому ИИ невероятно дороги для выполнения, поэтому мне нужно сводить количество запросов к абсолютному минимуму, даже если это иногда означает получение чуть более качественного ответа. Также лучше переоценить площадь вражеской территории, чем недооценить ее.

Как эффективно определить набор ограничивающих линий вокруг невыпуклой области пространства, используя минимальное количество запросов?

Примечание: бонусные баллы за ответ, написанный на Lua, но псевдокод тоже подойдет.

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Возможно, вы ищете выпуклую оболочку вокруг набора точек, см .: http://en.wikipedia.org/wiki/Convex_hull

Это проблема O (n log n) - не так уж плохо в вычислительном отношении.Для некоторого псевдокода см .: http://en.wikipedia.org/wiki/Graham_scan

РЕДАКТИРОВАТЬ : с вашим уточненным вопросом, я понимаю, что области не обязательно выпуклые, поэтому выпуклая оболочка даст вам более широкий регион, чем выищу.Однако это может быть отправной точкой (поскольку конечная невыпуклая область, которую вы ищете, находится внутри корпуса), которую вы можете уточнить.

MORE EDIT : если вы действительно толькоесть функция для запроса одной точки, тогда ваша проблема такая же, как векторизация растрового изображения.Каждая точка является «пикселем», а вражеский регион является (приблизительной) векторизацией «пикселей».

2 голосов
/ 12 февраля 2011

Полагаю, вы можете найти a точку в пространстве на территории. Назовите это Z. (Так как у вас есть несколько городов, вы можете выбрать среднее местоположение города как центральное.)

Учитывая исходную точку Z, я хотел бы создать набор лучей наружу из этой точки, причем каждый луч имеет нижнюю и верхнюю границу размера, а число увеличивается, чтобы получить детализацию. Я набросал схему ниже. Ничего об этом не проверено; не стесняйтесь предлагать улучшения.

Каждый луч представлен углом тета и имеет начало Z. Вместо одной длины у каждого луча есть две связанные длины, внутренняя и внешняя, с которыми мы собираемся сходиться. Начальное значение Inside установлено равным 0, а outside - значением, превышающим радиус любой возможной территории («Горизонт»); мы сжимаем Снаружи, пока он не окажется внутри территории, и будем расти Внутри, пока он не окажется совсем за пределами территории, используя бинарный поиск (log2 N в диаметре вашего игрового пространства). Мы также собираемся увеличить количество лучей по мере расширения конечных точек, чтобы получить детализацию границ территории. Предполагается, что конечным результатом будет набор лучей, которые устанавливают границу вокруг территории, конечные точки которой не более чем «расстояние» друг от друга.

Вы можете начать с одного луча (тета = север (0), внутри = 0, снаружи = горизонт). Давайте назовем набор лучей R. Предположим, что набор лучей R отсортирован по тета, и если у нас есть луч r от R, то следующим (r) будет следующий луч в отсортированном множестве, со следующим (r) для последнего луча в R, являющегося первым лучом в наборе. поскольку Вы знаете городские локации, вы можете посеять сет лучами, в которых города - это точки внутри. Это должно работать в любом случае.

Дополнительный параметр «Порог» дает вам степень точности вашего ответа.

R = empty
add_to_R(0,0,Horizon)
repeat until done
    done = true
     for each ray r in R
      guess = average(Inside(r),Outside(r))
      if guess>threshold
         then done = false
      if interritory(Z+(Theta(r),guess))
        then Inside(r)=guess
        else Outside(r)=guess
     for each ray r in R
       if (distance(Inside(r),Inside(next(r)))> spacing
          then add_to_R(average(Theta(r),Theta(next(r)),
                        min(Inside(r),Inside(next(r)),
                        max(Outside(r),Outside(next(r))
end

Эксплуатационная стоимость должна составлять 2 при максимальном диаметре территории, при этом множитель должен иметь отношение к окружности территории, деленной на выбранный интервал конечной точки луча.

Эта схема не идеальна; он потерпит неудачу в присутствии полуостровов территории, где луч пересечется, если не взять пробы на полуострове. Если полуострова произвольно тонкие, для их обнаружения потребуется произвольно много образцов. Возможно, вы можете выбрать минимальную ширину полуострова, а затем настроить алгоритм на шаг наружу, когда он, наконец, найдет сходящийся луч, по ширине полуострова, чтобы убедиться, что он не дурак.

2 голосов
/ 03 февраля 2011

Я предлагаю вам подойти к нему, используя методы Монте-Карло

http://en.wikipedia.org/wiki/Monte_Carlo_method

Начиная с набора известных точек, возможно, удастся улучшить дополнительные «случайные» догадки, основанные на знании вашихцели и результаты ваших начальных точек (являющихся набором начальных городов)

Я мог бы подумать о том, чтобы попробовать что-то похожее на линии с равным потенциалом между известными точками, взвешенными по предполагаемому размеру точек.Острова, которые, как предполагается, неправильно присоединены на ранних этапах, сильно повлияют на эти предположения, хотя .... нужно больше обдумывать.которая проводит анализ карт для определения местоположения определенной растительности по спутниковым / аэрофотоснимкам ... в некоторой степени связана с этой проблемой, потому что она пытается автоматизировать определение местоположения участков перед просмотром карт самостоятельно.

Она говорит, что типичный подход заключается вшаблон сетки, который делит вашу общую площадь и сжимается внутри себя, когда находит конкретные шаблоны.Таким образом, вы бы выбрали обычную сетку (разработка этой сетки могла бы включать в себя некоторые знания о размерах, которые вы ищете), если вы получили удар, попробуйте больше в этой области ... если вы этого не сделаете, сместите вашу сетку и повторнообразец.

Оптимизация этого подхода заключается в знании человеком вашего шаблона поиска.Например, вы указываете количество подразделений в своей поисковой сетке на основе общего ожидания размера / формы.

...