на Главную Форума - back to Forum Indexна Главную Форума - back to Forum Indexна Главную Форума - back to Forum Index
на Главную Форума - back to Forum Index
Эадор.Сотворение - Eador.The Genesis на Главную Форума - back to Forum Indexна Главную Форума - back to Forum Indexна Главную Форума - back to Forum Index
на Главную Форума - back to Forum Index
Автор / Сообщение

Как ускорить ход противника

   SunRain

 
 
 Охотник

Свитков: 9
С нами с: 25.09.2009
Цитировать
СообщениеДобавлено: Вт Ноя 24, 2009 0:01     Заголовок сообщения: Как ускорить ход противника

Запускаю на самой большой карте 6 противников - комп ходит 2-3 минуты Evil or Very Mad что делать чтобы ускорить раздумья компа?????
_________________
... я вернусь...
Посмотреть профиль Отправить личное сообщение
   Adrageron

 
 
 * Небесный Лорд *
зловредный гремлин
developer



Свитков: 2153
С нами с: 26.03.2008
Откуда: Artifactorium
Цитировать
СообщениеДобавлено: Чт Ноя 26, 2009 13:55     Заголовок сообщения: Re: Как ускорить ход противника

SunRain писал(а):
Запускаю на самой большой карте 6 противников - комп ходит 2-3 минуты Evil or Very Mad что делать чтобы ускорить раздумья компа?????

Эмм... Захватить его родовой замок Very Happy
Большие карты грешат этим, да. Особенно если у кого-то из ИИ обширная территория - поиски путей грузят процессор серьёзно.
Если не считать апгрейда компьютера, повлиять на ситуацию сейчас никак не получится. Нужно оптимизировать.
P.S. Кстати, последний патч (1.03.1) может чуть ускорить время хода ИИ. Побочный эффект исправления одной ошибки Smile
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
   varfick

 
 
 Лекарь

Свитков: 4
С нами с: 07.01.2010
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 10:14     Заголовок сообщения: Re: Как ускорить ход противника

Adrageron писал(а):
... если у кого-то из ИИ обширная территория - поиски путей грузят процессор серьёзно.
Если не считать апгрейда компьютера, повлиять на ситуацию сейчас никак не получится. Нужно оптимизировать.
P.S. Кстати, последний патч (1.03.1) может чуть ускорить время хода ИИ. Побочный эффект исправления одной ошибки Smile

про поиск путей - всё ещё актуально (на 1.03.1). они ведь и для своих героев на своём ходу обсчитываются каждый раз при выборе героя с заданием "идти в провинцию ..." =)
я в процессе моддинговых экспериментов промазал мимо нужной строчки в items.var и скорость у воина получилась 28я. получил, что комп тупит по 4-5 минут при переключении на этого героя.
особенность заметил - внизу карты почему-то проявляется гораздо сильнее. странно.
интересно - почему такие проблемы? задачка-то типовая, поиска пути в графе с взвешенными вершинами... не наезд! =)))
Посмотреть профиль Отправить личное сообщение
   Adrageron

 
 
 * Небесный Лорд *
зловредный гремлин
developer



Свитков: 2153
С нами с: 26.03.2008
Откуда: Artifactorium
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 11:22     Заголовок сообщения: Re: Как ускорить ход противника

varfick писал(а):
интересно - почему такие проблемы? задачка-то типовая, поиска пути в графе с взвешенными вершинами... не наезд! =)))

Проблема в том, что чем выше скорость, тем больше получается набор возможных путей внутри одного перехода. Отсечение ложных путей идёт при истечении запаса хода. А граф не такой уж простой. Задача довольно существенно усложняется портами и конюшнями.
Насчёт того, что тормоза выше внизу карты - должно быть, там было больше проходимых провинций, соответственно, больше вариантов для перебора.
Посмотреть профиль Отправить личное сообщение Посетить сайт автора
   Drosel

 
 
 * Небесный Лорд *
admin
Небесная стража



Свитков: 2108
С нами с: 22.09.2009
Откуда: Харьков
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 14:35     Заголовок сообщения: Re: Как ускорить ход противника

varfick писал(а):
интересно - почему такие проблемы? задачка-то типовая, поиска пути в графе с взвешенными вершинами... не наезд! =)))

ждем не дождемся, когда будет предложено решение лучше текущего.
Посмотреть профиль Отправить личное сообщение
   varfick

 
 
 Лекарь

Свитков: 4
С нами с: 07.01.2010
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 17:19     Заголовок сообщения: Re: Как ускорить ход противника

