Задача №17: Оптимизация dist-файлов и другие гадости с ними

Разработка новых функций.

Модератор: 4epT

Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Задача №17: Оптимизация dist-файлов и другие гадости с ними

Сообщение piroJOKE »

В общем имеем этакий феномен... Вот карта:

Изображение
(это упросченная модель карты, где бегает немерянно поренгофф)

Задача у Коре стоит пройти из точки А в точку В.
Так вот, по узенькой дорожке он не пойдеть.
А пойдет по длинной дуге справа, против часовой стрелки.

И это - проблема. Хотелось бы, чтобы такие кратчайшие маршруты не игнорировались.

Я думаю, это связано с dist-файлами.

Кто-то вообще знает, КАК они работают? (Я могу лишь предполагать, наблюдая "поведение" Kore...)
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Как выглядит dist-файл внутри?

Задавшись этим вопросом, я просто сперва повтыкал на его hex-код. Ну... циферки. Какие-то маленькие значения (0x00...0x0A). Размер файла - практически такой же, как у соответствующего ему .fld. Окей, стало быть - картинка. Точнее, таблица, которую можно визуализировать, как картинку. Далее, поскольку руки у меня растут из... (неважно, в общем не оттуда, откуда следует), я хекс-редактором исправил заголовок у одного из dist-файлов, перенес туда заголовок из fld-файла. А затем этот исправленный файл переименовал в fld. И, запустил внеший mapviewer. ^___^

Вот результат. Я лишь немного поигрался палитрой, чтобы стало наглядней:

Изображение

Как видите, это та же самая карта .fld, только вокруг всех стен и зданий появились концентрические "разводы", этакие "ауры".

Если я верно понимаю, то при прокладке кратчайшего маршрута ейная процедура берёть число их этого dist-файла; и за "близость" к стенкам алгоритмом начисляются "штрафные баллы". Таким образом, чар двигается естественней - не задевая стен.

Этот алгоритм хорош. Например - если единственный достижимый маршрут - узенькая щелочка - Kore всё-таки в нее полезет. Но....

Побочный эффект алгоритма - ситуация, описанная в первом посте - проблемы с узкими длинными проходами, куда Kore просто не желает лезть, она идёт в обход!
Последний раз редактировалось piroJOKE Ср фев 28, 2007 12:58 pm, всего редактировалось 1 раз.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

о да. Я с этой проблемой тоже возился. Решение номер раз - правильно выставлять веса на дистанциях, но тут особо не поиграешь.
Решение номер два - делать dst не блюром, а более хитрым алгоритмом. Номер три - ручками чистить узкие проходы.
А вообще - какой смысл лезть в щелочку?
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Jerry
Только и исключительно - экономия времени.
Иногда эти "обходы" длятся слишком долго.
А если по дороге еще и агрессоры встретятся, то вообще "гасите свет".

* * *

Вернемся еще к вынесенному в заголовок словосочетанию "и другие гадости".
В некоторых местах "ауры" наоборот - следует увеличить. Потому что, иногда в городах Kore всё-таки срезает углы немного неестественно.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Еще одна бяка - движение вдоль стен.
С ней сталкивался всякий, кто управлял Kore в режиме ai manual.

Изображение

Естественной выглядит траектория А, тем не менее, Коре всегда выбирает траеторию Б - из-за dist-файла.
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

дык. отключайте какойтампараметротвечаетзадистанцирование когда оно вам не надо :)
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Jerry
Покажи-какую-кнопку-нажать-и-услышишь-спосибо! :)

* * *

Хм......... Вернемся к первой задаче. Есть бредовая мысля. Бред, но...
Быть может, стоит просчитывать дистанцию обоими методами - и учитывая dist, и НЕ учитывая. В таком случае, если сравнить результаты ОБОИХ методов, и узреть, что они ЗНАЧИТЕЛЬНО отличаются, то стоит, в порядке исключения, выбрать "старый", без-dist-овый алгоритм. Ы?

* * *

