Russian AI Cup

Расширенный поиск  
Страницы: [1] 2 3

Автор Тема: Как все-таки нужно было делать  (Прочитано 15795 раз)

GRaAL

  • Jr. Member
  • **
  • Сообщений: 10
Как все-таки нужно было делать
« : Октября 13, 2014, 01:18:20 pm »

Всем привет и поздравления с окончанием официальной части. Думаю сейчас такие вопросы уже можно задавать.

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

Здесь же я плохо понимаю как можно было организовать просчет наперед. Ну допустим вот мой хоккеист с шайбой, через 200 тиков он окажется в такой-то точке если сохранит направление и ускорение - я могу такое подсчитать, но без понимания как поступит противник - знание не очень полезное. А за 200 тиков противник может сделать множество действий - и поехать прямо, и развернуться, и поехать назад, и получить удар клюшкой и резко ускориться и т.д.
Поэтому вместо какого-то просчета и эмуляции я начитался про steering behaviors и попытался  идти этим путем - т.е. в каждый тик складываем пачку векторов, выставляем корректно веса и получаем действие, которое максимально приближает нас к цели. Мне казалось это наиболее подходящим под понятие ИИ т.к. решения принимаются на основе оценки текущей ситуации.
Результат оказался не таким радужным. Было очевидно что какое-то поведение реально проще захардкодить - типа чтобы выход на "линию атаки" всегда шел вдоль борта через определенные точки для максимальной скорости при ударе. Но захардкоженное поведение - это как-то ни разу не ИИ.

Собственно вопрос у меня не о конкретных решениях (думаю победители потом расскажут что и как они делали), а скорее о теории. Какие методы/алгоритмы тут можно было применить?

Спасибо.
Записан

dimoc

  • Jr. Member
  • **
  • Сообщений: 21
Re: Как все-таки нужно было делать
« Ответ #1 : Октября 13, 2014, 01:50:41 pm »

еще неделю песочница будет бороться за призы, официальная часть еще не закончилась
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #2 : Октября 13, 2014, 04:47:07 pm »

Все просчитывается точно так же наперед как и в пошаговом варианте, возможные противодействия противника можно включить в оценочную функцию.
В танках все было аналогично, почитай статью смайла на хабре.
« Последнее редактирование: Октября 13, 2014, 04:48:49 pm от santa324 »
Записан

Dfire

  • Full Member
  • ***
  • Сообщений: 82
Re: Как все-таки нужно было делать
« Ответ #3 : Октября 13, 2014, 06:38:55 pm »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #4 : Октября 13, 2014, 06:44:06 pm »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Я сделал - при выходе на позицию для защиты у ворот и выходе на позицию для замены. Почти оптимальные алгоритмы, может только выйти на позицию с нужным углом поворота можно было бы чуть чуть побыстрее.
Но наверно раскрывать алгоритм до окончания песочницы не хорошо...
« Последнее редактирование: Октября 13, 2014, 06:46:48 pm от santa324 »
Записан

noop

  • Full Member
  • ***
  • Сообщений: 73
Re: Как все-таки нужно было делать
« Ответ #5 : Октября 13, 2014, 06:46:06 pm »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Я это проработал, но кодить не стал. После окончания, если не забуду, можно пообсуждать.
Записан

GRaAL

  • Jr. Member
  • **
  • Сообщений: 10
Re: Как все-таки нужно было делать
« Ответ #6 : Октября 13, 2014, 10:17:05 pm »

Ну хорошо, задам более конкретный вопрос. Вижу много обсуждений тректории полета шайбы - при столкновении о стены, о вратаря и прочее. И глядя на свое решение не могу понять зачем может понадобиться настолько большая точность. Скажем нужно мне захватить шайбу, летящую свободно куда-то. По идее мне не нужны абсолютно точные координаты. Если она близко, то погрешность в несколько пикселей не должна играть роль - ведь мне надо чтобы она оказалась в относительно немаленьком секторе. Если далеко - тем более, главное более-менее в нужную сторону повернуться и ускориться/замедлиться, но для этого разброс в десяток точек тоже некритичен.

Вот для каких целей нужна точность чуть ли не до десятых?
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #7 : Октября 13, 2014, 10:41:03 pm »

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

DVS

  • Hero Member
  • *****
  • Сообщений: 688
Re: Как все-таки нужно было делать
« Ответ #8 : Октября 13, 2014, 10:43:45 pm »

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

ThermIt

  • Full Member
  • ***
  • Сообщений: 67
Re: Как все-таки нужно было делать
« Ответ #9 : Октября 13, 2014, 10:54:45 pm »

Я бы объяснил зачем бы мне понадобилась точность до десятых, но такую информацию до конца песочницы раскрывать не по правилам  :P

Абстрактный пример: при просчёте попадания по вратарю точность в 1 единицу даст перекос в отражении в полтора градуса.

ps: Но на самом деле я это не использую, так и осталось на уровне идей.
Записан

noop

  • Full Member
  • ***
  • Сообщений: 73
Re: Как все-таки нужно было делать
« Ответ #10 : Октября 14, 2014, 02:10:58 am »

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

Еще вариант (из множества): ваш переборный алгоритм решил, что через 40 тиков симуляции игры дотянется до шайбы буквально на десятую пикселя и забьет ее врагу в ворота. Но если не получится, шайбу получит враг, а ваш хоккеист будет ориентирован так, что не сможет ему помешать. Верить оценке или нет? А почему переборный алгоритм, если специально не принимать против этого мер, дает такие опасные комбинации? Потому что эффект горизонта http://en.wikipedia.org/wiki/Horizon_effect

« Последнее редактирование: Октября 14, 2014, 02:21:02 am от noop »
Записан

noop

  • Full Member
  • ***
  • Сообщений: 73
Re: Как все-таки нужно было делать
« Ответ #11 : Октября 14, 2014, 04:42:51 am »

