Chat:Ru/2020-05-27

From CG community
Jump to navigation Jump to search

Uljahn: хд

SqueeCoder: Что надо почитать, чтобы научиться пользоваться графами на с#?

Uljahn: графы на С# для чайников?

Uljahn: выглядит так, будто графы ты уже знаешь, С# знаешь, но одно с другим не можешь совместить

qbit86: SqueeCoder 1. CLRS, 2. документацию к Boost.Graph

SqueeCoder: Ну примерно я знаю что такое графы, но не разбирался, и не знаю какие использовать. Там же есть различные варианты?

SqueeCoder: Спасибо, буду qbit86, полезу разбираться.

qbit86: SqueeCoder CLRS — это книжка Кормен-Лейзерсон-Ривест-Штайн.

metahom: на ulearn.me курс лекций по с#

metahom: там же и графы

735487: SqueeCoder: ulearn.me там есть

735487: metahom: не увидел что ты уже посоветовал

SqueeCoder: Всем спасибо большое, коммьюнити здесь отзывчивое :)

Uljahn: имхо лучше начать с теории графов, если сильно плаваешь, а потом уже реализации структур и алгоритмов на с# курить

735487: ну вот на ulearn.me там как раз основы и по алгоритмам и по языку

BorisZ: надо начинать с цели - зачем мне нужны графы?

wlesavo: а чтО, апрувалы сломались?

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

BorisZ: если для науки там это одно дело, а для прикладный вещей надо несколько алгоритмов

Uljahn: да, wlesavo

wlesavo: я пропустил видимо обсуждение

Uljahn: в дискорде обсуждали

wlesavo: но выглядит забавно

SqueeCoder: Для поиска пути, как я понял. Для контестов.

SqueeCoder: Для науки пока не надо :)

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

BorisZ: SqueeCoder тогда бфс, астар и дейкстра - все что нужно

Uljahn: матрица смежности)

735487: еще dfs надо знать

BorisZ: вот по мне дфс уже сомнительно )

735487: и наверное иногда знать еще что бывают такие слова как гамильтоновы циклы

Uljahn: про клики иногда полезно знать

735487: BorisZ: задачи разные бывают. иногда и дфс нужен

Uljahn: диаметр графа и т.д., зависит от задачи

735487: тут как раз где то есть пазл на диаметр графа

Uljahn: чем больше знаешь - тем шире выбор инструментов

735487: я точно знаю что я его решил неправильно но он текущие тесты все проходит

SqueeCoder: Да понятно, что штука жутко полезная. Мне главное, чтобы зацепиться было за что на практике. Дальше, обычно. легче.

BorisZ: amurushkin во первых дфс трудно воспринять интуитивно, во вторых я думаю что либо бфс либо астар сделают тоже самое в зависимости от задачи

BorisZ: не менее эффективно

wlesavo: вчера делал расстояния для gitc, написал из общих соображений поиск пути, тупо брутфорс на упорядоченных по расстоянию списках для ранних остановок

wlesavo: вот что бывает когда лень разбираться

BorisZ: но я не настаиваю, может и есть что-то заковыристое хз

Uljahn: SqueeCoder: начни с поиска расстояний и кратчайших путей в неориентированном графе, как в задаче wlesavo

735487: BorisZ: дфс и бфс для разных задач же. и мне наоборот было понятнее начиная с дфс. он самый простой имхо

wlesavo: я вообще вчера только открыл постмортемы и понял что расстояния в gitc не линейные

Uljahn: Дейкстра, Флойд-Уоршэл

wlesavo: сам бы не подумал об этом

Uljahn: в начале же дают все расстояния

Uljahn: плюс там один ход задержки в узле

Uljahn: но всё равно через узлы прыгать бывает быстрее

Uljahn: чем напрямки

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

Uljahn: я ещё на контесте это заметил, а Marchete сделал красивый реплей с примером

wlesavo: ну под нелинейными я подразумеваю что не выполнятся r(AC)<=r(AB)+r(BC)

SqueeCoder: Но реализацию писать самому, или библиотеки использовать?

wlesavo: лучше один раз хотябы самому написать

wlesavo: а дальше уже как хочешь

Uljahn: тебе вроде в самом начале какие-то шарповые библиотеки советовали

Uljahn: Boost.Graph

BorisZ: SqueeCoder короче надо начинать с бфс - он очень простой, применим для 90% задач где графы не взвешанные и не огромные

BorisZ: писать самому понятно дело

735487: можно на вики посмотреть псевдокод и по нему делать

BorisZ: с его помощью и пути ищутся и расстояния и connected components

SqueeCoder: Теперь всё понятно, буду курить бфс.

