Chat:Ru/2020-06-17
735487: я смотрю tomatoes еще что то придумал и уже рекурса порекал. до смита не так далеко
ilt: Это точно, до смитса один шаг
ilt: Почти все кто были в голде ушли в легу из этого чата
ilt: Uljahn только что-то раскачивается пока
tutubalin: Uljahn ждёт нумбу
tutubalin: GitHub хочет переименовать master в main
Munchkin: Обожаю свои комментарии...
Munchkin: # + = -
Uljahn: в телеге спрашивают, что за игру мы обсуждаем постоянно, лол
Hamibar: оооо, томатос рекурса порекал
Uljahn: неужели без книги дебютов?
tomatoes: теклзы и со стороны ноликов ответ на теклзы у смитса взял попользоваться
Hamibar: нужно попробовать ответ на теклзы сделать
tomatoes: смитс всегда одинаково в ответ на них ходит
Uljahn: наверное, потому что они в книге
tomatoes: книгу пока вообще не представляю как сделать
tomatoes: да и наполнять потом ещё
Uljahn: первые ходы у всех захардкожены, наверное
Uljahn: 4-4, 5-5
Uljahn: смитс упоминал про свою систему представления книги, где автоматически учитывается симметрия, и что она не двоичная и не троичная
Uljahn: книга 8кБ занимает у него, глубина 12-40 вроде
tomatoes: MSmits: I think my current leaderboard version has no opening book for player 2
MSmits: there's no point when everything solves as a loss, you're just making it easier for the other guy
Uljahn: тут ошибка у него
Uljahn: он рассматривает идеальную игру
Uljahn: но в реале у всех куча эвристик
Uljahn: нико не пробовал за нолики надо стремиться сводить на ничью?
Uljahn: -надо
Uljahn: т.к. выигрыш у топа ноликами маловероятен, можно попробовать дать ничьим оценку выше, чем маловероятным победам
Hamibar: вроде кто-то говорил, что у него разные значения за ничью ноликов и крестиков
Hamibar: в любом случае можно поробовать
tomatoes: я вчера пробовал смарт роллауты сравнивать и обычные. и смарт похоже чаще сводят в победу кого нибудь
tomatoes: что в принципе логично :thinking:
735487: Uljahn: тсс не пали контору ))
735487: я пару дней назад себе добавил в оценку за крестики ничья хуже чем за нолики
MelnikovIgor: amurushkin и насколько помогло?)
735487: намного стабильнее стало и против топов стал чаще выигрывать на глаз
735487: но коэффициент подобрать это жесть. не уверен что сейчас лучший
Hamibar: смити мувы заметно прибавки дали
Hamibar: с 18 на 10
ilt: а что такое смити мувы?
Uljahn: ответ на теклесы
Hamibar: ilt посмотри на первые 6 ходов у смита за нолики. Вот это они
735487: хмм. себе что ли сделать. выглядит как мастхев фича
Hamibar: попробовать точно стоит
wlesavo: ого tomatoes порекал рекурса, хорош
Hamibar: мне кстати ничего не дало изменение счета за ничьи.
Uljahn: https://cgmulti.azke.fr/statistic на daily графиках хорошо видно движуху в крестиках, самый популярный мульти сейчас, когда PR2 закончился
Hamibar: ну кстати возможно смити мувы не так много дают и просто повезло с сабмитом.
ilt: логически они дают бонус
Hamibar: ну или последний не слишком удачный)
wlesavo: неплохо залез
Hamibar: хм. а теперь измененными коефами за ничью туда же пролез. Мб действительно дают больше стабильности
Hamibar: оу у меня бага какая-то оказывается
Uljahn: или фича
Hamibar: такая себе фича, которая сразу к проигрышу ведет)
Uljahn: ну, щас пофиксишь и в топ-5 сразу
Hamibar: да она редкая 7 раз за сабмит
Hamibar: хах, можно не фиксить
Hamibar: она появляется когда я уже никак не могу выиграть
tomatoes: из-за солвера при проигрыше у меня бот сдаётся и делает первый попавшийся мув
tomatoes: думаю фиксить или бестолку :thinking:
Hamibar: по идее надо бы)
Uljahn: смотря за сколько ходов
Uljahn: до конца партии
Uljahn: против днища леги может уменьшить вероятность проигрышей (если они бывают), т.к. противники слабые и могут допустить ошибку
735487: имхо все равно надо фиксить и выбирать самый упорный. и надеятся что противник не сможет
Hamibar: так сдается же когда невозможно не проиграть
Hamibar: там как угодно ходи
Uljahn: нет, это значит при любом твоём ходе у противника есть контрход
735487: это может быть твой бот просчитал что ты проигрываешь в 20 ходов. а у противника может и нет
Uljahn: но не факт, что противник его выберет, особенно если у него дерево ещё не достроено до конца
Hamibar: а ну если так. Я думал если про 100% проигрыш
Uljahn: смит вон ходов за 10 уже видит результат, так у него и роллаутов дохрена
Uljahn: 100% проигрыш может быть, когда только вынужденные ходы остались
735487: или когда на любой твой ход у противника есть ответ который ведет его к выигрышу. но он может его и не найти
735487: это как в шахматах. бывали случаи когда играет два супер гросса. типа чемпиона и топ 3
735487: комп показывает что у одной из сторон выигрыш в 56 ходов :)
735487: а они то не вкурсе. и сыграли в ничью
Uljahn: ахах, договорняк)
735487: это еще что. куча случаев когда в выигранной позиции ничью предлагают. человек же не комп
Uljahn: вполне возможно, из-за истощения нейромедиаторов, такое-то напряжение несколько часов испытывать
Uljahn: Automaton2000: зачем мне орден? я согласен на медаль :)
Automaton2000: дело в том что ты не знаешь
735487: просто не каждую позицию человек может точно оценить еще
Uljahn: ну да, не у всех книга эндшпилей в голове есть
Uljahn: т.е. база шахматных окончаний
735487: ну окончания это отдельная тема. я сейчас больше о середине игры говорил
Uljahn: я бы сказал, только очень малое количество позиций человек может точно оценить
Uljahn: Automaton2000: плюс-минус два слона
Automaton2000: у тебя же там связи есть, ты их напряги чтоб серебро уже открыли
735487: https://www.codingame.com/share-replay/473271200 надо же за нолики смита обыграл ))
735487: Uljahn: а ты играешь в шахматы?
Uljahn: давно играл, но слабенько
Uljahn: мне гриды не нравятся)
Uljahn: 1600 на личес
735487: положил начало дебютной книге на ифах )))) пока 5 штук вписал ))))
Uljahn: на глубину 5?
Uljahn: или без учёта симметрии на ход вперёд?
735487: без учета симметрии тупо одну линию на 5 ходов
735487: ну этого чет совсем мало
735487: херово сабмит идет
Uljahn: tomatoes уже карлисо рекает)
Uljahn: ноликами
735487: он нашел золотую жилу ))
tomatoes: повысил ноликам приоритет ничьей и вроде против него лучше стало
Uljahn: а, там ничья
Uljahn: тоже не плохо
735487: о смит повержен
735487: хехе временно обошел смита. уже почти :)
tomatoes: как-то нолики надо бустить в сторону ничьей похоже
tomatoes: или эвристику разную для о/х делать
735487: ну я просто за ничью ноликам больше даю а крестикам за ничью меньше
tutubalin: а я вам когда ещё говорил, что тут есть беспроигрышная стратегия сведения к ничьей
Uljahn: за нолики?
Uljahn: смитс говорил, что пока не смог найти гарантированную ничью
tutubalin: это надо полное дерево построить )
Uljahn: т.е. для любой ничьей он идёт от конца партии и всегда находит ошибку крестиков, после исправления которой нолики гарантированно проигрывают
tutubalin: хм
tutubalin: интересно
Uljahn: у него мета-MCTS месяцами крутится на машине
tutubalin: ну там надо чуть-чуть больше миллионов лет, чтоб всё просчитать )
Uljahn: логи нашёл
Uljahn: http://chat.codingame.com/pastebin/865dcea6-0965-4814-b795-6288c6657822
Uljahn: https://cg.spdns.eu/wiki/Chat:World/2020-06-08
Uljahn: там ниже ещё про книгу дебютов довольно много
Uljahn: вот бы поиск какой по логам прикрутили на сайте, а то приходится всё скачивать и локально искать...
ilt: Дописал в лог вывод свободной памяти
ilt: Standard Error Stream: http://chat.codingame.com/pastebin/8a0e8ba7-7188-4637-b951-2b54bddfd9ca
Hamibar: хах, поставил ноликам за ничью скор, как и за победу. Думал, что даже в топ 50 не выду. А по итогу 17
tutubalin: Uljahn MCTS исследует не всё дерево
ilt: в процессе роллаутов GC несколько раз запускается
tutubalin: когда я брутфорсный солвер натравливал, находил такие ноды, где из 5 ходов один выигрышный, остальные проигрышные
tutubalin: MCTS может его забраковать
Uljahn: очевидно
ilt: что с этим можно сделать?
Uljahn: выбирать по LCB?
ilt: похоже таймаут случается когда GC запускается ближе к концу лимита
Uljahn: а, ты про память
ilt: да я про память и таймауты
Hamibar: а почему у тебя 20мб остается
ilt: это то что джава показывает
Hamibar: просто получается, что ты 680МБ забиваешь? или это как-то по другому работает
ilt: total Bytes 119169024
ilt: выделяется изначально
ilt: и это цифра не меняется
ilt: локально цифра может меняется, может не меняться
ilt: на сервере она стабильная в течении одной игры
Hamibar: странно как-то. Надо у тех кто на жавке пишет спросить
ilt: сейчас тут таких нет похоже :)
ilt: думал поймаю нижний предел и на него поставлю доп. ограничение в контроль времени
ilt: не ловится оно
ilt: или я что-то не так делаю
VitaliKhileuski: а вот что вы тут
VitaliKhileuski: обсуждаете постоянно
VitaliKhileuski: я просто только в клеш оф код играю
Uljahn: AI bot programming, или иначе - мультиплееры
Uljahn: клэши - это слишком поверхностно, имхо
VitaliKhileuski: ну кому что интересно
VitaliKhileuski: так и в чем заключается ваш бот програминг
Uljahn: пишешь программу, она сражается против других программ на арене
Uljahn: в гоночки не пробовал играть?
Sargerus: я задолбался уже с этими гоночакми
VitaliKhileuski: ну это странно писать
VitaliKhileuski: как я понял
VitaliKhileuski: обрабатывает данные кто-то другой
VitaliKhileuski: а я могу поменять
VitaliKhileuski: к примеру вид хранения
VitaliKhileuski: инпутов
Munchkin: Я пятый)
VitaliKhileuski: ну я 1 раз заходил
VitaliKhileuski: вам просто вопрос как к опытным
VitaliKhileuski: что я пойму зайдя второй раз
VitaliKhileuski: да ничего
Uljahn: в гоночках есть чит, как в золотую лигу попасть легко
Uljahn: лучше конечно без спойлеров, своим умом
Uljahn: да и кроме гоночек есть куча других мульти, без физики
Sargerus: откуда про чит знаешь?)
Uljahn: на контесте его юзали 4 года назад
Sargerus: скорее всего пофиксили, я форум читал
Uljahn: про магическую формулу? :smirk:
Uljahn: это по сути эвристика, очень простая и очень эффективная, компенсирует занос, машинка начинает дрифтовать по чекпоинтам
735487: странно у меня в гоночках формула с делением дает больше сим чем без деления ))
Sargerus: если угол больще 60 ставишь аксель = 100, иначе = 0
Sargerus: я так 5 боссов порвал
Sargerus: с людьми почему-то не работает
Uljahn: если угол по модулю меньше 60, наверное, тогда 100
Uljahn: но есть и покруче формула, только надо вычислять проекции вектора скорости
gybson_samara: с *3 пофиг на угол и сразу в голду =)
Sargerus: я их вычислил, не могу из бронзы выйти
Uljahn: хотя это просто разность координат с предыдущим ходом
Uljahn: вычитаешь 3*скорость из координат чекпоинта и начинаешь дрифтовать
Uljahn: вот и вся формула
Uljahn: для наглядности можно включить дебаг режим в плеере
Sargerus: дрифтовать - громко сказано, учитывая, что управлять можно даже не скоростью, а ускорением(
Uljahn: ускорение тут - просто разовая прибавка к скорости, а основная проблема, что машинка не может мгновенно поворачиваться - не более 18 градусов за ход
Uljahn: ну и трение 15% ещё действует, уменьшает суммарную скорость каждый ход
Uljahn: вот почти и вся физика
Sargerus: стой, а разве скорость доступна как переменная?
735487: ее можно посчитать
Sargerus: акселерейшон каждый фрейм?
735487: нет по сути это пройденное расстояние за 1 фрейм
tutubalin: в гоночках в голду можно пройти за 100-150 байт на JS
tutubalin: 109 байт на питоне у меня. но можно ещё короче
Sargerus: а я думал это состязание алгоритмов, а не размеров программы
tutubalin: это я к тому, что ооооочень простое и короткое решение
Sargerus: я тупой, лдя меня это не работает((
tutubalin: 144 байта на JS - это уже в топ700 в голде
Sargerus: то есть размер бинарника или чего бы там ни было учитывается ?
735487: нет. есть только ограничение на максимальный размер кода
Uljahn: сам алгоритм настолько простой, что можно ужать в 100 символов по сути
Uljahn: это ещё одно из развлечений - code golf, там как раз размер учитывается
Uljahn: на CG даже раздел есть с подобными задачками, ну и в клэшах встречаются, режим shortest
Uljahn: скорость видно, когда режим дебага в плеере включаешь, в настройках
Uljahn: голубая стрелка
Uljahn: красная линия указывает цель, если всегда целиться в центр чекпоинта, то дрифтовать не получится, очевидно. поэтому используют динамическое смещение цели на три вектора скорости
Uljahn: изи голд
Sargerus: так пажжи, то есть я могу менять цель пода?
Uljahn: именно
Uljahn: суть как раз в этом, но менять не абы как, а по умному
Sargerus: ничего не понятно, но очень интересно)
Uljahn: https://www.codingame.com/replay/473173385
Uljahn: вот пример
Sargerus: https://www.codingame.com/share-replay/473299104
Sargerus: может еще кто-то мат часть стоящую за этим знает?
Uljahn: за чем именно?
Sargerus: за тем, что нужно для дрифта пода указывать именно это значение? или это просто единоразовая формула7
Uljahn: нам надо ускорением скомпенсировать часть имеющейся скорости, которая перпендикулярна направлению на чекпоинт, т.е. составляющая, которая приводит к промахиванию, если так можно выразиться. практически можно рассчитать нужный оптимальный угол, на который надо повернуть, и ускорение, которое надо применить, чтобы не промахиваться
Uljahn: эта формула позволяет приблизительно скомпенсировать этот эффект без тригонометрии
Uljahn: можно попробовать вместо тройки использовать коэффициент 2 или 4, и посмотреть, что получится
Uljahn: тут именно решается проблема медленного поворота (максимум 18 градусов за ход), т.е. ты начинаешь поворачиваться заранее
Sargerus: то есть проще говоря, в какой-то момент под начинает разворачиватся на 180г? я правильно понял?
Uljahn: мы смещаем цель в зависимости от текущей скорости, чтобы под заранее начал поворачивать
Uljahn: ща найду ссылку
Sargerus: о, ссылка это хорошо, досатавать не буду)
Uljahn: https://gamedevelopment.tutsplus.com/tutorials/understanding-steering-behaviors-seek--gamedev-849
Uljahn: https://cdn.tutsplus.com/gamedev/authors/legacy/Fernando%20Bevilacqua/2012/10/08/steering_forces.png
Uljahn: суть в этой картинке
Uljahn: у нас ускорение всегда применяется по направлению пода, а направление меняется в зависимости от цели, которую мы указываем
Uljahn: поэтому нам надо указать не центр чекпоинта, а немного другую цель, чтобы ускорение пошло по линии steering
Uljahn: тогда итоговая скорость будет направлена на чек
Uljahn: проще не могу объяснить :)
Sargerus: я должен указать на вектор стиринга
Sargerus: вот что означало твое "выравнивание"
Uljahn: угу, ты находишься на позиции красного квадрата, и должен развернуть под по синему направлению
Uljahn: потом скорость и ускорение складываются векторно
Sargerus: в нашем случае speed получается current_velocity... аааааааааааааааааааа
Sargerus: все, спасибо) я понял)
Uljahn: :thumbsup:
Uljahn: если от таргета отложить current_velocity в противоположную сторону, как раз и получится магическая формула -3*Vel
Uljahn: https://i.imgur.com/HyCgPxh.png
Uljahn: вот примерно нарисовал
Uljahn: -3*Vel
Uljahn: в качестве цели вместо центра указываем изменённые координаты: checkpoint_x - 3*velocity_x, checkpoint_y - 3*velocity_y
Uljahn: скорость находим как текущие координаты минус координаты прошлого хода, т.е. надо ещё пару переменных ввести, чтобы их хранить
Uljahn: вот ещё давно как-то моделировал, что с подом происходит при постоянном повороте, там видно какой большой угол между текущей скоростью и ускорением https://i.imgur.com/X0DYONK.jpg
Hiker: есть кто-то онлайн кто умеет качать реплеи?)
Uljahn: да
Hiker: слушай подскажи, есть 2 вопроса
Uljahn: ты плейграунд смотрел?
Hiker: 1. я делаю все по заветам ейлера и видосику ромки нефига не получаю стдин. Получается апиха не отдает стдин или я кривой? ну типо для пакманов я не получаю ни описание левела на 0 ходу, ни список палеток на каждом шагу
Hiker: только чертовы свои ходи туда, ходи сюда
Uljahn: ты уже JSON смотришь?
Hiker: и тут до меня доперает, что эти хацкеры просто дублируют в стдерр весь вход?
Hiker: ну да смотрю джейсонку и там туп о мове 1 10 1 | ..
Uljahn: нет, в реплее содержится вся инфа об объектах, которые отрисовывает вьюер
Hiker: хм, но не в том виде что мне на вход стдин приходит?
Hiker: там есть конечно какой-то трешак в непонятном формате...
Uljahn: угу, формат там сложный
Hiker: как раз в каких-то тегах типо вьювер, но так его еще парсить, сейчас пример кину
Hiker: наркомания..
Hiker: и не документированный и свой для каждой игры?
735487: ага
Hiker: господе а почему так криво
Hiker: (надеюсь кг не читает по русски)
Hiker: в чем суть??
Hiker: просто заколебать?)
Uljahn: я давно ковырялся, с тех пор формат изменился, но я делал так: создавал объекты, из реплея брал инфу для инициализации, потом каждый фрейм обновлял
Hiker: та ну я наверно просто сделаю, чтобы мой бот дублировал весь вход в стд ерр...
Uljahn: суть в том, что хотели сделать компактно
Uljahn: у них миллиард реплеев хранится на сервере)
Hiker: ну и получается, надо начиная шпилить в какой-то новый контест, смотреть этй джейсонку, сопостовлять с тем что реально происходит на карте и писать свой парсерочек
Uljahn: угу :(
Hiker: а идея с дублированием в стдерр может проканать?
Uljahn: да, но придётся ключ указывать
Hiker: мда ну это жестяка если честно
Hiker: всем же нужны реплеи
Hiker: (
Uljahn: а зачем?
Hiker: а тут вместо того чтобы писать бота
Uljahn: обучать нейронку?
Hiker: нет дебажиться
Uljahn: сейчас другим путём пошли - стали выкладывать серверный код игры, т.е. рефери
735487: многие дебажаться и без выкачивания реплеев :)
Hiker: я весь контест гонял с отладочной печатью, ну это лютейшим образом тормозит процесс
Hiker: накинул ПРИНТЕФОФ перезалил, перезапустил
Hiker: ужас
Hiker: а как дебажиться без выкачивания реплеев
Uljahn: с рефери ты можешь локально запускать игру, правда там всё на джяве
Hiker: вроде в веб ИДЕ нету
Hiker: мммм
Hiker: локально запускать.... звучит неплохо
Hiker: а дефолтный ботик таместь?
Hiker: ну хотя можно против себя гонять
Hiker: а надеюсь запустить локально рефери и игру тоже не просто? то я уже после попыток с реплеями не пойму если будет просто =)
Uljahn: реплеи парсить сложнее, мне кажется
Uljahn: это вообще край
BorisZ: и у эйлера и у ромки качается stderr, они сами туда дублируют инпуты, и локально своим визуализатором просматривают
BorisZ: точнее не совсем так
BorisZ: в самом боте, запускаемом локально есть кусок, который отдает инфу визуализатору
BorisZ: а локальному боту отдается stderr скаченный
BorisZ: бот должен быть детерминированный только
Hiker: ну да. приколно, что именно сама фишка - дублировать инпут в стд ерр ни у одного ни у второго не упоминается =)
Hiker: я чуть все волосы не вырвал пока понял, что они так читерят =)
Hiker: у ромки в видосике трык-пык и вот он текстовый файл
Hiker: со всем инпутом=)
Hiker: ладно, всем спасибо, я понял подходы, буду дальше пробовать и локально моет позапускаю и стдерор подублирую, посмотрю что легче
BorisZ: почему читерят то - нашли простое и надежное решение проблемы
Hiker: спасибо
BorisZ: красиво наоборот
Hiker: ну ладн, читерят тут было использовано в значении hack
Hiker: с оттенком хакерской ценнтости, а не с оттенком жульничества
BorisZ: у эйлера было написано что он когда дублирует инпут - просто выводит, а когда свою дебаг инфу то строка с префиксом
BorisZ: не помню где он это писал
BorisZ: свой поток ошибок все равно нужен, на сайте быстрее просматривать
Uljahn: реплеи на сайте хранятся с потоками ошибок, но чтобы получить свой поток, надо указать ключ в API
Uljahn: пароль от аккаунта или типа того
tutubalin: скорее OAuth или типа того
tutubalin: причём ключ из браузера не работает, надо скрипт отдельно логинить
Uljahn: ага
YurkovAS: amurushkin ходы смитса сделал?
735487: да 5 штук для одной ветки
YurkovAS: тоже экспериментировал локально и в бенче - не заметил прироста. уже узнаю первые 5 ходов)
YurkovAS: может нужен солвер? в той статье он типа на 15% круче, чего достаточно, чтобы заметить разницу
YurkovAS: но как-то сложно там, так и не понял. и не нагуглил другого примера солвера
735487: как я понимаю солвер начнет работать когда ветка до конца будет доходить. а это уже под конец игры
735487: я пробовал его закодить. но или не вышло или не закодил нормально хз ))
YurkovAS: или ждать, пока другие проверят :smiley:
tomatoes: да, там с конечной ноды наверх идёт
tomatoes: у меня он как-то криво сначала получался, потом все бесконечности убрал и отдельным флагом у ноды сделал решена ли и за кого
YurkovAS: addToTree(bestChild) а эта функция у тебя есть?
tomatoes: нет такой
YurkovAS: что-то не понятное, буду ждать, пока amurushkin проверит
735487: дык я проверял уже давно. так и не смог заставить его работать в плюс ))
tutubalin: Hiker накинул ПРИНТЕФОФ перезалил, перезапустил
я сделал макросы, которые позволяют мне регулировать, что выводить в stderr в зависимости от уровня дебага
tutubalin: теперь не нужно удалять/комментировать логи. просто выставляю уровень 0 (вообще тишина) или 1 (только необходимую сводку в конце о количестве роллаутов и т.д.) - и можно сабмитить не опасаясь тормозов из-за логов
tutubalin: уровень 2 - краткие дополнительные сообщения уровень 3 - дебажная инфа уровень 4 - вообще подробно рассказывает о каждом сделанном шаге. приводит к таймауту, но зато легче ловить баги