К написанному выше.
Есть еще такое явление, не знаю, как его обзывают, что на множестве допустимых успешных ходов, ограниченном некоторыми краевыми условиями, поисковые алгоритмы обычно находят решения, находящиеся на границе этого множества либо близко к ней. А если это множество является многоугольником/многогранником итд, то на вершинах. Малейшая ошибка, связанная с точностью - и избранное состояние на самом деле оказалось за пределами множества решений. Конкретно моя стратегия не раз пыталась ударить по шайбе, летящей почти строго через центр хоккеиста.
« Последнее редактирование: Октября 14, 2014, 04:47:15 am от noop »
Записан

oparin

  • Full Member
  • ***
  • Сообщений: 59
Re: Как все-таки нужно было делать
« Ответ #12 : Октября 14, 2014, 04:31:07 pm »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Мне казалось, что достаточно просчитать тот момент, когда нужно начинать давать ускорение в противоположную сторону.
Рассчитал формулу прямолинейного движения и если хоккеист ехал по той траектории, которую я рассчитал - значит все гут, иначе заново строил траекторию.
Но это оказалось плохой идеей. Нужно было все таки просчитывать с различными углами... Но на такую формулу у меня не хватило времени.
Записан

ThermIt

  • Full Member
  • ***
  • Сообщений: 67
Re: Как все-таки нужно было делать
« Ответ #13 : Октября 14, 2014, 04:49:37 pm »

По поводу выхода в заданную точку с оптимальной скоростью и углом из текущей точки есть идея с использованием кубической кривой Безье. Но это только идея, хоккеисты на реализацию накладывают слишком жёсткие ограничения и их постоянно перехватывали, из-за чего пришлось быстренько сделать костыль. :-[ В результате только квадратичные кое-где остались...
« Последнее редактирование: Октября 14, 2014, 04:57:24 pm от ThermIt »
Записан

oparin

  • Full Member
  • ***
  • Сообщений: 59
Re: Как все-таки нужно было делать
« Ответ #14 : Октября 15, 2014, 09:57:27 am »

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

DVS

  • Hero Member
  • *****
  • Сообщений: 688
Re: Как все-таки нужно было делать
« Ответ #15 : Октября 15, 2014, 10:12:14 pm »

Наконец-то я вывел формулу определения позиции в следующий тик с учетом угла, ускорения и текущих значений, но без учета столкновений.
Дальше напрашивается применение теории графов (для определения оптимального набора действий, которые приведут хоккеиста в указанную точку), но тут я не силен, да и конкурс уже закончился. Может частичным перебором сделаю. И после окончания песочницы поделюсь формулой тут.
вовремя :)
Записан

alberist

  • Newbie
  • *
  • Сообщений: 2
Re: Как все-таки нужно было делать
« Ответ #16 : Октября 17, 2014, 04:46:19 pm »

Если кому интересно, по окончанию песочницы могу рассказать что и как я рассчитывал. Фактически я грамотно реализовал только четыре вещи: расчет вероятности попадания в ворота, откуда лучше всего бить по воротам, забивание шайбы в одно касание и где ловить шайбу. Остальное просто куча ифов )
Записан

zx-coder

  • Jr. Member
  • **
  • Сообщений: 29
Re: Как все-таки нужно было делать
« Ответ #17 : Октября 17, 2014, 05:16:59 pm »

интересно, думаю можно и статейку написать, серебро все таки)
Записан

alberist

  • Newbie
  • *
  • Сообщений: 2
Re: Как все-таки нужно было делать
« Ответ #18 : Октября 17, 2014, 06:28:29 pm »

интересно, думаю можно и статейку написать, серебро все таки)
Только где разместить?
Записан

zx-coder

  • Jr. Member
  • **
  • Сообщений: 29
Re: Как все-таки нужно было делать
« Ответ #19 : Октября 17, 2014, 07:18:33 pm »

интересно, думаю можно и статейку написать, серебро все таки)
Только где разместить?
Можешь прямо на форуме отдельной темой, типа того
http://russianaicup.ru/forum/index.php?topic=220.0
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #20 : Октября 17, 2014, 07:27:04 pm »

Думаю можно уже рассказать что умеет моя стратегия не вдаваясь в реализацию. Вообще она умеет на удивление мало:

1) Умеет забивать :). Расчет точной траектории шайбы со всеми рикошетами от вратаря и штанги, расчет вероятности попасть в ворота с учетом рандома, расчет вероятности перехвата шайбы защитниками.
2) Умеет перехватывать летящие мне в ворота шайбы, а также готовиться для перехвата если видит что противник замахивается. Так что пасом мне забить проще ;)
3) Умеет забивать с лету, если такой шанс появится не позже чем через 30 тиков. В общем делает это так себе, только при толкотне у ворот иногда срабатывает.
4) умеет подбирать свободную шайбу за кратчайшее время.
5) умеет ехать в заданную область (защитник, замена)

Эти пункты реализованы довольно точно, все остальное куча ифов и жуткие костыли и приближения с оценочными функциями.
Надеюсь меня не забанят, вроде ничего полезного из этой информации за пару дней нельзя высосать...
« Последнее редактирование: Октября 17, 2014, 07:33:09 pm от santa324 »
Записан

Hohol

  • Full Member
  • ***
  • Сообщений: 101
Re: Как все-таки нужно было делать
« Ответ #21 : Октября 19, 2014, 11:11:29 pm »