Adrageron писал(а):
Проблема в том, что чем выше скорость, тем больше получается набор возможных путей внутри одного перехода. Отсечение ложных путей идёт при истечении запаса хода.
"не сходится": если есть начальная и конечная точка, то какая разница какова мобильность героя для алгоритма поиска пути? от мобильности зависит число ходов, которое отряд потратит чтоб добраться до цели.
Цитата:
А граф не такой уж простой. Задача довольно существенно усложняется портами и конюшнями.
Насчёт того, что тормоза выше внизу карты - должно быть, там было больше проходимых провинций, соответственно, больше вариантов для перебора.

попробовал задрать мобильность до 50 и проверил: при попытке попасть в соседнюю клетку маршрут построился мгновенно. через три клетки - подвис на 40 минут!
Посмотреть профиль Отправить личное сообщение
   varfick

 
 
 Лекарь

Свитков: 4
С нами с: 07.01.2010
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 17:20     Заголовок сообщения: Re: Как ускорить ход противника

Drosel писал(а):
varfick писал(а):
интересно - почему такие проблемы? задачка-то типовая, поиска пути в графе с взвешенными вершинами... не наезд! =)))

ждем не дождемся, когда будет предложено решение лучше текущего.

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

навскидку "по симптомам": сейчас используется какая-то вариация поиска в глубину, а лучше использовать поиск волной и добавить сколько-то ограничений, исходя из известных особенностей карты провинций.

просто tb-эадор тратит неимоверное время на pathfinding на машине, на которой с этим легко и для сотен юнитов справляются тяжёлые rts. вот и странно.
Посмотреть профиль Отправить личное сообщение
   Drosel

 
 
 * Небесный Лорд *
admin
Небесная стража



Свитков: 2108
С нами с: 22.09.2009
Откуда: Харьков
Цитировать
СообщениеДобавлено: Чт Янв 07, 2010 19:40     Заголовок сообщения:

Это вопрос к Алексею, готов ли он раскрыть эту информацию ибо Эадор не опен-сорс. Вообще, для людей серьезно занимающихся такими вещами, оптимизировать любой алгоритм проблемы не составит, но остается вопрос "Насколько просто будет внести изменения?". Поскольку код Эадора писался одним человеком, то основной задачей было завершить это процесс в разумные сроки, а не сделать это по всем правилам.
Посмотреть профиль Отправить личное сообщение
   varfick

 
 
 Лекарь

Свитков: 4
С нами с: 07.01.2010
Цитировать
СообщениеДобавлено: Пт Янв 08, 2010 1:13     Заголовок сообщения:

Подумал-подумал и решил раскрытия Алексеем секретов не ждать. Получилось примерно вот так.

Исходно дано:
* разведанная часть карты
* начальная провинция S
* конечная провинция F
* отряд под чутким руководством героя

Нужно построить скорейший для данного отряда маршрут-цепочку из провинций, начиная с начальной точки и завершая конечной.

Решение гремлинское "от Зарра":
1) Правильная подготовка, Босс, это залог успеха: посадить за исследование пару-тройку монахов поопытней, картами их снабдить...
* строится список своих провинций, которые доступны для прохождения, то есть не осаждены, не ограждены и т.п.
* в список добавляются (если не было) исходная и целевая провинции
* для каждой провинции из списка нужно выяснить перечень выходов, то есть приграничных с ней провинций и провинций, куда можно непосредственно попасть из верфи/порта
* для каждой провинции из списка определить время преодоления с учётом ей особенностей (вид, постройки, эффекты обрядов и тп), и возможностей нашего отряда
2) Гоблиниада 2010 (гоблинишек, Босс, на эстафету советую скликать помельче и пошустрее):
* даём орку посмышлёней свиток, на который монахи список записали и карандаш... хотя, если герой командир или маг, то орка нафиг - сам справится! гоблинишек надо распределить по провинциям по списку. сколько выходов в провинции, столько и бегунов
* помещаем в FIFO провинцию S (не понятно, босс? стартуем, то есть, из начальной провинции!)
* из очереди FIFO изымаем очередную провинцию X и сверяемся со орочьим списком - прибегал ли уже кто-то из гоблиниадцев в эту провинцию?
** если нет, то пусть орчище запишет теперь напротив этой провинции X в своём свитке "да, прибегали", а время в пути - время, которое скажет прибежавший гоблин. и дорогу пропишет, что гоблин скажет (у него с собой, на бумажке-шпаргалке записано).
(что, Босс? говорите что в начальную провинцию никто изначально не прибегал? значит всё равно писать "да, прибегали", а время - ноль! что такое ноль?... мда, Босс... как-нибудь в другой раз объясню...)
** если уже стоит пометка "да, прибегали", то сравниваем время нового бегуна с записанным.
*** если дольше или совпало, то пусть гоблинишка прочь пойдёт. может, в следующий раз повезёт...
*** если быстрее, то гоблина наградить, исправляем в орочьем списке "время в пути до провинции X", а также переписываем из гоблинской шпаргалки новый быстрейший маршрут до неё. и надо у всех остальных гоблинов в шпаргалках старый вариант маршрута на новый заменить! как, Босс? ну придумайте сами или магов попросите.
* смотрим, есть ли в списке напротив провинции X пометка "старт дан", если нету, то
** ставим пометку "старт дан"
** если "время до провинции X" лучше, чем текущее "лучшее время до финиша", то вручаем каждому из гоблинов на старте эстафетную шпаргалку - копию маршрута до провинции X с добавленным индивидуально пунктом назначения, указываем время = времени до X + время преодоления её же отрядом и выпихиваем бегунов через все выходы. записываем все выходные провинции в FIFO.
(если "время до провинции X" не лучше, чем текущее "лучшее время до финиша", то нечего гоблинов зря гонять, на дракона их послать и то будет полезней...)
* если провинция X оказалась по совместительству конечной провинцией F, то отмечаем новое "лучшее время до финиша" в орочьем свитке.
* пока в очереди есть что-нибудь (кто-то ещё бежит...) продолжаем извлекать очередной X и т.д.