735487: вот connected components через dfs наверное быстрее будут

Uljahn: https://vscode.ru/prog-lessons/programma-dlya-postroeniya-grafov.html

735487: хотя может и нет

BorisZ: тут на кодингейм почти все либо гриды, либо гексы и в общем небольшие

BorisZ: amurushkin как я понимаю дфс только одну задачу сделает быстрее чем бфс - есть ли вообще хоть какой-то путь меджу вершинами

BorisZ: а вот кратчайший он или нет - это уже надо напягаться как-то чтоб определить и скорость уже не будет та же

BorisZ: блин дернул же меня черт зайти сюда - так хорошо работалось:grimacing:

BorisZ: amurushkin я отзываю все свои аргументы и признаю поражение в дискуссии )

735487: ахаха знакомо )) пошел и я поработаю

qbit86: Uljahn Boost.Graph — это плюсовая библиотека :) Шарповых нет, пока я не допилю :)

qbit86: BorisZ DFS — это примитивный блок для кучи других алгоритмов: топологическая сортировка, поиск компонент связности, etc. В каком-то смысле он более фундаментален, чем BFS.

Uljahn: вроде какая-то есть, правда старенькая

qbit86: Uljahn Нужна обобщённая библиотека, которая не накладывает ограничения на модель. Чтобы модель можно было взять из любой другой библиотеки, или неявный граф, или бесконечный, why not.

qbit86: Представьте, что в последнем контесте туман полный, не дана карта лабиринта, кроме ближайшей окрестности. И разведывать надо «пешком».

qbit86: DFS — это как раз буквально обход, он локальный. А BFS и прочие Дейкстры — это прыжки по фронтиру.

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

qbit86: ...А в DFS используются только соседи, вот они, только руку протяни.

qbit86: Если вы попадёте в реальный лабиринт без глобальной карты, то исследовать его придётся по DFS. Если по BFS, то устанешь туда-сюда возвращаться по пройденному пути.

Uljahn: стек vs очередь, итерации vs рекурсия?

qbit86: Но DFS слжный, да. Наивная реализация из учебников и даже CLRS предполагает рекурсивные вызовы. То есть ограниченный стек. А желательна ручная реализация стека, цикл без рекурсии.

Uljahn: угумс

Uljahn: кто-нибудь юзает CG Enhancer?

Hiker: поясните ньюбу что такое бфс что такое дфс

Hiker: а, сори. гуглится оказывается

Beard: алгоритмы обхода графа, в ширину и глубину

Uljahn: https://www.codingame.com/learn/BFS https://www.codingame.com/learn/DFS

Uljahn: https://www.codingame.com/learn/flood-fill

Uljahn: хм, в псевдокоде DFS проверку на посещение именно в этом месте имеет смысл делать или лучше при добавлении в стек?

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

Uljahn: похоже, у меня bfs головного мозга, сложно переключаться на dfs)

Beard: реши пазлик про бендера, где он на этаже деньги собирает

Uljahn: решил же, но давным-давно

Uljahn: а там нужна проверка разве?

Uljahn: граф же ориентированный, т.е. возвращаться нельзя

Uljahn: amurushkin: теперь дошло, спасибо

Beard: там можно сохранять сумму для комнаты, и отсекать продолжение пути если текущая сумма меньше чем в варианте, который уже смотрел

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

Uljahn: результат

Beard: ну так а чего говоришь что dfs сложный)

Uljahn: да я про проверку посещённости в неориентированном графе затупил чё-т

qbit86: DFS сложный. Если по харкору, то есть ещё с классификацией рёбер как в CLRS, без рекурсии, и к тому же Enumerable/anytime (с сохранением состояния и прерыванием/продолжением обхода), без аллокаций на enumerator'ы — прям непросто.

BorisZ: qbit86 я просто применительно к контестам рассуждаю: посчитать расстояние и найти кратчайший путь - это бфс, дфс не подойдет, а это нужно практически везде

BorisZ: компоненты связности - абсолютно все равно как граф обходить, все подойдет

BorisZ: насчет топологической сортировки - наверное, я задачу представляю, но решения не помню

BorisZ: может их несколько

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

BorisZ: а бфс - все строго в порядке расстояний, любо дорого смотреть

BorisZ: если ищем и сравниваем пути как в пакмане, то понятно что сначало нужно короткие, а потом длинные искать

BorisZ: что толку построить путь через всю карту сначала, а то что близко и не рассмотришь

BorisZ: если бфс это скачки, то дфс это пьяное блужданее по графу )

BorisZ: *блуждание

BorisZ: а в чем сложность кстати с реализацией? меняем очередь на стек и погнали, так же набор посещенных храним