Только где разместить?
На хабре. И в прошлом и в позапрошлом году организаторы явно предлагали это сделать победителям. Инвайты дадут.
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #22 : Октября 20, 2014, 12:16:10 am »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Я решил это так:
Перебираю различные варианты движения длиной N тиков такого формата: поворот от 0 до m тиков (m < min(60, N)), разгон/торможение от n до N тиков (max(0, m-30) < n < m) для всех возможных m и n при заданном N. У меня N = 70, больше не вписывалось в ограничения по времени.
Этот алгоритм использовал почти во всех местах где перебирал способы движения, число 60 - из соображений что крутиться больше чем на 180 градусов нет смысла, число 30 - из соображений что разгон нет смысла начинать если поворачиваться до цели больше 90 градусов.

Занятие позиции для защиты: перебираем варианты движения и ищем то, которое быстрее приведет к состоянию из которого я по инерции закачусь в заданную область, как только состояние достигнуто (двигаюсь по инерции к заданной области) тягу на 0 и поворачиваемся к шайбе.
Для замены: перебираем варианты движения и ищем то, при котором быстрее оказываюсь в зоне замены со скоростью < 1, если такого нет, то чтобы быстрее до зоны замены без ограничения по скорости.
Если перебор не дотянулся (примерно 300-600 расстояние в зависимости от скорости) работает эвристика.
« Последнее редактирование: Октября 20, 2014, 12:21:39 am от santa324 »
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #23 : Октября 20, 2014, 12:50:02 am »

Все остальное делал аналогично: перебор вариантов движения и поиск лучшего по заданным критериям.
1) Для подбора шайбы: шайба быстрее оказывается в зоне захвата.
2) Для отбивания шайбы летящей мне в ворота: шайба быстрее оказывается в зоне удара и при этом вероятность забить себе ударом минимальна.

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

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

Самым сложным оказалось рассчитать вероятность противодействия противника, перебирать варианты движений противников для каждого варианта моего движения в лоб - не хватит никакого времени. Я составил маску доступности для каждого хоккеиста противника, у маски можно спросить "сможет ли этот хоккеист дотянуться до этой точки через N тиков?". Для всех хоккеистов противника каждый тик составляю маску на 50 тиков вперед. Маска с размером ячейки 4 пикселя, то-есть она дает ложно положительные ответы в пределах этих размеров.

Учет вероятности противодействия противников был добавлен самым последним меду половинок финала. В финале ничего не дал, но в песочнице поднял потом меня до 3го места и держал там почти до конца песочницы.
« Последнее редактирование: Октября 20, 2014, 12:55:49 am от santa324 »
Записан

imwode

  • Full Member
  • ***
  • Сообщений: 56
Re: Как все-таки нужно было делать
« Ответ #24 : Октября 20, 2014, 01:22:26 am »

У меня куча всего, но ничего толком до ума не доведено:
1. Просчет попадания в ворота. Столкновение с вратарем не просчитано, поэтому введен некий коэффициент, который в ряде случаев говорит, что ворота не проьтем, хотя шанс реально есть. Было перепробовано несколько техник - несколько геометрических, пока, наконец, не понял физику шайбы в свободном полете. Последний вариант - тупо итерация скорости/положения шайбы по заданным крайним траекториям отклонения.
2. Соответственно если шайба в ворота не попадает - хватаем ее, если попадает - яростно отбиваем. Если шайба летит в ворота противника и не попадает - подхватываем, если попадает - машем ручкой, молимся.
3. Защитник выкатывается к своим воротам и встает на защиту. Практически с самого начала использовал потенциальное поле для этого. Через это защитник иногда начинает адски тупить, лезть обниматься с вратарем или демонстративно поворачиваться к атакующим противником задом. Но, зачастую, неплохо играет и получает знак отличия "стальная стена"
4. Перехват шайбы - поиск. Причем с пересчетом на каждом ходу. Если поиск тайм-аутится, то тупо едем в направлении шайбы. ОЧЕНЬ много времени потратил на это из-за непонмания сути поиска и попытки подобрать эвристику для преследования _убегающей_ шайбы. Также были различные попытки прикрутить steering behaviors с плавающей глубиной предсказания, и иногда неплохо работало, но тупило в самых критических случаях, хокеисты отворачивались от шайбы и уезжали курить в угол.
5. Перехват хоккеиста - там че-то у меня какой-то ад. Стиринг давал кое-какие результаты, но сбоил на малых дистанциях. А гибрид нормальный построить не получалось. В итоге у меня итеративно высчитывается количество тиков, на которое надо предсказывать, а дальше статический стиринг в точку, где будет предположительно хоккеист через это количество тиков. Поведение хоккеистов плохое, потому что с таким алгоритмом не получаетс яблокировать оппонента и предотвратить его продвижение к моим воротам.
6. С шайбой движение - отдельный филиал ада. Движение в некую точку реализовано через потенциальные поля, которые я периодически принимался отлаживать, но до ума так и не довел. В итоге у меня первые 30 стратегий показывали значительно более хороший выход на огневую позицию, нежели более поздние. Треш такой, что в первом раунде играла команда по доставке пиццы - брали шайбу и ехали к вратарю. Иногда поворачивались и отдавали пас. Так могли всю игру ездить - чем слабее противник, тем хуже. Если противник не вмешивался и не выбивал моих ребят на огневую позицию, они так весь раунд и катались... В последнем варианте - какие-то танцы вокруг точки.
7. Под конец возможность понять что хоккеисты творят и как это исправить была полностью утрачена. В частности, так и не заработала фишка - если все противники в одной половине (например, верхней), то ехать с шайбой в другую (нижнюю). В итоге хоккеист брал шайбу и ломился с ней в толпу. Так и играл до самого конца.
8. Был реализован алгоритм поворота на скорости и замаха с ударом, но он был бажным до самого конца, поэтому хоккеисты часто чудили - замах-отмена-замах-отмена, пока скорость не снидится до нуля. Это связано с тем, что я там и не смог нормально нарисовать для себя таймлайн того, как происходит ход. Т.е. если мы говорим "УДАРИТЬ", то удар произойдет только на следующий ход, сколько там тиков от начала замаха - то ли 20, то ли 19, то ли 21, после удара - шайба то ли остается в точке и скорость меняется, то ли скорость меняется и шайба сразу проходит дистанцию одного тика. В результате адских ночных отладок понимание то приходило, то ускользало, вечером все работало - утром отказывалось, при заливке новых версий рвал лидеров, но ужесно сливал не-лидерам и т.д.
9. Для отладки использовал заливку стратегии и создание боев в лидерами. Очень много времени тратил на отсмотр и дебаг... Визуализацию и нормальный дебаг так и не смог реализовать. Пичалька в этом плане полная...