Всё, Босс!!

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

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

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

 
 
 Колдун

Свитков: 57
С нами с: 18.07.2009
Цитировать
СообщениеДобавлено: Сб Янв 16, 2010 6:14     Заголовок сообщения:

varfick писал(а):
Подумал-подумал и решил раскрытия Алексеем секретов не ждать. Получилось примерно вот так.

В данном случае не надо ничего изобретать да и скрывать то нечего. Все уже украдено до нас. Чаще всего используют (модифицированный) метод Дийкстры. В случае большого количества нод и многих героев действительно может тормозить. Хотя на современных машинах лимит достаточно большой.
http://en.wikipedia.org/wiki/Pathfinding

Конечно только автор может знать какой алгоритм он использует, и почему он тормозит, так что пока это так, досужие размышления.
Посмотреть профиль Отправить личное сообщение
   HerrHolkin

 
 
 ∞ Владыка Душ ∞
Ветеран
Демиург: Мастер игр



Свитков: 4430
С нами с: 20.11.2009
Откуда: Minecraft
Цитировать
СообщениеДобавлено: Сб Янв 16, 2010 11:07     Заголовок сообщения:

А никто не думал что поиск пути может включать ще и стратегическую составляющую. Ведь важно найти не минимальный путь, а именно оптимальный. На это как-то должно влиять расположение вражеских героев. Я сам иногда "подвисаю" с такой проблемой.

Кста приведеный выше алгоритм не учитывает возможности захвата пров для сокращения расстояния.
Посмотреть профиль Отправить личное сообщение ICQ
   vlad

 
 
 Колдун

Свитков: 57
С нами с: 18.07.2009
Цитировать
СообщениеДобавлено: Сб Янв 16, 2010 14:59     Заголовок сообщения:

HerrHolkin писал(а):
А никто не думал что поиск пути может включать ще и стратегическую составляющую. Ведь важно найти не минимальный путь, а именно оптимальный. На это как-то должно влиять расположение вражеских героев. Я сам иногда "подвисаю" с такой проблемой.

Кста приведеный выше алгоритм не учитывает возможности захвата пров для сокращения расстояния.

Опять же я не автор и не знаю как это сделано в Эадор.
Но 'стратегическую составляющую' учитывает функция оценки весов. А если цель недоступна, обычно выбирают другую. Вы можете посмотреть пример патчфиндера здесь http://svn.savannah.gnu.org/viewvc/lordsawar/trunk/src/PathCalculator.cpp?annotate=2190&root=lordsawar
Осторожно, gpl.
Посмотреть профиль Отправить личное сообщение
   HerrHolkin

 
 
 ∞ Владыка Душ ∞
Ветеран
Демиург: Мастер игр



Свитков: 4430
С нами с: 20.11.2009
Откуда: Minecraft
Цитировать
СообщениеДобавлено: Вс Янв 17, 2010 11:49     Заголовок сообщения:

Спасибо.
Осталось только сишку подучить. Smile Никак руки до С++ не доходят.
Посмотреть профиль Отправить личное сообщение ICQ
Часовой пояс: GMT +3:00


 


Ты не можешь начинать темы
Ты не можешь отвечать на сообщения
Ты не можешь редактировать свои сообщения
Ты не можешь удалять свои сообщения
Ты не можешь голосовать в опросах
на Главную Форума - back to Forum Indexна Главную Форума - back to Forum Indexна Главную Форума - back to Forum Indexна Главную Форума - back to Forum Index Eador. The Genesis. Encyclopedia на Главную Форума - back to Forum Indexна Главную Форума - back to Forum Indexна Главную Форума - back to Forum Index