Пришло в голову, что просто так dist-ы не отключить.
Если я правильно понимаю, алгорит расчета кратчайшего пути - рекурсивный.
Т.е., он жрет немерянно быстродействия. Стало быть, оно верно написано на C.
А значит - я в этом ничего не пойму в исходниках, и скомпилить это не смогу (нЕчем). :(
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

шототипа noAvoidWalls, по крайней мере в исходниках оно так фигурирует, есть ли оно в конфиге, я хз
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Jerry
Ну... хз. Я не вижу, как эта штука читается их конфига.
Добавил сей параметр в конфиг; стёр .dist-ы, попробовал так в обеих положениях (0,1)...
"Бага" с не-хождением вдоль стенки осталась. :(

* * *

Кой-чаво интересное нашел. Это место, где генерируются дистанции, (ну, эти "ауры"):
(Не совсем уверен, но уж больно похоже это выглядит).

Код: Выделить всё

	# Generate map weights (for wall avoidance)
	my $weights;
	if ($noAvoidWalls) {
		$weights = chr(255) . (chr(1) x 255);
	} else {
		#$weights = join '', map chr $_, (255, 8, 7, 6, 5, 4, 3, 2, 1);
		$weights = join('', (map chr($_), (255, 7, 6, 3, 2, 1)));
		$weights .= chr(1) x (256 - length($weights));
	}
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
Аватара пользователя
Jerry
Профессионал
Сообщения: 1047
Зарегистрирован: Сб ноя 04, 2006 12:26 pm
Контактная информация:

Сообщение Jerry »

дык это веса аур и есть, чем больше вес, там меньше кора будет туда ходить. 255 это -1
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

Перенесено в "идеи". Апнуто. )
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

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

простой пример: сейчас я наконец-то собрался силами и мыслями, и делаю квест на сина. мне бы очень хотелось, чтобы ловушки в комнате in_moc_16 ботом старательно обходились.
я добился того, чтобы бот убивал только НУЖНЫХ монстров. но я не могу добиться от него непопадания в дырки-ловушки.

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

может быть я не прав, но бот не должен вообще ходить сквозь стенки, даже если на самом деле там можно ходить...

Добавлено спустя 1 минуту 44 секунды:

p.s. в целях чистоты эксперимента были уничтожены и dist файлы. кора сама генерировала новые исходя из моих "редактирований" fld
Аватара пользователя
piroJOKE
Модератор
Сообщения: 8205
Зарегистрирован: Сб ноя 04, 2006 2:20 am
Сервер RO:: localhost
Откуда: Molvania

Сообщение piroJOKE »

>__>
...
<__<
...
Эм... а попробуй в твоем случае скрутить route_step 15 до скажем 2...3. Не поможет ли?

Добавлено спустя 1 минуту 25 секунд:

Ты пишешь: "я руками отредактировал in_moc_16.fld" - а руками - это чем?
Use brain against brain, ai against ai... · как правильно задавать вопросы · faq · download
dvdc
Бывалый
Сообщения: 556
Зарегистрирован: Вс ноя 05, 2006 1:43 pm
Контактная информация:

Сообщение dvdc »

piroJOKE
относительно скручивания route_step - не уверен. попробую, но мне кажется надо как-то более радикально заставить кору думать что стена - это пипец стена, а не просто заборчик для защиты ёжиков и енотов :)

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

Добавлено спустя 14 минут 28 секунд:

посмотрел ai на предмет работы с routeweights...
интересная там есть строчка, где присутствует $penalty.
вот только я думаю глупая идея вносить изменения таким образом, чтобы бот избегал "тяжёлые" координаты на карте. сама идея веса карты - отличная, но я всё-же склоняюсь в сторону работы со стенками :)

p.s. кстати, интересно, почему в ОК вообще так реализована работа с непроходимыми областями? :)
dimmka
Энтузиаст
Сообщения: 87
Зарегистрирован: Вс ноя 19, 2006 12:40 pm

Сообщение dimmka »

dvdc писал(а):сейчас я наконец-то собрался силами и мыслями, и делаю квест на сина
Думаю многие будут рады лицезреть некоторые куски сего кода, когда он будет готов :twisted: :oops:
Ответить