В итоге полностью осталось для меня непонятным, как оценивать определенное состояние игры и как конвертировать это в мини-заачи для хоккеистов. Очень надеюсь увидеть описания каких-нибудь не-реактивных агентов, как у меня (просто с более хорошей реализацией), а что-то реально аи-шное.
« Последнее редактирование: Октября 20, 2014, 01:41:21 am от imwode »
Записан

imwode

  • Full Member
  • ***
  • Сообщений: 56
Re: Как все-таки нужно было делать
« Ответ #25 : Октября 20, 2014, 01:53:27 am »

Что бы мне очень помогло:
1. Возможность визуализации. Ребят, плагины там какие-то к локалраннеру - ок, но, блин, таким как я - те, кто в питоне-то толком писать не могут, лезть в джаву....
2. Знать сид игры вначале. А не из файла results.txt
3. Перемотка взад/вперед. nuff said
4. Сравнивание своих стратегий "из коробки". Я очень долго не мог это завести. Программисты смеются - им непонятно, что может быть в этом непонятно...
5. Чистое поле и один хоккеист, т.е. гибкая настройка отдельных команд. В частности, если отлаживаешь steering behaviours/potential fields - торчащие тут и там свои/враги реально мешают...
6. Понимание физики. Спасибо не помню уже кому на форуме, кто написал "КАК МНЕ ХОЧЕТСЯ РАССКАЗАТЬ ПРО ФИЗИКУ ШАЙБЫ!". После этого я забил на подбор коэффициентов в формуле силы трения из учебника физики (там по всему выходило, что играет сила лобового сопротивления, а не трения, как написано в правилах - то, что сила названа СИЛОЙ ТРЕНИЯ реально сбивает с толку!). При отскоке от борта - АД. Там если шайба успела уйти за борт меньше значения инвертированной скорости, то скорость просто инвертируется. А если больше - начинается ад. Ребят, я вообще не понял, зачем это. Есть борт, есть шайба - в чем проблема их столкнуть бех ста тридцати switch-case-ов? Нихрена это все? Ну в итоге это не сильно мешает самой игре, но сильно мешает процессу разработки. Люди же работают - если ты протупил на эту хрень четыре часа, то ничего уже в этот день ты отладить не сможешь... В общем, руки иногда опускались...
Записан

mortido

  • Full Member
  • ***
  • Сообщений: 89
Re: Как все-таки нужно было делать
« Ответ #26 : Октября 20, 2014, 02:25:02 am »

Ну раз уж пошли признания:
Физику особо не крутил, ясное дело было движение хокеиста и шайбы + трение + ооочень приблизительно отталкивание от борта. Столкновения хокеистов не было. Даже имея на руках формулы с gamedev не стал их прикручивать - и без них работает, трогать не стоит ;) + хотелось узнать насколько можно далеко зайти без имплементирования точного прогноза.
Поимка шайбы до безобразия просто реализованна - смотрим ее положение в следующий тик, если успеваем доехать до нее за этот тик, то ок. Если нет, смотрим ее следующую позицию и пробуем доехать (используя тривиальное движение к точке) до нее уже за два тика и т.д. Разумеется для каждого хокеиста, пока не найдем ближайшего. Это пересчитывается на каждом ходу, потому неточности физики компенсируются и сглаживаются.
Вероятность попадания считается булевой  ;D немножко геометрии + формулы из правил. Примерно так: если шайба будучи выпущенной ровно прямо пройдет мимо точки где вратарь касается траектории ее движения раньше чем вратарь дойдет до туда, то все ок. Предварительно отсекаем тойже геометрией мертвые зоны из которых 100% не попасть.
Вероятность гола нам: снова решил не лезьт в моделирование физики и воспользовался уравнением прямой и скоростью шайбы. Если летит в ворота и скорость по Y больше 6, считаем опасной траекторией и безжалостно лупим по ней.
Увороты с шайбой не делал вплоть до финала, в последний день перед финалом сделал быстрый набросок функции типа той, что писал смайл в танках, но более грубо: пробуем ехать в 12 разных направлений, за каждый тик в направлении если нас догоняет ближайший противник мы получаем штраф + бонус чем ближе к точке из которой можно бить, и в играх 2*2 это даже заработало и даже неплохо играло после финала в песочнице, правда пришлось немного подкрутить оценку.
Удар в одно касание: если хоккеист тот кто ловит шайбу, если из его позиции можно забить гол с 15 тиками замаха, смотрим, если мы успеваем повернуться и шайба будет в зоне удара, то пробуем ударить с замахом или без. В противном случае просто ловим. (тут вот не помешал бы перебор вариантов, чтобы не только поворот учесть, но и подъехать в нужное место)
Безопасность: если мы с шайбой, то моделируем приближение всех противников к себе и считаем количество тиков в безопасности. Это число используется для выбора операции - пас/ехать к точке удара/бить и т.д.

В целом, в коде очень много допущений и приближений. Возможно, пиши я сейчас сначала, то не стал бы так делать, все-таки, это часто сказывалось, но это был интересный опыт в борьбе против хорошего просчета. 22е место в песочнице, конечно, не призовое, но, надеюсь, это немного придаст мотивации людям, которые не любят физику, т.к. из недокументированных формул я, в итоге, использовал только константы 0.98, 0,999 и 0.25 для трения и отскока шайбы от стенки, которые вроде были известны всем на форуме.
Записан

