Chat:Ru/2020-06-21
amurushkin: чет я не пойму. в last batles куча проигрышей томатосу а место поднялось до 6 )))
tomatoes: может это 1:1 которые
amurushkin: ты походу смита уже серьезно порекал
tomatoes: 16 / 14 / 2 на cg stats
tomatoes: тяжко, но немного обхожу
amurushkin: без книги?
tomatoes: без неё
amurushkin: это получается у тебя такая крутая эвристика?
tomatoes: скорее удачная
amurushkin: а как по твоим ощущениям вообще стоит заморачиваться с солвером?
tomatoes: прирост даёт, но небольшой
tomatoes: между собой сталкивал с солвером и без, получилось 55/50/5
Uljahn: шухер в топе наводите?)
tomatoes: вроде и с карлисо начинает что-то получаться, раньше в сухую проигрывал
amurushkin: ну конечно без книги побить чуваков с книгами это сильно
Uljahn: ничьи решают
Uljahn: https://www.codingame.com/replay/473764591 интересная игра, на 39-м ходу (7-1) карлисо ошибся что ли? оценка сразу подскочила
Uljahn: надо было 6-1?
Uljahn: потом начал фримувы раздавать
tomatoes: на 37 ошибся вроде, вместо 8 5 надо было 6 5
Uljahn: угу, тоже подумал, что раньше ошибка была
tomatoes: 8 5 -19.66 6 5 77.28
tomatoes: насчитало у меня
Uljahn: а чё у тебя за эмодзи?
Uljahn: прикольно, можно много инфы закодировать
tomatoes: а это солвер
tomatoes: точнее когда полностью доходит, так то он всегда работать должен когда начинают конечные ноды появляться :thinking:
amurushkin: а почему у тебя так моло роллаутов под конец?
amurushkin: у меня наоборот больше и больше становится
Uljahn: там солвер
Uljahn: зачем роллауты?
tomatoes: если выигрываю то стопаются роллауты
tomatoes: если проигрываю то по идеи идут, но возможно уже до конечных нод раскрыто всё
Uljahn: кстати, никто не задумывался, как могут влиять свои интенсивные вычисления на чужого бота?
Uljahn: т.е. если вместо останова роллаутов гонять до конца времени какой-нибудь мусор, чтобы в кэш поднасрать)
tomatoes: а вроде кто-то собирался тут грузить чужого бота
Uljahn: размышления построены на гипотезе, что оба бота на одном ядре выполняются
Hamibar: томатос двигает нас к топу) интересно насколько большой прирост дает книга
Uljahn: книга даёт прирост против других книг
Uljahn: но это её ещё рассчитать надо
Hamibar: просто поначалу казалось, что гнига просто маст хев фича в топе. А теперь уже есть сомнения
Hamibar: Интересно если смити уберет книгу, то каким будет
Uljahn: он вроде сабмитил без книги без потери мест
Uljahn: вот у миарема -10 мест получилось без книги
Uljahn: или около того
vrabosh: Может подскажите.. вот моя формула (2+1) / (5+8)
vrabosh: слева мои показатеи по каждой клетке, 2 это ничья локальная если сюда похоажу
vrabosh: +1 это глобальная клетка на которой идется игра.. и если ее захвачу то всеравно проиграю
vrabosh: с права тоже самое это противника.. 5 это 100% победа этой клетки.. ну и там 8 это по сути тоже 5, глобальная победа
Hamibar: ну видимо с книгой все же лучше)
vrabosh: эта стратегия играет на золото половину игроков выигрывает
amurushkin: в моем понимании как раз книга должна давать прирост не против книг а против тех у кого их нет
vrabosh: дальше я пытаюсь рекурсией идти... но результат не какого
vrabosh: рекурсия такая... я как будто походил, передаю ход противнику.. он тоже самое делает и потом возращает результат формулы и я этот результат прбавляю вкоцнет формулы
vrabosh: (2+1) / (5+8 + res) - т.е. сюда.
tomatoes: с минимаксом и эвалом я помоему до 50 голды дополз, но там какой-то ужас был в оценке
vrabosh: противник тоже ходит, и также прибавляет.. т.е. получается мах мах - или тут тоже надо минимакс?
vrabosh: что такое эвал?
tomatoes: оценка
vrabosh: а сейчас как играешь?
tomatoes: минимакс потому что на своем ходе ты выбираешь ход с максимальной оценкой, а на ходе противника с минимальной
tomatoes: сейчас монте карло
vrabosh: на первом ходе все норм.. я свою оценку делю на его
vrabosh: но когда он меня опять сканирует.. он делит своей на меня.. этож норм?
Uljahn: почему делишь? разве не вычитать надо?
vrabosh: разница какая?
vrabosh: просто минус может быть
vrabosh: а у меня на 0 завязан, ходить сюда нельзя
Uljahn: хд
vrabosh: хотя яж макс беру потмо.. разницы нет.. просто думаю иногда может быть ошибка ... когда все ходы будут не выигрышные
amurushkin: нельзя так делать имхо
amurushkin: оценивай отдельно свой ходи и противника
vrabosh: ну по сути что a - b сделать что a/b - онож по сути показывет какой круче ход
amurushkin: только на своих ходах выбираешь лучшее для себя а на его ходах худшее для тебя
vrabosh: 1-2, 1-3 и 1/2, 1/3 - и там и там первый круче
amurushkin: хорошо а теперь добавь еще одну вложенность
vrabosh: tomatoes, расскажи плз как ты делаешь
vrabosh: amurushkin , и от тебя былобы интересно послушать
amurushkin: у меня MCTS
Uljahn: руками писать эвристики - это тупик, имхо
vrabosh: мой ход a/b где a-это я. потом пративинк ходит a/b где a противник.. потом опять я
vrabosh: яж доконца не дохожу.. поэтом не могу сказать что выиграю 100% или нет.. поэтому такая оценка..
Uljahn: "MSmits: my opening book usually doesnt go deeper than 10-12, but i can make an exception when another player is using one, i will just force down a specific branch and go 40 deep if i want to"
Uljahn: amurushkin: книга даст преимущество над игроком без книги, если ты сумеешь найти хороший ход, когда противник пойдёт не по книге
vrabosh: amurushkin, монтекарло это когда ты идешь по дереву, и если выиграл то возращаешь 1/1 а на все другие варианты 0\1?
vrabosh: и потом x\y и то что больше то круче?
vrabosh: я вот помнишь скидывал функцию, ты сказал ерунда, это типа мое монтекарло было) и он дольше в 10 раз работает у меня чем минимакс на простых крестиках 3х3
Uljahn: т.е. книга даёт только общую статистику для варианта, либо придётся дохрена инфы хранить в ней по слабым ходам
Uljahn: vrabosh: в монтекарло нет дерева, с деревом - это MCTS
tomatoes: если на питоне, то там сложно роллауты быстрые сделать
Uljahn: без нумбы - да
amurushkin: vrabosh: в MCTS учитываются победы и количество посещений. эдакая статистика
Uljahn: но даже 500 роллаутов хватает для середины голды
vrabosh: что за нумба?
vrabosh: amurushkin , ну как я перечислил?
Uljahn: либа для питона, но её нет на CG
amurushkin: vrabosh: как ты я не совсем понимаю почему у тебя все время дроби
vrabosh: ну типа я походил в клетку 1
vrabosh: он пересчитал все варианты ходов, их 100.
vrabosh: и из них 10 выигрышных?
vrabosh: получается 100\10
vrabosh: ой 10\100
Uljahn: а что значит "выигрышных"?
vrabosh: что я выиграл
amurushkin: почитай лучше про MCTS.
vrabosh: если брать обычные 3х3, то что я заполнил 3 вряд
Uljahn: как ты в начале игры узнаешь, что выиграл?
vrabosh: в конце игры
vrabosh: он же все варианты прошел до конца
Uljahn: но если ты на одной миниборде 3х3 выиграл, это не означает победы на большой борде 9х9
vrabosh: это я пример для одной показал.. тоже самое можн ои на 9х9 считать
Uljahn: :sweat_smile:
vrabosh: ну естественно за это рвемя все не посчитаешь
vrabosh: можно для начала брать за выигрышь 9 на 9 это захват клети или если противник открыл все поле.
Uljahn: можно, но это будет эвристическая оценка
vrabosh: это то что перечислил не mtcs&
Uljahn: MCTS даёт статистическую оценку, которая не зависит от стратегий
vrabosh: как?
Hamibar: а в минике разве не эвристиками работают?
Uljahn: в минике - да
Uljahn: vrabosh: в MCTS используется формула для выбора наиболее перспективного хода на основе собранных статистик случайных игр
Hamibar: мне кажется миник здесь сложно сделать. Вернее хорошую эвристику для него
Uljahn: можно начать с многорукого бандита и формулы UCB1
amurushkin: нужна функция с 81 слагаемыми. будет самая крутая оценка ))
Uljahn: Hamibar: именно
vrabosh: т.е. я прошелся на 1 глубине, потом 2 глубину прошелся, 3 итд... и потом как время подходит к концу... смотрю какая ветвь дает лучший результат?
Uljahn: самая крутая оценка - это нейросеть
Uljahn: vrabosh: это ты про минимакс говоришь
Uljahn: минимакс - это брутфорс всех вариантов, оценка и выбор лучшего, но качество зависит от оценки
vrabosh: а вы спарсили игры и потом из этого сделали какой ход лучший?
amurushkin: нет
Uljahn: в MCTS исследуются наиболее перспективные варианты на бОльшую глубину, а плохие варианты почти не исследуются
Uljahn: и оценка статистическая, за счёт рандомных игр
vrabosh: а как ты вначале узнаешь что иследовать?
Uljahn: никак
vrabosh: я могу пойти в 1 клетку и там меня глубина заведет на 100 ходов
Uljahn: поэтому надо иметь быструю симуляцию, чтобы быстро собирать статистики
Uljahn: так глубина не сразу строится, а помаленьку
vrabosh: и чем это от минимакс отличается? раз ты всеравно брутфорсишь
Uljahn: сходили разок - посмотрели результат, если ок, то углубляем, если не ок - идём в другой вариант
vrabosh: результат то как потом вычисляешь? какую оценку давать этому ходу
Hamibar: перспективные ветки исследуются глубже и лучше.
Hamibar: к тому же нет эвристики
Uljahn: оценка по результату рандомных игр
Hamibar: а просто статистика побед поражений
Uljahn: посмотри лучше видосы на ютубе, там хорошо объясняют MCTS
Uljahn: в вики не очень понятно
vrabosh: ну типа я идут в 1 клетку.. и дашел до 1 победы, потом во вторую, там до 2 и 3 поражений? так?
Hamibar: мы так убеждаем перейти на мктс) но если хочешь минимакс, то вроде на нем возможно пройти в легу
vrabosh: типа массив формирую..?
vrabosh: я понять хочу просто)
Uljahn: как бы массив, но в массиве - дерево
Uljahn: а в дереве - количество посещений и счёт
Uljahn: ты так не поймёшь, мне кажется, а только запутаешься
vrabosh: ну это понятно.. что дерево. и в итоге потом если я проходил это дерево в предыдущем ходу, то я знаю результат.. а тем временм считаю то что не проходил?
Uljahn: не, там на основе теории вероятностей всё работает
Uljahn: и мат. статистики
Hamibar: Лучше статейки какие-нибудь почитать.
vrabosh: 0:[1,2,-1,5,2,...] 0->1:[1,1,2,3,0,...] 0->2:[0,1,-3,1,2,...]
Hamibar: Так лучше разберешься, чем в чатике
Uljahn: каждый вариант оценивается по формуле UCT, выбирается та ветка, где значение выше, и так далее, пока не упрёшься в неисследованную область
vrabosh: чтото типа такого? где 0 это первый ход, а 1,2 это уже на втором ходу?
vrabosh: посути дерево уже формируется до инпута?
vrabosh: а памяти хватает?
vrabosh: это же гигабайты инфы
Uljahn: дерево не полное же
Uljahn: там только верхйшка
Uljahn: верхушка
vrabosh: сколько даю памяти?
Uljahn: 768
Uljahn: у меня получается на питоне 600Мб заюзать, но там пустота практически
vrabosh: это если потом чистить
Uljahn: 3 секунды уходит
vrabosh: на что 3 сек?
Uljahn: на выделение массива нод
Uljahn: это заготовка дерева, чтобы потом заполнять эти ноды и не париться с выделением памяти
Hamibar: а че так долго? или питон инициализирует все объекты?
Uljahn: я не разобрался с выделением, просто нули выделяет быстро, но в рабочем наборе программы не учитывает, а когда начинаешь потом заполнять - начинает учитывать
Uljahn: ленивое выделение, как сказал tutubalin
Uljahn: а если выделяешь и заполняешь сразу, то медленно получается
vrabosh: через нампи выделяешь?
Uljahn: угу
vrabosh: на нем типа поидеи меньше места занимает
Uljahn: наверное, там плюсовые функции со своими интерфейсами
Uljahn: поэтому и профилировать нампи не получается
vrabosh: как это профилировать?
Uljahn: замерять время исполнения различных частей кода из-вне
Uljahn: там не только время, но и использование процессора, кэшей, памяти и т.д.
Uljahn: из питона все вызовы уходят в numpy и профайлер их не различает, т.е. чистый питон профилировать просто, а с numpy - хрен
vrabosh: понял, ты не обычным таймом время считаешь?
vrabosh: типа сколько тактов код выполняет?
Uljahn: это я локально пробовал
Uljahn: на CG кроме таймеров я ещё частоту проца считываю и использование памяти
vrabosh: о круто.. типа на полную он загружен иль нет?
Uljahn: не, тут код выполняется в виртуалках, а виртуалки запускаются на разном железе
vrabosh: и как потом эту инфу используешь?
Uljahn: встречаются 3 типа процессоров с разной частотой, соответственно на более быстром посчитается больше
Uljahn: поэтому, когда спрашивают про количество роллаутов, люди дают вилку, т.к. это число зависит от процессора, на котором исполняется бот
Uljahn: разница может быть порядка 30%
Uljahn: иначе как измерять оптимизации?
vrabosh: да и комп еще может быть загружен
vrabosh: у меня иногда на vpn помню так приложения простые просидали.
Uljahn: где?
vrabosh: давно правда это было.. там где впн арендовал
Uljahn: по идее, если выделяется одно ядро на CG, то его частота не должна ограничиваться, если только в DC нет проблем с охлаждением
Uljahn: ну и левые задачи не должны вытеснять ботов
vrabosh: как комп это адекватно просчитает? когда параллельно таких виртуалок 100шт
vrabosh: что типа каждому надо ровно по 100мгерц выделить
Uljahn: ну так там компы с десятками ядер
vrabosh: ну это если только на 1 виртуалку 1 ядро
Uljahn: так и делают
vrabosh: а память как учитывать?
Uljahn: я на стековерфлоу нашёл пару вариантов
vrabosh: полюбому гдето посадка может быть
Uljahn: или ты про какую память? оперативку в виртуалке выделять?
vrabosh: да
vrabosh: типа там тоже выделяется сразу кусок и он не трогается?
Uljahn: так там жёстко задано 768Мб максимум на бота
vrabosh: ее можно выделить жетско с 10байта по 1к байт это твое.. а может надо еще 10к, щаз найду где есть свободно
Uljahn: как у них реализовано - только богу известно, они эту систему придумывали, когда ещё докеров не было)
Uljahn: думаю, одним куском сразу резервируется, но это не точно
vrabosh: а как вообще кэш проца используется? он же быстрее наверно раз в 100 чем к помяти обращаться
vrabosh: на Си это все как я понял можно учитывать?
Uljahn: как обычно используется, часто читаемые данные оседают в кэше
vrabosh: кто этот алгоритм задает? программа или ос?
vrabosh: или что?
Uljahn: микрокод проца, наверное
vrabosh: 250 место в золоте уже.. ресабмитится не хочется
vrabosh: а вы предварительно считали первые ходы?
vrabosh: ну типа в простых крестиках.. если я хожу в центор а противни не походил по углам то он проиграет
vrabosh: так и тут допустим я кудато походил.. то есть ходы где он проиграет если не туда на 2 ход поставит
vrabosh: и такое на 2-3 хода заранее просчитать у себя и скопировать сюда
Uljahn: все конечные состояния просчитываем, чтобы победу определять быстро
Uljahn: для одного игрока это 512 вариантов
Uljahn: не все из них возможны, но это пофиг
vrabosh: 512 на 9х9 доску?
Uljahn: 3х3
Hamibar: по сути большая доска это тоже 3 на 3, только в клетке ничья может быть
vrabosh: наверно не поняли меня
vrabosh: допустим противник походил на 0 0 в 0 доске, я точно знаю, куда мне ходить чтобы не проиграть.. потом он походил и я точно знаю на след ход куда ходить чтоб не проиграть
vrabosh: хотя 2 хода это уже 6561 :) на третий ход уже не занести предварительно
Hamibar: так в том то и дело, ты не знаешь куда сходить, чтобы не проиграть. Если ты про большое поле
vrabosh: но даже эти 2 хода, дают возможность дерево просчитывать на 2 хода заранее
vrabosh: почему незнаешь?
vrabosh: разве нет нечейных ходов как в 3х3?
vrabosh: точнее разве нет ходов проигрышных?
Hamibar: наверное есть беспроигрышная стратегия, но ее никто не знает
vrabosh: вот я точно знаю что если я походил в центр, а протиник не в угол то он проиграет
vrabosh: у себя на компе не кто не просчитывал?
vrabosh: или это очень при очень много вариантов?
Hamibar: на маленькой доске конечно, но победа на меленькой не гарантирует победы в партии
Hamibar: через пару миллионов лет мб кто-то досчитает
vrabosh: пнятно.. думал тут быстрее
vrabosh: точно.. сложность же 81**81
vrabosh: а сколько вариантов тогда получается, если просто выиграть на одной клетке.
vrabosh: конец игры можно минимаксом просчитать. когда там штук 15 остается клеток пустых..
zuko3d: ну не с самого же начала конец игры просчитывать =)
vrabosh: до конца играть тем что щаз, а потом подключать просчет
vrabosh: а начало до первой победы возможно можно просчитать хотябы пару ходов..
vrabosh: вот только не могу сообразить, реально это или тоже годами считать будет)
Uljahn: солвер в MCTS что-то подобное делает
vrabosh: кароче надо симуляцию сделать дляначало игры.. и пробовать это все эксперементировать.
YurkovAS: солвер начинает просчитывать до конца с 20-го хода.
Uljahn: vrabosh: если сможешь потом симу на Си переписать, то и в легу сможешь попасть
vrabosh: можно также считать только те ходы где я выгодно стою
zuko3d: ну вот у меня на плюсах код, но пока не в леге =( правда, я вижу баги :D
zuko3d: мб надо их исправить и будет всё ок
Uljahn: 100%
YurkovAS: солвер начинает находить терминальные ноды с 20-го хода. ну все дерево прочитывает за 5 последних ходов. примерно
zuko3d: у меня сим получается как-то мало, 40к на первых ходах и 100к ближе к концу
Uljahn: MCTS работает даже с багами, вот в чём проблема
zuko3d: ага =(
Uljahn: wlesavo вон вообще на изи вкатился в легу, меньше недели на плюсах
vrabosh: кто может сходу сказать, сколько вариантов до первой победы 1 клетки?
Uljahn: ?
vrabosh: я хочу просчитать с нуля все варианты где я выигрываю первые клетки..
Uljahn: есть 15 уникальных начальных ходов с учётом всех симметрий
vrabosh: хотя это наверно больще чем потом после первой клетки, всю игру выиграть..
vrabosh: так всетаки нашли эти ходы?
wlesavo: да, я в легу вкатился хотя у меня ничьи так баговано считались, что если выйгрыша нет на доске то в 90% случаев ставилась полная ничья
vrabosh: например я походил 0-0, а противник 0-1, то я допустим 100% при любом раскладе первый захвачу клетку, пускай это возможно не выиграет игру.. - это сколько вариантов?
Uljahn: но там нет 100%
Uljahn: всё зависит от расклада как раз
vrabosh: хотя лучше кнечно просчитать так, чтобы у меня выигрышно стояли точки.
Uljahn: 0-1 означает, что тебе придётся играть в другом квадранте, и если ты сыграешь 1-3, то противник будет играть опять в первом
Uljahn: и у него уже будет перевес
vrabosh: неважно, мне интересно знать, 100% куда не стоит ходить, куда стоит, чтобы первым захватить поинт
Uljahn: ой, 0-3 конечно
Uljahn: вряд ли это возможно выяснить
Uljahn: надо тренировать нейросеть
vrabosh: и сколкьо этот просчетов надо сделать
vrabosh: это возможно, вопрос во сколько это обойдется
Uljahn: и велика вероятность, что нейросеть ничего не выучит :(
Uljahn: ценность каждой клетки определяется положением на других клетках, придётся учитывать вообще всё и даже больше
Uljahn: feature engineering называется
Uljahn: когда мы создаём виртуальные параметры из комбинации наблюдаемых
Uljahn: а потом скармливаем нейросетке и надеемся, что она разберётся)
Uljahn: Automaton2000: ты чё, пёс, я - датасайнтист!
Automaton2000: при том что я не умею
vrabosh: мне кажется, что сложность задачи находа первого выигрыша примерно такая (81*9*9*8*8*7*7*6*6*5*5*4*4*3*3*2*2)
vrabosh: это не так и много.. за 30сек поидеи у себя на компе можно просчитать
vrabosh: а это означает, что можно теоретически найти первые ходы, где либо ты первый захватываешь, а лучше чтобы мои крестики стояли по парна больще чем у противника
vrabosh: точнее на более выигрышных позициях
Uljahn: ты не смотрел реплеи в топе леги?
vrabosh: хотя я смотрю у меня даже при этой ситуации не плохо играет
vrabosh: мне подкрутить оценку на варианты где противнику просто бесмыслено ходить, пускай он там и захватит точки.. и потом подконец когда 15 клеток остается минимакс
vrabosh: Uljahn, нет не смотрел
Hamibar: zuko3d на самом деле не нужно прямо очень много сим, у меня 30-40к
TTeaLL: ребят, я ночью писал про свою проблему, не подскажете, возможно ли такое, что за время по в игре проходит анимация, происходят 2 хода вместо одного?
Uljahn: покажи реплей
Uljahn: и проверь код на возможность вывода двух аутпутов в один ход
wlesavo: TTeaLL листай кнопкой вправо по одному ходу, анимация иногда чуть чуть рассинхронизирована с выводом, но если по ходам листаешь то все хорошо будет.
wlesavo: ух ты, тот же код на 25ое сабмитнулся
Uljahn: :muscle:
wlesavo: дочитал наконец-то книгу про реинфорс, пожалуй попробую в крестики чтонибудь обучить примитивное хотя бы
Uljahn: в простые крестики или сразу в uttt?
Uljahn: "I trained a Keras model for 3x3 TicTacToe (3 iterations, 25 episodes, 10 epochs per iteration and 25 MCTS simulations per turn). This took about 30 minutes on an i5-4570 without CUDA."
Uljahn: lol
Uljahn: uttt будет годы обучаться, наверное
Uljahn: нашёл репу альфазиры с обученной моделью для простых крестиков - 32Мб ахах
wlesavo: сразу в уттт наверное, хзхз, не верю что оптимизированное обучение столько займет, там сильно проще алгоритмы типа TD() для нард обучались за 10^6 игр на древних компах, а тут крнестики 30 минут, это бред
Uljahn: нарды же линейные
Uljahn: похожи на oware
wlesavo: так крестики обычные сильно проще чем нарды
Uljahn: а, ну да. но там же селфплей
Uljahn: это же alpha zero
wlesavo: ну так и тут селфплей
Uljahn: ну и сеть видимо очень глубокая, надо дофига эпизодов
wlesavo: короче надо попробовать, но 30 минут на обучение обычных крестиков это бред
Uljahn: странно, почему маленькую сеть не взять было
Uljahn: рекурс говорил, за 30 минут он топового бота в гоночках обучает
wlesavo: да можно даже однослойную если просто оценивать вероятность победы
wlesavo: рекурс недавно говорил что для серчрейса там чтото в районе 50мс обучение заняло
Uljahn: We trained a PyTorch model for 6x6 Othello (~80 iterations, 100 episodes per iteration and 25 MCTS simulations per turn). This took about 3 days on an NVIDIA Tesla K80. :joy:
Uljahn: это даже не 8х8
wlesavo: это где?
Uljahn: https://github.com/suragnair/alpha-zero-general
Uljahn: жесть какая-то у них в крестиках, 4-хслойная свёрточная + 2 полносвязных, зато police и value на выходе, вроде бы
Uljahn: Automaton2000: типичный оверкил
Automaton2000: это я к тому что у меня не было
wlesavo: так они просто взяли ту же сеть что и в альфа зеро, пофиг что для крестиков это тотальный оверкил
wlesavo: я понимаю как эти ребята которые кучу Atari игр тренировали по видео фреймам, там оправдано еще такая дженерализация
Uljahn: и правда
Uljahn: архитектура везде одинаковая
YurkovAS: может лучше нейронку сначала сделать в csb, oware - где они точно хорошо играют? и детали всегда можно поспрашивать...
Uljahn: повторять чужие успехи не так интересно
YurkovAS: что за книгу вы такую прочитали, после которой готовы нейронки делать?
wlesavo: Reinforcement Learning: http://chat.codingame.com/pastebin/524540bd-ee4c-4df1-983f-1379aad3546c
YurkovAS: wlesavo спасибо
wlesavo: офигенная книга, даже не в плане нейронок а просто алгоритмика реинфорса последовательно и круто рассмотрена
wlesavo: я думаю тебе очень зайдет
YurkovAS: "гляжу в книгу - вижу фигу": это про меня. если есть готовые примеры, может быть пойму. а так то интересно сделать бота для ксб...
vrabosh: на русском есть эта книга?
Uljahn: есть похожая https://obuchalka.org/2017091096341/obuchenie-s-podkrepleniem-satton-r-s-barto-e-g-2014.html
zuko3d: wlesavo расскажешь потом про успехи? Я вот как доделаю солвер для эндшпилей в uttt - буду там пилить RL с нейросетками.
vrabosh: я мотрю там даже картинки некотоыре одинаковые
Uljahn: 2014 год - это прошлый век по нынешним временам, инфа устаревает за месяцы
Uljahn: по RL алгоритмам, я имею в виду
Uljahn: правда и мути много нагоняют, мухлюют с бейзлайнами, чтобы соту набить
wlesavo: zuko3d ну если чтото получится то конечно
vrabosh: пока этому всему научишься и попрактикуешь лет пять наверно уйдет.
Uljahn: всему не научишься
Uljahn: да и возраст влияет
zuko3d: vrabosh ну по поводу пяти лет - хзхз. Зависит от изначальных знаний. Я когда начал нейросети только изучать - уже знал математику хорошо. В итоге спустя полгода уже подал статью на ICML; т.е. если есть фундамент, то там все основные принципы очень быстро изучаются.
vrabosh: опыт в программировании хорош, а в математике ноль
gybson_samara: @zuko3d "знал хорошо" это где ей занимался?
vrabosh: пока тут все задачки порешаешь, тупо поверхостно знания получишь.. год наверно пройдет
vrabosh: потом год на всякие книги.. обучение математике итд.
gybson_samara: @vrabosh больше
gybson_samara: ну и смотря еще как торчать =)
vrabosh: Кстати для пазла уровзя изи не плохая будет задачка, нарисовать из этого поле 9х9 a = [[16, 65], [72, 256], [68, 130], [0, 132], [16, 5], [34, 12], [266, 4], [32, 72], [384, 0]]
vrabosh: и еще как можно это оптимизировать? потомучто приходится же копию массива делать.
vrabosh: причем дипкопи.
Uljahn: зачем?
vrabosh: чтоб минимакс делать
Uljahn: а, ходы применять?
vrabosh: всмысле?
Uljahn: ну, из исходного массива получить массивы после каждого хода
Uljahn: делай в нумпи, там копия быстрая
vrabosh: ну вот массив, там [16,65] на нулевой ячейки... 16 - это крестики, 65 - нолики
Uljahn: я вижу 9 пар, это очевидно двоичные миниборды для каждого игрока
vrabosh: я над 16 сделал 16 + (1<<i) и занес в a[0][0] и передаю дальше
vrabosh: копируя этот массив
Uljahn: ну и? переделай списки в np.array, у тебя же размерности фиксированные
gybson_samara: двоичные борды не лучший выбор, если что
vrabosh: поэтому изночально почему я про троичную систему размышлял
vrabosh: а что лучше?
Uljahn: нет ничего медленнее, чем дипкопи в питоне
vrabosh: так диккопи вроде дорого
Uljahn: в нампи просто копирование
gybson_samara: Я скажу так
vrabosh: ну или копия просто в нампи тоже наверно дорого?
Uljahn: нет
gybson_samara: если сумма в клетке равна сумме проходящих через нее линий, то ход в нее завершает линию
Uljahn: в нампи копия по скорости как в Си
gybson_samara: соответственно нам нужно хранить числа от 0 до 4
vrabosh: хотя можно так передавать 000000000_000000000 и потом делать опирацию энт 111111111_000000000 - но тут надо тестить что быстрее эти операции или копия массива
gybson_samara: а когда мы ставим знак в клетку, то по всем ее линиям делаем +1
Uljahn: копия массива намного быстрее, чем дипкопи списка, можешь сам замерить
vrabosh: я понял это
vrabosh: я просто думал, что трехуровневые массивы он будет по ссылки передвать
amurushkin: либо делай откат хода чтобы не копировать
vrabosh: точно можно откат еще потестить..
vrabosh: gybson_samara , я не понял что ты имел введу
gybson_samara: vrabosh ну это вроде прикола с цифрами
vrabosh: вообщем надо будет тестировать что быстрее
Uljahn: правильно, всегда надо тестировать
vrabosh: gybson_samara, у меня все ходы выигрышные в базу занесены
gybson_samara: есть метаматрица, 323 242 323
gybson_samara: она показывает сколько линий проходят через клетку
gybson_samara: далее допустим ходы 111 110 101 - это ход в 0б0 клетку
Uljahn: сумма масок
vrabosh: и что это дает?
Uljahn: "двоичные борды не лучший выбор, если что" - не понял)
gybson_samara: знаешь у какой клетки какой потенциал
Uljahn: это для оценки минимакса может пригодиться
vrabosh: gybson_samara , я перебор хочу сделать.. чтобы знать выиграю или нет на вернека.. а не потенциал
Uljahn: вот только потенциал тут рекурсивный, надо плясать от общей ситуации к частной и обратно, если пилить эвристический ИИ
gybson_samara: vrabosh тогда ты сраз устанешь топ1 леги
vrabosh: хотябы на последних 15ходов)
Uljahn: к последним ходам твоя партия будет безнадёжно проиграна
gybson_samara: ну или сразу сможешь вывести свое место в текущей лиге, ведь результат игры будет известен сразу
vrabosh: ну и протестить теорию. делать дерево до первого захвата клетки ближайшей
Uljahn: как я и говорил - хороший способ провести лето)
gybson_samara: после пляжа и велосипеда чего же нет
tomatoes: :grinning:
Uljahn: в крестиках столько всего можно попробовать, и математика с физикой не нужны даже
gybson_samara: математика нужна
gybson_samara: точнее арифметика =)
gybson_samara: вот возьмем маску вида 321 220 101 - для хода в 0,0
gybson_samara: а потом сходим в 0,1 232 020 010
gybson_samara: получим 553 240 010
gybson_samara: красиво
vrabosh: это на пустой клетке?
gybson_samara: Но еще красивее, когда [0,0]=[0,1]&[0,2] || [1,0]&[1,2] || [1,1]&[2,2]
gybson_samara: а в нампи вообще шедевр mm = mapcopy[:,x]
if mm.sum() == 2: return 1
gybson_samara: vrabosh а занятые зачем считать?
vrabosh: выигрышные
vrabosh: чтоб знать быстро, выиграл иль нет
gybson_samara: а вообще задача то древняя, найти вершину графа такую, чтобы получить сбаллансированное подобие дерева
gybson_samara: если ничья возможно, то получится симметричное дерево, если нет, то выигрышь будет выпирать
vrabosh: вот этим и занимаюсь)
VitaliKhileuski: мужики
VitaliKhileuski: вы в клеш оф код не играете?
gybson_samara: я не, задание понять не успеваю
vrabosh: я еще эти задания в гугл транслейте перевожу)
vrabosh: копии долго делать. у меня выигрышную партию бытрее ищет, чем копия делается
vrabosh: с массивами вообще дорого работается смотрю
zuko3d: как ты выигрышную партию ищешь?
vrabosh: 3x3 имею введу
zuko3d: а. Там же можно каждую ситуацию закодировать одним интом и хранить массив с результатами.
Uljahn: vrabosh: у тебя уже битборды для каждого игрока есть, в начале хода можно перебрать все варианты и проверить на победу, результат занести в массив, где индекс - состояние битборды игрока
Uljahn: уже который раз подсказываем)
Uljahn: в начале игры, вернее. когда времени дофига дают