Chat:Ru/2020-06-17

From CG community
Jump to navigation Jump to search

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: в гоночки не пробовал играть?

Default avatar.png Sargerus: я задолбался уже с этими гоночакми

Default avatar.png Sargerus: 3 день сижу

VitaliKhileuski: ну это странно писать

VitaliKhileuski: как я понял

VitaliKhileuski: обрабатывает данные кто-то другой

VitaliKhileuski: а я могу поменять

VitaliKhileuski: к примеру вид хранения

VitaliKhileuski: инпутов

Munchkin: Я пятый)

Default avatar.png Sargerus: попробуй сначала

VitaliKhileuski: ну я 1 раз заходил

VitaliKhileuski: вам просто вопрос как к опытным

VitaliKhileuski: что я пойму зайдя второй раз

VitaliKhileuski: да ничего

Uljahn: в гоночках есть чит, как в золотую лигу попасть легко

Uljahn: лучше конечно без спойлеров, своим умом

Uljahn: да и кроме гоночек есть куча других мульти, без физики

Default avatar.png Sargerus: откуда про чит знаешь?)

Uljahn: на контесте его юзали 4 года назад

Default avatar.png Sargerus: лол)

Default avatar.png Sargerus: скорее всего пофиксили, я форум читал

Uljahn: про магическую формулу? :smirk:

Uljahn: это по сути эвристика, очень простая и очень эффективная, компенсирует занос, машинка начинает дрифтовать по чекпоинтам

735487: странно у меня в гоночках формула с делением дает больше сим чем без деления ))

Default avatar.png Sargerus: если угол больще 60 ставишь аксель = 100, иначе = 0

Default avatar.png Sargerus: я так 5 боссов порвал

Default avatar.png Sargerus: и >15k место

Default avatar.png Sargerus: с людьми почему-то не работает

Uljahn: если угол по модулю меньше 60, наверное, тогда 100

Default avatar.png Sargerus: ой, да)

Default avatar.png Sargerus: ну вы поняли

Uljahn: но есть и покруче формула, только надо вычислять проекции вектора скорости

gybson_samara: с *3 пофиг на угол и сразу в голду =)

Default avatar.png Sargerus: я их вычислил, не могу из бронзы выйти

Default avatar.png Sargerus: ((

Uljahn: хотя это просто разность координат с предыдущим ходом

Uljahn: вычитаешь 3*скорость из координат чекпоинта и начинаешь дрифтовать

Uljahn: вот и вся формула

Uljahn: для наглядности можно включить дебаг режим в плеере

Default avatar.png Sargerus: дрифтовать - громко сказано, учитывая, что управлять можно даже не скоростью, а ускорением(

Uljahn: ускорение тут - просто разовая прибавка к скорости, а основная проблема, что машинка не может мгновенно поворачиваться - не более 18 градусов за ход

Uljahn: ну и трение 15% ещё действует, уменьшает суммарную скорость каждый ход

Uljahn: вот почти и вся физика

Default avatar.png Sargerus: стой, а разве скорость доступна как переменная?

735487: ее можно посчитать

Default avatar.png Sargerus: акселерейшон каждый фрейм?

735487: нет по сути это пройденное расстояние за 1 фрейм

tutubalin: в гоночках в голду можно пройти за 100-150 байт на JS

tutubalin: 109 байт на питоне у меня. но можно ещё короче

Default avatar.png Sargerus: а я думал это состязание алгоритмов, а не размеров программы

tutubalin: это я к тому, что ооооочень простое и короткое решение

Default avatar.png Sargerus: я тупой, лдя меня это не работает((

tutubalin: 144 байта на JS - это уже в топ700 в голде

Default avatar.png Sargerus: то есть размер бинарника или чего бы там ни было учитывается ?

735487: нет. есть только ограничение на максимальный размер кода

Uljahn: сам алгоритм настолько простой, что можно ужать в 100 символов по сути

Uljahn: это ещё одно из развлечений - code golf, там как раз размер учитывается

Uljahn: на CG даже раздел есть с подобными задачками, ну и в клэшах встречаются, режим shortest

Uljahn: скорость видно, когда режим дебага в плеере включаешь, в настройках

Uljahn: голубая стрелка

Uljahn: красная линия указывает цель, если всегда целиться в центр чекпоинта, то дрифтовать не получится, очевидно. поэтому используют динамическое смещение цели на три вектора скорости

Uljahn: изи голд

Default avatar.png Sargerus: так пажжи, то есть я могу менять цель пода?

Uljahn: именно

Default avatar.png Sargerus: ...

Uljahn: суть как раз в этом, но менять не абы как, а по умному

Default avatar.png Sargerus: ничего не понятно, но очень интересно)

Uljahn: https://www.codingame.com/replay/473173385

Uljahn: вот пример

Default avatar.png Sargerus: :thumbsup:

Default avatar.png Sargerus: https://www.codingame.com/share-replay/473299104

Default avatar.png Sargerus: спасибо огромное

Default avatar.png Sargerus: может еще кто-то мат часть стоящую за этим знает?

Uljahn: за чем именно?

Default avatar.png Sargerus: за тем, что нужно для дрифта пода указывать именно это значение? или это просто единоразовая формула7

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

Uljahn: эта формула позволяет приблизительно скомпенсировать этот эффект без тригонометрии

Uljahn: можно попробовать вместо тройки использовать коэффициент 2 или 4, и посмотреть, что получится

Uljahn: тут именно решается проблема медленного поворота (максимум 18 градусов за ход), т.е. ты начинаешь поворачиваться заранее

Default avatar.png Sargerus: то есть проще говоря, в какой-то момент под начинает разворачиватся на 180г? я правильно понял?

Uljahn: мы смещаем цель в зависимости от текущей скорости, чтобы под заранее начал поворачивать

Uljahn: ща найду ссылку

Default avatar.png 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: проще не могу объяснить :)

Default avatar.png Sargerus: я должен указать на вектор стиринга

Default avatar.png Sargerus: я начинаю вдуплять

Default avatar.png Sargerus: вот что означало твое "выравнивание"

Uljahn: угу, ты находишься на позиции красного квадрата, и должен развернуть под по синему направлению

Uljahn: потом скорость и ускорение складываются векторно

Default avatar.png Sargerus: в нашем случае speed получается current_velocity... аааааааааааааааааааа

Default avatar.png Sargerus: все, спасибо) я понял)

Uljahn: :thumbsup:

Uljahn: если от таргета отложить current_velocity в противоположную сторону, как раз и получится магическая формула -3*Vel

Default avatar.png Sargerus: просто -vel

Default avatar.png Sargerus: просто -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 - вообще подробно рассказывает о каждом сделанном шаге. приводит к таймауту, но зато легче ловить баги