imwode

  • Full Member
  • ***
  • Сообщений: 56
Re: Как все-таки нужно было делать
« Ответ #27 : Октября 20, 2014, 02:55:27 am »

Да удар по воротам можно вообще квикстартгаевский оставлять, если движение нормальное. Как ты движение-то делал?
Записан

mortido

  • Full Member
  • ***
  • Сообщений: 89
Re: Как все-таки нужно было делать
« Ответ #28 : Октября 20, 2014, 03:19:40 am »

Да удар по воротам можно вообще квикстартгаевский оставлять, если движение нормальное. Как ты движение-то делал?

Ну когда мне надо попасть в конкретную точку (и для симулации движения противника), то тут находится вектор желаемого движения - по направлению к цели, длина его равна максимальной скорости хокеиста. Затем берем текущий вектор скорости и вычитаем его из желанного, таким образом находится вектор в котором нам желательно применить ускорение. Дальше уже зависит от задачи, можно просто поворачиваться в этом направлении и давать ускорение либо -1 либо 1. В случае с защитой если угол на желаемое направление больше чем PI/2 то едем задом по тому же принципу. В данном случае получается довольно хорошая смена направлений к желаемой точке, но все это будет дергаться. Поэтому в разных случаях задается разная зона в которой хокеист никуда не едет и просто поворачивается к цели (например к шайбе). Последняя доработка - это торможение. В принципе там есть трение, поэтому считаю примерно 50 тиков вперед свободного полета, если в свободном полете мы оказываемся там где надо, то сразу начинаем поворачиваться на цель, трение нас остановит + угол уже позволяет защищать.

Насчет движения в атаке я уже писал, что в конечном итоге переделал на оценку движения по 12 лучам на ~150 тиков, получилось очень на глазок, но хокеисты стали уворачиваться от противника и все еще доезжали (хоть и не всегда) до точки удара.
Записан

terX

  • Jr. Member
  • **
  • Сообщений: 27
Re: Как все-таки нужно было делать
« Ответ #29 : Октября 20, 2014, 09:54:53 am »

Я физику разбирать не стал, хотя получил формулу расчета пройденного расстояния с заданным приложенным ускорением с очень высокой точностью
(не использовал)

Для прогноза движения шайбы сделал простой перебор ударов по стенкам под всеми углами, и получил таблицы угла падения/угла отражения от стенок, конечно, с погрешностью в 1 градус, плюс рассчитал таблицу относительного падения скорости шайбы от стенки в зависимости от угла падения. Вот так просто познал мир. Прогнал это все за одну ночь. Обычное линейное уравнение прямой до границ. (без удара в створ ворот)
А также полезное что очень хорошо работало, так это когда игра на 0 в овертайме, из любой позиции когда хоккеист смотрит в створ ворот противника, замах на полную и страйк, чудесным образом все влетало в ближний :)
Записан

Dfire

  • Full Member
  • ***
  • Сообщений: 82
Re: Как все-таки нужно было делать
« Ответ #30 : Октября 20, 2014, 11:03:18 am »

Собственно меня интересует в первую очередь перемещение хоккеиста - алгоритм. Я пробовал некое подобие А*, и для оценки использовал количество тиков за которое я мог бы доехать до точки, если бы мой угол был идеальным, и количество тиков чтобы повернуться на этот угол.

Собственно время подъезда подбирал перебором по t, в некоторых случаях можно вычислить точно по другой формуле.

Формулу вывел такую:
   t - время
   S - вектор перемещения
   V0 - вектор скорости
   Fth - торможение хоккеиста за 1 тик (0,98)

   pow = Math.pow(Fht, t);
   sum = (pow - 1)/(Fht - 1);
   denominator = (Fht/(Fht-1)) * (sum*Fht - t);

   ax = (S.x - V0.x*sum) / denominator;
   ay = (S.y - V0.y*sum) / denominator;

Собственно длина вектора (ax, ay) должна быть меньше максимально возможного ускорения вперед/назад. Угол тоже понятен.
Но полный перебор занимает недопустимо много времени.

Уточнение: Полный перебор по A* занимает много времени. При подсчете оценки t принимает не более 8 различных значений.
« Последнее редактирование: Октября 20, 2014, 11:17:22 am от Dfire »
Записан

Cooler

  • Full Member
  • ***
  • Сообщений: 98
Re: Как все-таки нужно было делать
« Ответ #31 : Октября 20, 2014, 11:05:59 am »

Кто научил хоккеистов попадать из точки А в точку Б ?
Поделитесь секретом, как это сделать за минимальное время? Как это сделать за конкретное время с выходом в точку с нужным вектором скорости и углом поворота?
Потратил на это два дня, но результатом доволен :)
Глобально было 2 кейса:
1. Целевая точка сравнительно далеко, а нормальная (перпендикулярная к направлению на цель) скорость невелика. В этом случае движение состоит из 2 фаз: разгона с гашением нормальной скорости (если юнита заносит вправо, то он поворачивает левее цели), в результате через какое-то время вектор скорости направлен прямо в цель. Тогда зная ускорение торможения можно вычислить за сколько тиков начинать вторую фазу - торможения. Тут еще надо учитывать, что движение возможно как вперед, так и назад.
2. Расстояние до цели мало, а нормальная скорость велика - в этом случае юнит не успеет направить вектор скорости к цели. В этом случае бот прежде всего стремится "положить" вектор скорости на направление к цели, но делает это иначе: поворачивает в сторону вектора скорости (или противоположную) и ставит такое ускорение, чтобы оно было направлено против текущей нормальной скорости. Когда эта задача выполнена - происходит уже простое движение с ускорением/замедлением вдоль прямой.
Точных формул для выбора варианта движения не выводил, ограничился эмпирическими.
В любом случае все маневры заканчиваются заранее, потому что тратить время на точное позиционирование жалко - враг может уже подлетать с шайбой.
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #32 : Октября 20, 2014, 11:16:45 am »

