Chat:Ru/2020-04-25
Asethon: Нормес, теперь надо со столкновениями разбираться.
MadKnight: Asethon как успехи?
Asethon: Есть одна проблемка
Asethon: Не могу никак понять, что не так с кодом. Ошибки не валятся.
Asethon: Видимо, память всю съедаю, либо время.
Asethon: (пишу на плюсах)
MadKnight: покажи код
Asethon: Через пастбин?
MadKnight: прям сюда вставь
MadKnight: тут чат генерит пастбины
Asethon: Сразу предупреждаю - будет больно.
Asethon: http://chat.codingame.com/pastebin/314342f6-069d-47af-a002-144f955641f5
Asethon: Забыл там убрать */ Я ctrl+z'тил
MadKnight: /* if (opponent.size() > 2) {
opponent.erase(opponent.begin());
MadKnight: lol а в чём смысл делать так?
Asethon: Чтобы не хранить больше, чем надо. Я с плюсами года три не работал, так что не особо помню, как ограничить)
MadKnight: так а нельзя пересоздать массив?
MadKnight: просто занеси переменную в цикл
Asethon: Пересоздать - не то. Мне нужны значения предыдущих двух-трёх шагов.
MadKnight: зачем?
MadKnight: и зачем больше 2 ?
Asethon: Чтобы определить, куда движется вражина(траекторию и т.п.) и избежать столкновения(ну или подрезать самому, в идеале).
Asethon: Но, видимо, игра мне не даст времени на подобные расчёты)
MadKnight: игра даёт тебе целых 75мс
MadKnight: народ успевает ооочень много всяких рассчётов провест и
MadKnight: лучше вычти 3 скорости из противника
MadKnight: всм из чекпоинта
MadKnight: Asethon
MadKnight: сделаешь?
Asethon: "лучше вычти 3 скорости из противника всм из чекпоинта"
Не совсем понял
MadKnight: ну просто вычти
MadKnight: чекпоинт - 3*скорость
Asethon: Ну. Пока не разберусь со столкновениями - это роли не играет.
MadKnight: наоборот
MadKnight: это играет очень большую роль
MadKnight: а вот столкновения до золота не будут играть роли
MadKnight: запили эту формулу Asethon
Asethon: nextCheckpointX - 3 * thrust
Типо этого что-ли?
Asethon: В выводе
MadKnight: thrust - это ускорение
MadKnight: это не то
Asethon: Так. А скорость же, в качестве переменной, не существует. Мне её высчитать надо?
MadKnight: ага
MadKnight: причём вектор скорости
MadKnight: velX velY
Asethon: Ля. Придётся математику вспоминать)
MadKnight: ты забыл как скорость считать?)
MadKnight: расстояние / время же
MadKnight: первый класс
MadKnight: просто расстояние будет тоже вектором
MadKnight: вектор передвижения
Asethon: А время откуда брать?)
MadKnight: а в чём у тебя скорость измеряется?)
MadKnight: что/что?)
Asethon: Скорость неизвестна. Чтобы её определить - нужно знать время. Время тоже неизвестно.
MadKnight: измеряется-то в чём?
MadKnight: единица измерения какая?
Asethon: расстояние/время
MadKnight: да лол
MadKnight: это не единица измерения
MadKnight: м/с - вот единица измерения
MadKnight: так в какой у нас скорость измеряется?
MadKnight: м/с ?
MadKnight: км/ч ?
MadKnight: или км/с ?
MadKnight: или какая?
Asethon: Ну. Тут никаких метров, как таковых, нет.
MadKnight: вот именно
MadKnight: а что есть?
MadKnight: в чём расстояние измеряется?
Asethon: Есть условные расстояния. Поэтому и написал, расстояние/время, а не км/с или что-то в этом роде.
MadKnight: так единица измерения должна быть
MadKnight: есть расстояние => есть единица измерения
MadKnight: хочешь, назовём её Безымянная единица расстояния
MadKnight: БЕР
MadKnight: ну так вот, расстояние у нас в БЕРах
MadKnight: значит скорость - это БЕР на что 7
MadKnight: ?
MadKnight: у нас юнит проходит всю свою скорость за сколько времени?
MadKnight: вот например у юнита скорость 100
MadKnight: значит за сколько времени он на 100 переместится?
Asethon: За ~75мс.
MadKnight: нет, это максимальное время исполнения программы
MadKnight: оно может быть любым - от 1мс до 75мс
MadKnight: от него не зависит
Asethon: Ну. Тогда за 1 единицу времени.
MadKnight: что это за единица времени?
Asethon: Секунда или нет - мне трудно сказать.
MadKnight: сколько единиц времени прошло с того момента как ты начал засекать расстояние?
MadKnight: вот ты прошёл 100 растояния
MadKnight: сколько времени прошло?
MadKnight: с реальным временем это не связано, я же говорю
MadKnight: скорость не зависит от того, сколько времени прошло в реальном мире
MadKnight: в игре своё время
MadKnight: так сколько прошло игрового времени?
Asethon: 1
MadKnight: именно
MadKnight: а чего 1 ?)
MadKnight: ход 1
MadKnight: игра пошаговая
MadKnight: скорость в юнитах/шаг
MadKnight: так что надо на что делить?
MadKnight: надо делить юниты/шаги
MadKnight: а не м/с
MadKnight: а значит время у тебя есть
Asethon: 16000 юнитов/1 шаг = 16000. Скорость я так не измерю уж точно.
MadKnight: откуда ты взял так много юнитов
Asethon: Размер карты взял.
MadKnight: а как связаны размер карты и скорость
Asethon: Ну дык. Я без понятия, какое расстояние проходит под.
MadKnight: - машинка ехала 5 секунд и проехала 100 расстояния. какая скорость? - вот между этими домами 16000 метров, значит скорость машинки 16000!
MadKnight: ты так же на матеше делал?)
Asethon: Я на матеше последний раз был лет семь назад) И вектора(со всем сопутствующим) - не самые мои любимые вещи.
MadKnight: ну это же не значит что надо брать абсолютно случайные значения
MadKnight: так ты не знаешь как получить пройденное расстояние?
Asethon: Его можно получить только со второго шага
MadKnight: ну а на первом шаге ты знаешь свою скорость
MadKnight: 0
Asethon: http://chat.codingame.com/pastebin/a05076e4-d7db-43eb-9774-339a1f9c4026
Asethon: Победил, но ощущение, что я что-то не так написал.
Asethon: Ну и я даже визуализацию не увидел, потому что игра её тупо не сделала.
MadKnight: if (pod.size() > 0) {
speed = {x, y}; }
MadKnight: а это что?
Asethon: Кривая проверка на то, что это не первый шаг.
Asethon: http://chat.codingame.com/pastebin/40a6345a-9feb-4f68-9093-0ec6f3aeed61
Asethon: Не работает чёт вообще.
Razzeeyy: О, прикольно пытаешься избегать противника
Razzeeyy: у тебя pod.size() всегда будет больше 0
Razzeeyy: потому-что ты в начале его сразу сетишь в x,y уже
Razzeeyy: т.е. проверка по сути делает двойную работу в никуда
Razzeeyy: ну это при условии что я правильно помню си плюс плюшечку)
Asethon: "у тебя pod.size()"
Я это уже заменил
Razzeeyy: а это какая лига у тебя? деревянная ещё?
Asethon: Бронза
Razzeeyy: кстати использован буст или нет можно не трекать ваще
Razzeeyy: невалидный буст игра сама заменяет на 100 тяги
Asethon: С pod.size, как ни странно, всё работает. А вот с проверкой is_first - нет.
Razzeeyy: мне кажется можно проще высчитывать скорость
Razzeeyy: а ну да
Razzeeyy: ты посмотри где ты вектор скорости определяешь
Razzeeyy: он же внутри цикла и он у тебя живёт каждый раз только один цикл
Razzeeyy: и потом чётенько сдыхает в конце цикла и опять по новой)
Asethon: Вынес за цкил, в итоге уехал на -276898, -999037
Razzeeyy: а там вот уже надо как-то решать проблему с инициализирующими значениями)
Razzeeyy: правда зачем считать скорость я хз, я без неё вывез
Razzeeyy: потом тем более в золотой лиге скорость уже на блюдечке приподносят
Razzeeyy: там и без скорости есть пара оптимизаций которые тебя выпихнут в лиги выше
Asethon: Чтобы тормозить заранее, как я понял.
Razzeeyy: я безусловно тормозил :sweat_smile:
Razzeeyy: просто если я до точки ближе чем N юнитов то по тормозам)
Razzeeyy: MadKnight а я уже 750 в голде... И так ещё пока не писал ни капли умного кода О__о
Razzeeyy: блин ппц я раньше думал тут жоще типы в csb играют
Razzeeyy: я думал меня уже с бронзы начнут нагибать шо мама не горюй)
Razzeeyy: такс... теперь мне в эту свою джаваскриптовую прогу на чистых функциях всё-таки надо ввести стейт :sweat_smile:
MadKnight: Asethon пофиксил?
Asethon: Не-а. Забил и вернулся к своему решению.
Razzeeyy: Как приятно когда мэйн такой короткий
Razzeeyy: http://chat.codingame.com/pastebin/61eb146e-1fca-4239-9e19-14f7221cf647
Razzeeyy: и хорошо что в жабаскрипте есть вебпак, даже свою конкатенацию изобретать не пришлось)
MadKnight: Asethon да чё ты забил?
MadKnight: покажи код
MadKnight: пофикшу
Asethon: Поздно уже, я тут с ексепшонами играюсь.
MadKnight: где вылетают?
MadKnight: почему поздно?
MadKnight: тебе просто нужны предыдущие х у
MadKnight: а потом просто вычесть их из текущих
Asethon: Вектора вылетают)
MadKnight: покажи
MadKnight: код
MadKnight: ты чё-то всё переусложнил
MadKnight: очень
MadKnight: я аж офигел как ты всё усложнил
MadKnight: можно же было сделать проще
Asethon: http://chat.codingame.com/pastebin/81b27c95-b285-4f8b-bb53-d1d218885916
Asethon: Люблю писать костыли.
MadKnight: вот это про тебя
MadKnight: pod[pod.end() - 1]
MadKnight: это ещё чё такое
Asethon: Предпоследний элемент, по идее.
MadKnight: end возвращает ссылку
MadKnight: на элемент
Asethon: Если прописать цифрами - код просто не запускается.
MadKnight: ты используешь указатель на память как индекс
Asethon: pod[0][0] не работает. А так, хоть ексепшн есть
Razzeeyy: :joy:
MadKnight: так тебе же не 0 нужен
MadKnight: хотя может и он
Asethon: 0 - это предыдущий же.
Asethon: Как элементов становится три - первый удаляется.
Asethon: Но суть в том, что у меня ни один шаг не отрабатывает.
MadKnight: что значит не отрабатывает
MadKnight: а что отрабатывает?
Asethon: Ничего)
MadKnight: как отрабатывает?
MadKnight: у тебя в speed всегда есть 2 элемента чтобы их на выводе использовать?
Asethon: play my code...
"Timeout: the program did not provide 1 input lines in due time... Asethon will no longer be active in this game."
MadKnight:
/*int opponentX; int opponentY; cin >> opponentX >> opponentY; cin.ignore()
MadKnight: так зачем ты удалил чтение противника
MadKnight: противника надо всегда читать
MadKnight:
vector <int> speed;
MadKnight: cout << nextCheckpointX - 3 * speed[0]
MadKnight: в первый ход у тебя будет что-то в speed ?
Asethon: Сомневаюсь
MadKnight: пофикси
Asethon: Пофиксил
MadKnight: чё теперь?
Asethon: И правило проверки speed на пустоту поменял.
Asethon: Теперь работает.
MadKnight: покажи
MadKnight: реплей
Asethon: https://www.codingame.com/share-replay/454669817
MadKnight: заливай\
Asethon: submit типо?
MadKnight: ага
Asethon: Норм процент побед.
Asethon: О. На первое место поднялся.
MadKnight: go v legend теперь
Asethon: Это шо?
Asethon: Всё. Сильвер через пол часа.
Razzeeyy: легенд это топов ранг типа)
Razzeeyy: Asethon офигеть четенько у тебя бот отрабатывает
Asethon: М?
Razzeeyy: я думаю тебя и в золото поднимет без правок бота вообще)
Asethon: Не. Я хочу дописать так, чтобы в повороты нормальнее вписывался и прочее. Есть пару идей.
735487: заедет в золото :)
Razzeeyy: чёто я уже очкую
Razzeeyy: походу он ща меня перегонит :О
Razzeeyy: а я думал я быстро за 3 дня в золото поднялся О_о
Razzeeyy: зараза, у меня боты друг друга подрезать стали при более умном алгоритме)
Razzeeyy: но можно ли считать его умным если он работает по факту хуже :thinking:
Razzeeyy: так, я понял
Razzeeyy: игра по дебильному предлагает следующий чекпоинт
amurushkin: Razzeeyy в золото быстро подымаются на 1 формуле
Razzeeyy: checkpointPos+velocity*2?
Razzeeyy: amurushkin на такой формуле?)
Razzeeyy: эх опусти ля своего бота баганым расчётом следующего чекпоинта((
Uljahn: почти, только - velocity*3
Asethon: Razzeeyy, возможно, ты был прав. На сильвере уже на первом сижу. Процент побед выше 90.
Razzeeyy: Asethon да, так и есть там в сильвере даж щиты никто не юзает
Razzeeyy: Uljahn а у меня не сработал коэфицент 3, потому-что у меня формулы ускорения торможения другие, поэтому мне надо было мягче компенсировать)
Razzeeyy: у меня ускорение вообще sin(angle)*100
Razzeeyy: точнее там косинус
Razzeeyy: ну да суть таже
Razzeeyy: Так ребята я про CSB не пойму одну дич
Razzeeyy: Там прогресс чекпоинтов индивидуально к кораблю привязан только? Получается если какой-то корабль ведет то он и должен пройти всю трассу?
Razzeeyy: Или можно делать комбочи когда не важно какой корабль взял чекпоинт но главное чтобы взяли все по очереди
Asethon: Лан. Я на пару часов отлечу, подремать. Потом как раз в золотой лиге буду.
Uljahn: Razzeeyy: да, у каждого пода свой прогресс
Uljahn: но зато таймаут общий на команду
Uljahn: это в голде будет играть роль
Uljahn: если твоего главного пода блочат на чекпоинте, и таймаут приближается к 100, можно вторым подом проехать его чекпоинт, и таймаут сбросится
Razzeeyy: блин ну это тупо что каждый под должен своё ехать
Razzeeyy: я тут уже хочу крутой Swarm AI мутить
Razzeeyy: а они мне палки в колёса)
Razzeeyy: @Uljahn тоесть я могу только сбрасывать таймаут союзному поду? А в прогрессе команды никак не помочь если лучший раннер лажает? хмм
Uljahn: можешь иначе помочь
Uljahn: вторым подом мешать и блокировать лучший раннер соперника
Razzeeyy: и в леге такие же условия получается?
Uljahn: угу
Razzeeyy: теперь понятно почему топовые боты так тупо играют
Razzeeyy: только толкушки
Razzeeyy: эхх
Razzeeyy: ну это блин бред, тактика так ограничена((
Uljahn: ещё можешь ставить второй под на острых углах и включать щит, когда на чек заезжает твой главный раннер, чтобы он отскакивал в нужном направлении
Uljahn: тут разворот очень дорогой - максимум 18 градусов за ход
Uljahn: попробуй MeanMax или Fantastic Bits, там повеселее
Razzeeyy: та да, чувствую скоро забью и чето по свободнее буду искать
Razzeeyy: а то у меня тут такая хитрая идея стратегии была
Razzeeyy: типа шоб было два раннера и они старались уклонятся и чисто на чекпоинты работать при этом стараясь идти к ближайшему следующему общему важному чекпоинту
Razzeeyy: но т.к. тут всрали чекпоинты бл
Razzeeyy: было бы круто если бы чекпоинт трекался чисто на команду
Razzeeyy: а так ваще не интересно, никакие хитры мутки не помутить
Uljahn: у меня как раз два раннера без всяких блокеров, топ-250 леги
Razzeeyy: ну у тебя там какой-то хитрый алгоритм?
Razzeeyy: или даже без нейронок?
Uljahn: -3Vel по сути
Razzeeyy: не понял что за -3Vel :)
Uljahn: cp_pos - 3*velocity
Uljahn: единственная добавка - если под докатится до чекпоинта за 5-7 ходов, то начинает разворачиваться к следующей цели, но без ускорения
Razzeeyy: а, та корректировка энерции, понял)
Uljahn: или с усорением, если цель не помешает взять текущий чек
Razzeeyy: у меня тоже такая добавочка была но в серебре
Razzeeyy: про ранний поворот
Razzeeyy: но я её ещё пока не адаптировал под золото
Uljahn: в серебре сложно такую сделать - координат чекпоинтов нет изначально, надо трекать самому
Razzeeyy: представляю как ща Asethon офигеет что ему почти всё переписывать под голду))
Uljahn: угу))
Razzeeyy: Uljahn ну да, на втором круге у меня бот начинал заметно лучше играть)
Uljahn: есть хинт - на первом круге разворачиваться к центру
Uljahn: особенно, если чек от центра далеко
Razzeeyy: хммм
Razzeeyy: пока не понимаю как это помогает)
Razzeeyy: типа получается ты потом заблочишь противников таким образом?
Uljahn: в серебре помогает на первом круге
Razzeeyy: ааа в серебре
Uljahn: в голде хинт - одним из подов юзать буст на старте
Uljahn: чтобы они не мешались друг другу на первом чеке
Uljahn: ну и щиты полезно прикрутить
Razzeeyy: а я одним из подов юзаю щит на старте))
Razzeeyy: чисто ради остановочки
Uljahn: ничоси стратегия
Razzeeyy: блин но кстати да
Razzeeyy: норм хинт
Uljahn: так щит на торможение не влияет
Razzeeyy: чёто я понял шо я тупой))
Razzeeyy: щит последующие 3 хода отрубает двигло
Uljahn: а, понел
Razzeeyy: а я как бы и так стою) получается я как минимум 3-4 цикла одним подом буду стоять
Razzeeyy: а то ещё и заблочу какой-то другой под противника
Razzeeyy: но стратегия хреновая, лучше буст, да)
Uljahn: а зачем стоять на старте?
Uljahn: лучше ехать на второй чек
Uljahn: и там мешать сопернику
Razzeeyy: и это тож пробовал
Razzeeyy: чую в идеале надо какой-то алгоритм резолва столкновений с союзником писать
Razzeeyy: чтобы не толкаться тупо
Uljahn: детект коллизий?
Uljahn: это уже уровень легенды
Razzeeyy: ну хотя бы не детект даже
Razzeeyy: а как например ехать рядом с союзником шоб не подрезать его с траектории)
Uljahn: слишком сложно
Uljahn: аналитически не решить, только перебором приблизительно
Uljahn: топовые боты в леге симулируют по несколько миллионов ходов игры
Razzeeyy: а теперь я посмотрел на свою формулу ускорения
Razzeeyy: и мне закратывается подозрение что я творю какую-то дичь
Razzeeyy: const offset = 0.1
const heading = ((1 - Math.abs(angleToCheckpoint / 180)) + offset) ** 2 const thrust = clamp(heading * 100, 0, 100)
Razzeeyy: походу там может быть 1-Infinity O_o
Razzeeyy: а не
Razzeeyy: 0/180 это ноль, всё норм
Uljahn: это из сильвера формула?
Razzeeyy: ну типа того
Razzeeyy: мой франкенштейн
Uljahn: а то в голде нет относительных углов, надо самому считать
Razzeeyy: так я сам угол отсчитал
Uljahn: а, понятно
Razzeeyy: const angleToCheckpoint = simplifyAngle(Math.round(targetAngle - pod.angle))
Razzeeyy: так но чёта эта формула ускорения какая-то дичь
Uljahn: targetAngle через atan2?
Razzeeyy: именно)
Razzeeyy: const targetAngle = radiansToDegrees(Math.atan2(targetDirection[1], targetDirection[0]))
Razzeeyy: я кароче для ускорения в конце сильвера искал формулу у которой был бы годный газ когда уже близки по углу к точке
Razzeeyy: а то синусоида при приближении к 1 замедляется
Razzeeyy: хотя походу не так критично
Uljahn: if abs(angle) < 30: thrust = 100 :)
Razzeeyy: :smile:
Razzeeyy: а до этого?)
Razzeeyy: а меньше 30 градусов у тебя какой-нить хитрый расчёт прогноза траекторий))
Uljahn: ща гляну, как у меня с трастом
Uljahn: if abs(ang) > 90: thrust = 0, в остальных случаях 100
Uljahn: или 200 в леге
Razzeeyy: кароче твой хинт про буст шикарен
Razzeeyy: спс)
Uljahn: :thumbsup:
Razzeeyy: сразу бот в пол раза лучше работать стал))
Razzeeyy: а чё в леге только больше газа добавляют и всё?)
Uljahn: да
Razzeeyy: тююю
Razzeeyy: у тебя конечно расчёт тяги топ))
Razzeeyy: зато быстро, меньше цпу жжёт)
Razzeeyy: эх конечно кто-то знает вообще топовую формулу ускорения, которая прям всё учитывает чтобы прям идеально по сплайну идти
Uljahn: я только смог написать формулу точного расчёта ускорения и угла, чтобы остановиться в заданной точке, здоровая такая функция получилась
Uljahn: думал блокера пилить, чтобы он на следующий чек врага ехал и там ждал
Razzeeyy: так чё получается можно и без нейронок довольно неплохо ехать?
735487: Uljahn: я когда то давно пытался такую формулу сделать еще для раика для хоккея. у меня не получилось
735487: нейронок там вообще штук 5 максимум
Uljahn: хм, там не очень сложно, но много операций
Razzeeyy: насколько помню такие формулы это какой-то частный случай задачи projectile intercept
Razzeeyy: я как-то на одном собеседовании делал, типа расчитать куда кинуть мячик чтобы сбить им другой летящий мячик
Razzeeyy: но это пздц головоломка, особенно когда по параболе))
Razzeeyy: да когда ж он уже отсчитает мой ранг бл
Razzeeyy: последние 10% битв оч долго считает
Uljahn: это наверное игры против реальных ботов, а не сломанных сабмитов из сильвера)
Razzeeyy: ага)
Razzeeyy: забавно когда я даже сам будучи сломаным сильвером был не на последнем месте среди них лол
Razzeeyy: эх 728 место в голде
Razzeeyy: но есть ещё 3 или 4 места для конкретных улучшений
Razzeeyy: но мне покашо влом уже)
Razzeeyy: опа засабмиттил своего бота в таком же состоянии второй раз и у меня скор стал лучше, лол
Uljahn: сильный рандом в голде, т.к. много поломанных
Razzeeyy: а у меня прям натуральный рандом есть в боте))
Razzeeyy: я решаю надо бустится или не надо
Razzeeyy: при условии что все остальные условия выполнены
Razzeeyy: то финальная проверка random() > 0.5
Razzeeyy: )))
Razzeeyy: это мне очень помогло в предыдущих рангах не ехать слишком идеально и не повторять одни и те же ошибки ботом каждый круг
Uljahn: главное сид зафиксировать в начале, а то не отдебажишь потом)
Razzeeyy: покачто не приходилось так дебажить)
Razzeeyy: про крестики нолики я так понимаю для 3х3 есть классическая чёткая выйгршная или ничейная стратегия
Razzeeyy: а потом уже когда игры в игре там уже какая-то интересность
wlesavo: типа того, из вуда чтобы выйти достаточно иметь проверку выйгрышных ходов и блоков выйгрышных ходов противника
Razzeeyy: эх, блин походу мне тут проще тупо какой-то паттерн матчинг на двухмерном массиве написать
Razzeeyy: чем с алгеброй какой-то мудохаться чтобы это всё описать))
Razzeeyy: потому-что стратегию выйгрышную для 3х3 я знаю, да наверное большинство знает))
Razzeeyy: а формализовать кроме как чем набором правил паттернов -- хз)))
wlesavo: я чтото похожее сделал, потом удобно, тем более за первую секунду можно все предрассчитать
wlesavo: доальше просто хэширую таблицу и в словаре ищу совпадение
Razzeeyy: аха, предрасчитать...
Razzeeyy: я так и подумал что ты генеришь пермутации в кеш)
Razzeeyy: умно да)
Razzeeyy: а я бы вообще на этапе макроса это всё бы нагенерил, так вообще даж время в рантайме тратить не надо)
Razzeeyy: но делать так я конечно же не буду
wlesavo: ну и проверяю их сразу на победы проигрыши, храню id чайлдов, и все такое, в вуде удобно отлаживать
Razzeeyy: думаю откуда мне твой ник знаком, а помоему я недавно видел твоего бота в csb в битве против моего))
Razzeeyy: или не оттуда, хм
Uljahn: инога дешевле сделать проверку на битовых операциях, чем искать в большом хэшмапе
wlesavo: там поломанный бот, я на формуле до голды дошел и не трогал
Razzeeyy: Uljahn ааа ты типа смапил всё игровое поле в одномерный побитовый массив
Razzeeyy: wlesavo на голду влом переписывать стало?)
wlesavo: да я и не собирался, как то совсем не вкатили гоночки, просто интересно стало реально ли на одной формуле можно голд взять
Uljahn: я к тому, что обращения к памяти дорогие и могут инвалидировать кэши, а в крестиках главное - перформанс, если мутишь MCTS
Razzeeyy: Uljahn а противника ты трекаешь отдельным полем чтоль?
Razzeeyy: ты ж в 1 бит не уложишь инфу о свободна ли клетка, занята мной занята противником
wlesavo: Uljahn ну в том то и дело что я мктс не хочу, может это и реально дороже, но пока вроде нормально
Uljahn: у меня массив сейчас на 2^18 элементов, индекс - текущая позиция на поле, в массиве хранится результат оценки на выигрыш, как-то так
YurkovAS: wlesavo у тебя в евристике tron battle есть такое: evaluation heuristic tweaking? https://www.a1k0n.net/2010/03/04/google-ai-postmortem.html
wlesavo: я хочу проверить до чего дойдет мой странный алгоритм, если не сработает все равно полностью переписывать и не уверен что до контеста буду этим заниматься
wlesavo: YurkovAS ну по сути только этот волхаггинг и есть, только он у меня не в эвале, а просто когда все направления одинаковый, а значит я изолирован ото всех, то прижимаюсь к телу или стене
735487: YurkovAS: я пробовал. у меня не получилось
735487: я вчера просто заменил деление умножением. попробовал разные еще глубины в итоге обратно на 4 вернул и поднялся чуток выше чем был :)
YurkovAS: у меня тоже не работает или не так сделал. А у wlesavo работает. Это важная фича.
YurkovAS: amurushkin сделал миник на глубину 4, стал доходить до 90-120 места. Поэкспериментировал с увеличением глубины до 5-6 в зависимости от тика - дошло до 50 места (или нарандомило, позже еще проверю)
YurkovAS: глубину как у тебя в смитсимаксе считаю: свою + противников = 1 глубине. и т.д
amurushkin: я когда то давно пытался миник сделать. почему то оно у меня не работало
Razzeeyy: а как вы вообще делаете глубину :thinking: это тоесть вы называете глубиной количество шагов симуляции наперёд?
735487: да
Razzeeyy: http://chat.codingame.com/pastebin/dca26244-9efd-4f96-a4d8-717e00d1a7f0
Razzeeyy: блин, свернуло длинное сообщение(
735487: да
Uljahn: нужен стейт игры, применение хода и оценка, ну и получение валидных ходов из стейта
Uljahn: не обязательно прямо все сочетания перебирать
Uljahn: например, в гоночках делают очень грубое округление возможных действий до 6 штук всего + щит
Uljahn: -18, 0, +18 градусов поворот, 0 и 200 ускорение
Uljahn: щит и буст по усмотрению
Razzeeyy: ну да типа в тех же гоночках нету смысла пытаться симулировать задний ход или типа того))
Uljahn: в гоночках можно рандомные ходы генерировать и улучшать генетикой
Uljahn: нагенерировал 10к последовательностей по 8 ходов, просимулировал их, оценил, где дальше уехало
Uljahn: изи)
wlesavo: решил таки попытаться написать мктс на нумпай
WhiteCrow: Хай гайз
WhiteCrow: Хау из ит гоин,
Uljahn: нот бет
Uljahn: wlesavo: покажешь потом?
wlesavo: Uljahn если выйдет чего то конечно
Uljahn: я вот по этой статье пытаюсь делать https://www.moderndescartes.com/essays/deep_dive_mcts/
Uljahn: но там всё переделывать придётся, похоже
Uljahn: потому что это MCTS для го с нейросеткой для оценки позиции, как я понял
Uljahn: хочется отвязаться от классов, ноды хранить как structured array с кастомным dtype, ну а методы как просто функции реализовать что ли...
☺: Тогда добро пожаловать в Си без плас плас.
wlesavo: мда, под сотню ролаутов на нулевой глубине
wlesavo: таки попробую наверное со словарем завтра
MadKnight: есть кто живой?