Uljahn: мне в бфс нравится, что можно радиус фронтира

Uljahn: контролировать

ilt: Uljahn ты где-то писал как быстро искать победные комбинации

ilt: как этот метод называется?

ilt: я сейчас это делаю в два приема для мини-доски и для мастер-доски

Uljahn: Look-up table

Uljahn: у тебя 9 бит на игрока, т.е. всего 512 комбинаций, используешь стейт игрока как индекс и смотришь в массиве результат

Uljahn: массив получается небольшим и сидит в кэше

Uljahn: в один приём и для мини и для большой не получится, наверное

Uljahn: зато на битовых операциях можно сэкономить

Uljahn: а вообще я дно в крестиках :relieved:

ilt: ты от меня всего на 70 мест отстаешь

ilt: я помню что ты что-то умное сказал, но я не помню что

Uljahn: про масочки?

ilt: LUT

wlesavo: для больших проблема в завершенных но не выйгранных досках

Uljahn: Look-up table

Uljahn: это и есть LUT

ilt: я уже понял

ilt: спасибо

Uljahn: wlesavo: поясни, в чём проблема?

ilt: сходу непонятно лучше иметь массив размера 512 или делать 8 сравнений с числами в одной функции

ilt: поиск по индексу быстрее будет?

Uljahn: когда непонятно, то надо замерять, да и когда понятно - тоже надо :)

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

Uljahn: поиск по индексу в массиве?))

ilt: да

Uljahn: это же доступ к ячейке, к началу массива прибавляется индекс*размер элемента

Uljahn: никакого поиска

wlesavo: это не совсем поиск, да

Uljahn: у массива свойство - элементы все одного типа и лежат в памяти линейно

ilt: элементов 512

ilt: у тебя есть индекс и нужно значение для этого индекса получить

Uljahn: ну, это же элементарная индексация обычная

Uljahn: как arr[i]

Uljahn: i - это 9битный стейт минидоски для одного игрока

ilt: я от чего-то похожего избавился

ilt: оно тормозило

ilt: попробую

Uljahn: массив крошечный, должен целиком помещаться в L2 кэш по идее

Uljahn: но лучше всего две реализации сделать и профилировать

ilt: вообще MCTS для UTTT самый маленький бот из всех

ilt: без кешей вообще строк 200

ilt: размашистым почерком

ilt: так что переписывай

ilt: много времени не должно занять :grinning:

Uljahn: просто написать не интересно, мне интереснее разные варианты реализаций сравнивать между собой, а т.к. варианты возможны в разных местах кода - происходит комбинаторный взрыв :smiley:

ilt: с управлением версиями это самое то

ilt: наклепал разных вариантов и давай их сравнивать

ilt: arr[i] добавляет 20% роллаутов

BorisZ: Uljahn 07:44PM мне в бфс нравится, что можно радиус фронтира контролировать

BorisZ: точно - еще одна капля на мельницу полезности бфс

Uljahn: в принципе, и в дфс можно длину путей обрезать на нужной длине, наверное

Uljahn: но как-то не очень удобно

BorisZ: я в подлодках кстати делал так - длинные пути не хватало времени обсчитать, просто добавлял в конце бфс на небольшую глубину

BorisZ: а не получится что не все клетки в заданном радиусе обойдешь?

BorisZ: я чет не могу сообразить

BorisZ: про дфс трудно думать - во )

BorisZ: про бфс легко )

BorisZ: в подлобках вместо того чтобы грубо говоря путь длинной 20 считать, я считал длинной 8 а потом в конце бфс с отсечкой в 12 клеток

BorisZ: цифры не помню точно

BorisZ: для пути нормальная оценка - тяжелая какая-то, в конце довесок - чтоб в тупики не заползал на ровном месте

BorisZ: надо было число своих позиций с точки зрения врага считать и еще чего-то

BorisZ: позапрошлый контест уже затянулся туманом, как детские воспонминания

Uljahn: хм, 78 очков до следующего уровня, надо чё-нить зарешать, пока spaceХ не полетел

BorisZ: два часа еще

BorisZ: завтра посмотрю в записи, очень мне понравилось как 2 ускорителя садятся одновременно

BorisZ: но тут вроде один только основной судя по фотке

BorisZ: жалко блин

BorisZ: поменял подложку в профиле, поддержать пацанов

BorisZ: как тебе такое, Илон Маск?

Uljahn: хд

dbf: в java, кстати, с arr[i] проблема, что проверяется выход за края еще

dbf: и вроде далеко не всегда эта проверка может быть вырезана при оптимизации jitом

tutubalin: кстати, по поводу космоса. обещают в этом году Kerbal Space Program 2.