Забыл добавить: физика у меня идеально точно реализована, погрешность в предсказании на сотню тиков вперед в 4м знаке после запятой.
Реализовал не все эффекты для увеличения производительности и экономии времени на разработку - только те что имели существенное значение:
- движение и столкновения шайбы со всем кроме точки стыка штанги и стенки (гол после этого невозможен, случается редко)
- предсказание положения вратаря в любой момент времени
- свободное движение и столкновение хоккеиста с верхним и нижним бортом. Другие столкновения решил что нецелесообразно реализовывать (замедлят перебор, а нужны редко), разве что с вратарем стоило - но не дошли руки.
Записан

Cooler

  • Full Member
  • ***
  • Сообщений: 98
Re: Как все-таки нужно было делать
« Ответ #33 : Октября 20, 2014, 01:41:28 pm »

Вообще стартовал поздно и к первому раунду сделал довольно простую эвристику, которая в первой части облажалась. А на выходных дача... тем не менее за вечер субботы удалось продуктивно поработать и довести эвристику до ума - в итоге она протащила во 2-й раунд и даже весьма неплохо держалась в течение недели перед 2-м раундом, хотя вообще не была рассчитана на режим 3х3. Сейчас глядя на тот коротенький код сильно удивляюсь, что такая простая стратегия более-менее достойно смотрится в бою против значительно более сложного кода :)

Ну а пока она там в песочнице болталась - ковырял физику. С отскоками от бортов все предельно просто, а вот над отскоками от вратаря пришлось повозиться. Запустил бота по имени Stupid, который только и делал, что бил в сторону ворот и собирал статистику. По собранным данным строил различные графики, пытаясь понять закономерность. Тут стало интересно: точки, соответствующие столкновениям с неподвижным вратарем четко ложились на линию, а точки столкновений с подвижным - ложились на совсем другую линию, причем размытую, причем никакой зависимости от скорости вратаря не видно - только от самого фактк движения. Ну, думаю, ладно - разберусь сперва с неподвижным случаем. Но и тут оказалось, что небольшая доля точек ложится на линию подвижного вратаря. Ага, стало быть метод определения подвижности вратаря (положение в текущем тике - положение в предыдущем) неверен. Попробую-ка сравнивать положение в текущем тике и положение в будущем. Вуаля! Все точки легли на одну линию, а если считать параметры столкновения с будущей позицией вратаря, то вообще все точки легли на одну линию. Профит!

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

Также в это время занялся визуализатором, ибо раннер не позволяет делать перемотку взад-вперед, а это критично.
Получилась вот такая штука:

Помимо отображения данных (с возможностью зума и быстрой промотки к важным точкам), визуализатор позволял вызывать код стратегии, чтобы посмотреть почему юнит действует так или иначе и как будет действовать если что-то в коде поменять. Удобно! Правда времени на доработку самой стратегии уже не осталось и 2-й раунд она слила. Кстати, когда вражеский хоккеист делает удар или пас - он отображается не у того юнита, так и не понял почему, возможно баг в языковом пакете (запрос последнего действия хоккеиста).

Что касается перебора траекторий, то я делал так: генерил набор случайных траекторий по некоторому правилу и оценивал их. Правила таковы: с вероятностью 7% на очередном тике меняется ускорение (-1, 0, 1) и/или поворот (-1, 0, 1). Параметры взяты не с потолка, а подобраны так, чтобы покрыть максимум возможных промежуточных положений минимальным кол-вот траекторий. На самом деле это даже не рандом, ибо в целях воспроизводимости сид всегда выставлялся в одно и то же значение - просто такой способ генерации траекторий. Для разных ситуация использовались различные оценочные ф-ции. Так, для случая подбора шайбы предварительно рассчитывались оценки и оптимальные углы для забивания сходу, и если какая-либо траектория давала высокую вероятность такого удара, то перебор продлевался в несколько раз, чтобы повысить точность. При этом если назревает удар с замахом, то перед началом замаха резервировался 1 тик не корректировку угла (ибо в переборе рассматривались только повороты на максимальный угол).

В какой-то момент решил сделать прогнозирование доступности точек врагами на 48 тиков вперед. Можно было бы это сделать заранее просчитанной маской, но этот вариант не учитывает Agility (либо нужно делать много масок) и столкновения (а тут уже ничто не поможет). Поэтому поступил аналогично: брал 1000 случайных траекторий врагов, на основании их составлял карту возможных позиций и после некоторой оптимизации (как алгоритмической, так и по памяти в плане кэш-промахов) использовал её. Увы, оказалось, что мой Turbo Delphi генерит весьма странный код с FPU, в котором совершенно неожиданно на ровном месте возникают задержки по ~300 тактов. В итоге стратегия тратит по 3-5 минут. В принципе допустимо, но тестировать крайне некомфортно. Было несколько идей что с этим делать: переписать код под fixed point, или (намного лучше) переписать под SSE - но в любом случае требовались ассемблерные вставки и код становился довольно страшным. В итоге вся эта фича, на которую было потрачено почти 3 дня, так и не была задействована, т.к. профита от неё немного, а замедление очень существенное.
Записан

mortido

  • Full Member
  • ***
  • Сообщений: 89
Re: Как все-таки нужно было делать
« Ответ #34 : Октября 20, 2014, 02:38:22 pm »

Визуализатор выглядит мощно, а игры загружать как репитер он может?
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #35 : Октября 20, 2014, 03:05:44 pm »

Запустил бота по имени Stupid, который только и делал, что бил в сторону ворот и собирал статистику. По собранным данным строил различные графики, пытаясь понять закономерность.
В начале делал так же, и дошел до того же, экспериментальную зависимость изменения тангенциальной скорости от глубины погружения во вратаря. Но дальше дело встало, все выбросил и декомпильнул локал ранер, это оказалось гораздо продуктивнее :)

Правила таковы: с вероятностью 7% на очередном тике меняется ускорение (-1, 0, 1) и/или поворот (-1, 0, 1)
Какой смысл в траекториях в которых несколько раз меняется направление движения туда-сюда?
« Последнее редактирование: Октября 20, 2014, 03:08:16 pm от santa324 »
Записан

Cooler

  • Full Member
  • ***
  • Сообщений: 98
Re: Как все-таки нужно было делать
« Ответ #36 : Октября 20, 2014, 05:03:54 pm »

Визуализатор выглядит мощно, а игры загружать как репитер он может?
Он грузит логи, создаваемые стратегией. Т.е. запускаю репитер, стратегию - получаю лог, а дальше можно его изучать визуализатором.
Записан

planB

  • Jr. Member
  • **
  • Сообщений: 33
Re: Как все-таки нужно было делать
« Ответ #37 : Октября 20, 2014, 05:21:53 pm »

Моё ноу-хау было определение вероятности забить гол. Смотрю, что люди решали это сэмплами траекторий, но есть и другой подход. Скорее всего он тоже кем-то использовался.
Смысл в том, чтобы определить сектор удара, который гарантированно дает гол. Он определяется двумя параметрами - максимальным и минимальным углом, назовем их a и b. Их вычисление я не буду приводить, с вашего позволения.
А дальше есть 2 варианта забить - ударом и пасом. Они похожи, расскажу про удар:

Удар, как всем известно, происходит с нормальным распределением, у которого мат. ожидание (m) равно значению угла, куда смотрит хоккеист в данный момент и известным среднеквадратичным отклонением sigma, которое можно получить с помощью функции game.getStrikeAngleDeviation().

Итак, нам известны 4 параметра - a, b, m и sigma.
Воспользуемся функцией нормального распределения F, которая, в отличие от привычной нам плотности вероятности в виде колокола, имеет интересующее нас свойство - с помощью неё можно вычислить вероятность попадания значения в определенный интервал: p(a < x < b) = F(b) - F(a).
Для каждого языка можно найти функцию стандартного нормального распределения (для c++ использовал реализацию отсюда: http://www.johndcook.com/cpp_phi.html). Стандартное нормальное распределение имеет m = 0 и sigma = 1, поэтому нам потребуется перевести наше нестандартное распределение в стандартное с помощью нехитрых вычислений.

Итоговая формула вероятности забить гол ударом имеет вид: strikeProb(a, b, m, sigma) = F((b-m)/sigma) - F((a-m)/sigma).
Для паса мы сами можем выбирать m. Очевидно, что максимальная вероятность будет достигаться со значением m, которое ближе всего к (b-a)/2.

Вместе с выходом защитника навстречу нападающему, точное вычисление вероятности гола принесло мне +400 рейтинга, я даже побывал в топ-39 :D
Записан

imwode

  • Full Member
  • ***
  • Сообщений: 56
Re: Как все-таки нужно было делать
« Ответ #38 : Октября 20, 2014, 05:47:39 pm »

Ну я несколько раз доходил до 20 места - учитывая убогость стратегии, понимаешь, что это мало что значит. Интересно было бы квик-старт гая запустить в чемпионат и посмотреть на его результаты
Записан

planB

  • Jr. Member
  • **
  • Сообщений: 33
Re: Как все-таки нужно было делать
« Ответ #39 : Октября 20, 2014, 05:49:58 pm »

В последней формуле F - это уже функция стандартного, а не исходного распределения.
Квик-старт гая я запускал с одним изменением - он старался подъехать в зону удара, а не бить с любого места. До первого раунда это был уровень ~2200.
Записан

santa324

  • Full Member
  • ***
  • Сообщений: 142
Re: Как все-таки нужно было делать
« Ответ #40 : Октября 20, 2014, 06:43:08 pm »

Смысл в том, чтобы определить сектор удара, который гарантированно дает гол. Он определяется двумя параметрами - максимальным и минимальным углом, назовем их a и b. Их вычисление я не буду приводить, с вашего позволения.
Я отказался от этого варианта так как не придумал как просто рассчитать эти a и b. Интересно как это можно сделать?
Записан

steleal

  • Full Member
  • ***
  • Сообщений: 96
Re: Как все-таки нужно было делать
« Ответ #41 : Октября 20, 2014, 07:14:39 pm »

Я для себя так рассчитывал (правда, в посылки не вошло):
0) Отсеивающие условия по скорости, дальности и направлению, чтоб лишнего не считать.
1) Определял , попаду ли в участок  ворот от штанги до расчетного положения вратаря без учета возможных отклонений.
2) Если попаду, считаем дальше.
3) границы интервала: alfa - отклонение на штангу, beta - отклонение до траектории, где возможно столкновение с вратарем.
4) вероятность  попадания шайбы в интервал от alfa до beta по формуле Лапласа p(alfa<X<beta)=Ф((beta-a)/sigma) - Ф((alfa-a)/sigma),
где a - угол удара, alfa, beta см выше, sigma = 2 градусам (ну приведенным к силе и усталости, конечно), Ф - по таблице от 0 до 2 через каждые 0.01, Ф(x>2) считаю равной 0.475.

Ну и если вероятность забить гол на этом ходу больше 50%,  на следующем ходу больше, чем на текущем, и не отберут не выбьют шайбу, то ждем следующего хода, иначе бьем на текущем.
« Последнее редактирование: Октября 20, 2014, 07:20:19 pm от steleal »
Записан

ud1

  • Full Member
  • ***
  • Сообщений: 97
Re: Как все-таки нужно было делать
« Ответ #42 : Октября 20, 2014, 07:40:35 pm »

Хотелось бы еще исходный код стратегий посмотреть, свой я выложил здесь http://www.gamedev.ru/flame/forum/?id=192787&page=19
Записан

steleal

  • Full Member
  • ***
  • Сообщений: 96
Re: Как все-таки нужно было делать
« Ответ #43 : Октября 20, 2014, 07:47:42 pm »

Ну, мне хвастаться нечем.
А вот от alberist, Mr.Smile, recar жду статей :-)
Да и в код santa324 тоже не откажусь заглянуть :-)
« Последнее редактирование: Октября 20, 2014, 07:50:05 pm от steleal »
Записан

2E3S

  • Jr. Member
  • **
  • Сообщений: 14
Re: Как все-таки нужно было делать
« Ответ #44 : Октября 20, 2014, 08:01:51 pm »

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

Хаки:
- Когда можно будет скоро бить, поворот делается не до дальнего угла, а вычисляется координата хокеиста через X<20 тиков (время ближайшему оппоненту до шайбы), и угол ставится относительно нее в дальний угол ворот. Это неплохо улучшило забиваемость.
- Если надо было поворачиваться до дальнего угла, но можно было туда пасануть, он пасовал.
- Брать или отбивать шайбу полузащитнику и защитнику, довольно легко вычисляется, там вероятность зависит от скорости шайбы и равномерно уменьшается, я брал на вероятности 80%, плюс можно всегда брать если шайба летела не между вратарем и штангой, в ворота ли - сравнение углов до штанг, во вратаря ли - косинус траектории шайбы ко вратарю умножить на расстояние до вратаря, приблизительно.
- Классным ходом было еще полузащитнику и защитнику бить оппонентов на своем поле при контратаке нападающего, мешая им воспрепятствовать атаке. В одной версии полузащитник мог атаковать чужого защитника, если успевал туда раньше нападающего, так умели делать многие топ-50, но по неизвестной причине эта версия в конце игры молча падала.

Очень простые принципы вывели меня в 150, доведение поведения до желаемого вывело в полусотню, это при том, сколько не реализовано. Думаю, любой старшеклассник может достичь того же результата. Мелочей хотя и множество, но в основном стратегия действует так, как умозрительно действовал бы я. Одна из ключевых функций - estimate_ticks_to[unit/point], с помощью нее можно оценивать ситуацию на поле.
Записан

ud1

  • Full Member
  • ***
  • Сообщений: 97
Re: Как все-таки нужно было делать
« Ответ #45 : Октября 20, 2014, 08:07:09 pm »

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

steleal

  • Full Member
  • ***
  • Сообщений: 96
Re: Как все-таки нужно было делать
« Ответ #46 : Октября 20, 2014, 08:14:39 pm »

В полусотне я бывал)), с примерно такими же принципами. Более точный расчет ударов по воротам не заливал на сервер, т.к. имеющаяся (сырая) версия проигрывала более агрессивной четырнадцатой.
Зато лишний раз убедился: пилить сразу несколько фич - зло! :-)

Upd. И все же смайл с alberist оторвались от остальных сильно.
Записан

oparin

  • Full Member
  • ***
  • Сообщений: 59
Re: Как все-таки нужно было делать
« Ответ #47 : Октября 20, 2014, 09:20:59 pm »

Если кому интересно вот мой алгоритм определения позиции хоккеиста в следующий тик:

public class NextPos {
    public static Point2D value = new Point2D.Double(0, 0);
    public NextPos(double speedUp,double x,double y,double sx,double sy,double a,Game game){
        double sVector = hypot(sx,sy);
        int myKoeff = (sx>0 ? -1 : 1);
        double currAngleX = 0;
        double currAngleY = 0;
        if (sx != 0){
            currAngleX = Math.atan(sy/sx)-Math.PI*myKoeff;
        }
        if (sy != 0){
            currAngleY = Math.atan(sy/sx)-Math.PI*myKoeff;
        }
        double speedFactor = (speedUp>0 ? game.getHockeyistSpeedUpFactor() : game.getHockeyistSpeedDownFactor());
        double nextSx = sVector*0.98*myKoeff *Math.cos(currAngleX)+speedFactor*0.98*speedUp*Math.cos(a);
        double nextSy = sVector*0.98*myKoeff *Math.sin(currAngleY)+speedFactor*0.98*speedUp*Math.sin(a);
        value = new Point2D.Double(x+nextSx, y+nextSy);
    }
}


Записан

planB

  • Jr. Member
  • **
  • Сообщений: 33
Re: Как все-таки нужно было делать
« Ответ #48 : Октября 20, 2014, 10:13:09 pm »

Я отказался от этого варианта так как не придумал как просто рассчитать эти a и b. Интересно как это можно сделать?

Это вопрос тем, кто обладает навыками декомпиляции и знанием java и смог рассчитать физику столкновений шайбы с вратарем и со штангой. Нам, простым смертным, приходилось использовать эвристики. Мои были такими:


Я немного слукавил, когда говорил про "точный" расчет вероятности. Из-за неточного вычисления углов сектора у меня скорее получалась оценка вероятности снизу. Сюда не входят вероятности рикошетов от штанги и вратаря. Если физика была бы доступна, а аналитический расчет траекторий невозможен, я бы сделал поиск граничных значений методом делением отрезка пополам. Правда, это были бы те же сэмплы траекторий, зато в меньшем количестве и с большей точностью результата (вероятности гола).
Записан

Cooler

  • Full Member
  • ***
  • Сообщений: 98
Re: Как все-таки нужно было делать
« Ответ #49 : Октября 20, 2014, 11:37:01 pm »

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

Мой код: V44

P.S. UD1 - там в посте на gd.ru только картинка, без ссылки на файл.
Записан
Страницы: [1] 2 3