Jak, не почитали статью , про игру Hearts? Какие мысли? Может Вам интегрированно изложить ? ... Напишите фид бек...
Лусидо подключайся тоже ...
Может кто ещё изъявит желание...
Если есть сильные математики...
Тоже напишите ...
В моем представлении данный метод хорош тем что применим к любой абсолютно среде и в том что мы не получаем черный ящик, а получаем линейные фичи и зависимости евшки от них ... А это уже невероятно ценная информация... Для обучения например или для новых открытий...
Сама игра не интересна. Метод пробежал быстренько. Почитаю еще повнимательней.
Читал раньше, что кто-то уже занимался этим.
У китая есть одна большая особенность, которая отличает его от других игр.
Лет 15-20 на cgm.ru все занимались играми против казино: блекджек, русский, оазис ... Я тоже тогда этим занимался. Там тоже перебором посчитать было нереально, но комбинаторика все вывезла. Там было все просто, свободных мест К, берем К карт из колоды и заполняем.
В китае получаем 3 карты, а кладем 2-е. Тут обрывается комбинаторика. И так на каждом подъеме. Я пытался последний уровень (он самый узкий) посчитать комбинаторикой. Все считается хорошо. Но потом перебор всех троек для поиска лучшей все портит. И выходит, что вся комбинаторика насмарку. Все равно потом надо перебирать массив. Вот если бы не было этого выбора 2-х из 3-х, все было бы проще.
Jak, не то ... Совсем не в ту сторону...
Jak @ 09.06.23Сама игра не интересна
+ Но в ней состояний больше чем в Китайском
Jak @ 09.06.23оазис
О! и как там против казино в Оазис, удавалось в плюс выходить? У меня друг любит полудить в него... 2-4 бокса
Jak @ 09.06.23Вот если бы не было этого выбора 2-х из 3-х, все было бы проще.
Да все равно там полное дерево 🌲 с оппонентом огромное... Все равно комп не вывезет...
Поэтому мы там где мы есть, ну потихоньку начну с того что метод динамического программирования , TD learning называется или temporal-difference Learning , как он работает сами разберётесь, а как работает целый алгоритм :
Выбираются фичи, атомные , не подлодки а фичи, ядра
Далее делается мутация их , рекомбинации , скрещивания разными логическими операциями и из атомных получается набор фич : тысячи штук .
Далее происходит на базе этого набора обучение, то как каждая фича влияет на состояние игры, фичи входят в линейный перцептерон который оценивает текущее состояние:
ev = Ei fi*wi вот эта сумма искомая...
Ну и дальше попроще...
Но главная цель, добиться апроксимации любой точки системы
c00l0ne @ 09.06.23О! и как там против казино в Оазис, удавалось в плюс выходить? У меня друг любит полудить в него... 2-4 бокса
Оазис давно посчитан.
Правда их (оазисов, игр) много, с разными вариантами правил обмена. Много из них плюсовые, конечно мы в них плюсовали.
Есть оазис где АК играет с обменом 1 карты,
обмен 1,5 карт,
обмен 1,2 карт,
обмен 1,2,5 карт,
даже 1,2,5,6-я был.
Для них давно есть своя стратегия. Особенно если есть обмен информацией между игроками.
Например играем оазис 1,5.
Садились 6 игроков. Маяками обменивались о наличии А, К и вскрышка дилера. И на основании этого меняли сколько надо карт и принимали решение закрываться или скидывать. Особенно когда пара/тройка челов меняла 5 карт, получалось узнавать почти всю колоду и соответственно карты дилера. Можно было оценить вероятность "игры" или "нет игры" дилера.
6 игроков = 30 карт + карта дилера.
В центре сидит дирижер. Слева и справа ему говорят у кого есть А, К, вскрышка. Он считает. Всем говорит. Конечно не голосом, а кивает головой или руками показывает. Идет обмен. Пусть у дилера 5-ка. Если вскрышка <8 выгодно менять 5 карт. Трое меняют 5 карт. Открываются еще 15 карт. Мы уже знаем 46 карт из 52. Говорят дирижеру, что из интересного пришло. И тут уже легко можно предположить есть игра у дилера или нет.
Если вероятность игры большая и это вскрышка (карта дилера), или на руках нет АК и возможно АК у дилера, те кто бьет дилера - закрываются, остальные пас. Если скорее игры нет, все закрываются даже ничего не имея. И т.д. Сплошное веселье.
Пока что на чиле, не получается особо покумекать над этим всем ...
Давайте какую нибудь задачу простую поставим ...
Раньше когда ставил задачки быстро двигались :
1) Создадим тестовый набор данных, допустим 10 000 000 наборов данных ( раздач ) , чтобы было более реалистично и имело практическое значение , пусть будут это раздачи в хедзапе против фантазии .
Соответственно файлик будет с этими данными, где номер раздачи , входящие данные и фантазия у оппонента . Пусть будет классический ананас .
2) Необходимо сделать "окружение" игры так называемое :
собственно где можно начинать раздачу, делать ходы , где можно довести игру до конца и там получить роялти ...
Модель игры ...
без всяких само собой упрощений и ухищрений ...
3) После этого уже можно приступать к решению, обучению разных мощных алгоритмов...
Итого: у нас будет общий набор данных , если кто то еще пойдет по этому пути развития...
Будем делиться результатами ... а они у всех будут разные ... но понятно к чему нужно будет стремиться ... к ожиданию против фантазии ...
попозже , тесты все же надо сделать )
всё отладил, всего то 4-5 чаосв )
в один поток / 38 Гб рамы
Гг
это методом глобальной индексации нод
на все про все ушло часов 10-12, дерзайте
индексы уникальных нод так распределяются для этой раздачи:
1.7 млн предпоследних
64087 это вторая сдача
689 это первая сдача
1 это сам стартер
не жгите процы ребяты)
осталось оптимизировать все: память , параллелизацию... и можно попробовать стартера посчитать ...
кто будет делать , удалось сократить до 3гбайт с потерей немного производительности
c00l0ne @ 13.06.23потерей немного производительности
заменил стандартный словарь с++ std::map на Judy Array
https://github.com/JerrySievert/judyarray
производительность вернулась, 38 сек в однопотоке один вариант, за минуту 20 вариантов где то в мультипотоке...
оперативки 2 Гб потребляет... на один поток ...
самый кайф что все дерево остается в памяти ...
ну и алгоритм уже является полноценным солвером всех стартеров ...
дальше путь самурая выглядит так :
сейвим стартера ВСЕ) и первые улицы ... дальше что нибудь с ними сделаем)
держу в курсе ...
пс ну что пора придумать какой то официальный формат для сохранения раздач в ofcp :D
у Jak'a мне понравилась идея , карты писать и ход раздачи ... оч красиво ...
формат по аналогии с PioSolver'ом , там тоже префлоп ренжи храняться и флоп ... остальное все дорешивается ...
так и у нас будет стартера + первый ход ... остальное все допинается само...
масти пока не учитываем ...
уникальных стартовых пятерок всего 6175 штук :
если по 3 варианта обсчитывать, это где то сутки машинного времени ...
хеш табличка шустрая https://github.com/skarupke/flat_hash_map
вся фишка в пространстве имет ska::flat_hash_map ... ска топчег...
по мне так лучше чем google::flat_hash_map и прочие радости ... но это не точно ... гугл не тестил ...
пока что такие скоростя :
Q/A/993
алг шлифану , расскажу про ощущения ...
с параллелизацией беда конечно же ...
горизонтальный алгоритм идеально ложился под ядра ЦПУ...
вертикальный же немного другим берет... масштабом вычислений...
больше для GPU / CUDA подходит ... но и туда натянуть сложно будет ...
Интересно, но ничего не понятно 🤥
Какой смысл решать частную задачу первого стартера, когда все карты есть и ты их раскладываешь на места?
c00l0ne @ 13.06.23самый кайф что все дерево остается в памяти ...
ну и алгоритм уже является полноценным солвером всех стартеров ...
Как только будут выкинуты карты из колоды, сразу твое дерево не имеет смысла и его надо пересчитывать.
Надо считать именно общий случай: нет Х (5 или 10) карт, мы их видим. нам пришла пятерка карт, вот этот стартер и считай. Как тебе поможет дерево для полной колоды в этом случае? Будешь пробегать по всему дереву и отсекать ненужные ветки? Проще построить новое дерево.
И еще, а ты точно ананас считаешь? Там ведь на каждой улице из 3-х карт берут 2-е и их кладут на линии. А третью карту выкидывают. Если это опустить, брать только 2-е карты и третью замешивать в колоду, резы сразу поменяются в худшую сторону.
Даже если третью выкидывать, и учитывать все третьи карты, резы меняются. Я это проверял.
c00l0ne @ 13.06.23масти пока не учитываем ...
про какой тогда солвер ты говоришь? без мастей, полуананас?
Jak, мне интересен сам алгоритм, китайский побочка...
Jak @ 15.06.23Интересно, но ничего не понятно 🤥
Перечитайте ветку , с пол года назад описывал этот алгоритм, решаем ноды все посл сдачи, потом предпоследней и так до стартера... Но он сложный, нужна огромная таблица индексации...
Вот эта таблица и реализована хештабличкой...
Jak @ 15.06.23Какой смысл решать частную задачу первого стартера, когда все карты есть и ты их раскладываешь на места?
Все это легко под конкретную ситуацию пересчитывается, нужны же направления для алгоритма мктс... Полное дерево не возможно так решить через мктс... А вот частичное решается за секунды... Но чтобы это частичное построить нужно сначала полное решить и отсечь совсем мертвые ветки...
Чем и занимаемся мы тут ... с Вами)
Jak @ 15.06.23Как только будут выкинуты карты из колоды, сразу твое дерево не имеет смысла и его надо пересчитывать.
Надо считать именно общий случай: нет Х (5 или 10) карт, мы их видим. нам пришла пятерка карт, вот этот стартер и считай. Как тебе поможет дерево для полной колоды в этом случае? Будешь пробегать по всему дереву и отсекать ненужные ветки? Проще построить новое дерево.
Нифига не проще, как вы будете считать игру оппонента? Там дерево глубины как черная дыра... Вместе с игрой оппонентов в 3 Максе ...
Jak @ 15.06.23ананас считаешь? Там ведь на каждой улице из 3-х карт берут 2-е и их кладут на линии. А третью карту выкидывают. Если это опустить, брать только 2-е карты и третью замешивать в колоду, резы сразу поменяются в худшую сторону.
Прекратите бомбеж, готов деньги поставить что вы никогда в жизни не обыграете солвер который решил 2 карты из 3 карт сдачи ... Да Вы и первый алгоритм не обыграете, который в вашей программе)) если я его настрою ... Человек к сожалению не способен...
Jak @ 15.06.23про какой тогда солвер ты говоришь? без мастей, полуананас?
Все будет ... Флеши это отдельная игра...
Jak, спрашивайте если что то непонятно, что то по коду только в личку, общие вопросы тут можно обсудить ...
В первом алгоритме какая проблема А дядь? Слишком много умножений! Как ее решить? Умножать поменьше, каааак? Ну можно посмотреть где мы делаем повторные вычисления и их хешировать ...
Где где спросите вы мы делаем повторные вычисления... Да мы оч часто одни и те же терминальные узлы обсчитываем на посл и предпоследней сдаче... А зачем мы их несколько раз обсчитываем? Да потому что мы не знаем повторились они или нет
? Потому что идём последовательным путем... Вот и приходим к тому что нам надо считать сразу крайние терминальные узлы и от них строить связи к предыдущим исключая любые повторные вычисления...
Пс ну и отмечу что алгоритм со звёздочкой, думаю Вы понимаете что это значит ... можно не вывести ... Но решает достаточно широкий класс задач где можно построить граф наших стратегий и провести прямую симуляцию... Рекомендую сразу писать на с++ ... на Делфи не смогу помочь... А через полгода перейду на rust полностью ...
Оставлю тут заметку:
Применение нейросетей для визуализации сложных алгоритмов
c00l0ne @ 15.06.23Рекомендую сразу писать на с++ ... на Делфи не смогу помочь... А через полгода перейду на rust полностью ...
Да какая разница на каком языке писАть. Тут важна прокладка.
Или ты думаешь, что на rust прога будет лучше считать?
Это же как книжки. Не важно на каком языке ты будешь выражать свои мысли. Главное мысли иметь и грамотно их выражать. Не спорю, конечно описывать природу на французском наверно красивей, чем на корейском.
c00l0ne @ 15.06.23Все будет ... Флеши это отдельная игра...
Я и говорю, что ты не для китая пишешь. Какая-то своя игра.
Jak @ 16.06.23каком языке писАть
Не хочу в таком тут духе общаться, ну почему то windows на c++ писали,но важна же прокладка между стулом и клавиатурой
А сейчас на rust переходят, исправляя косяки c++ ...
Все это голословно и вступать в такие демагогии у меня нет времени...
Смотри преимущества Rust в чем в ролике перед с++, но что то прокладки не кинулись на радостях писать на Rust, потому что язык требует уже уровень входа другой, другой тип мышления...
Вы сами говорите язык не важен , тут же шкурите меня за VBasic .net
Самый топовый язык кстати для изучения алгоритмов и их реализации, особенного для экспериментов, где не нужно выжимать производительность ...
Каждому языку своя ниша, но признанный язык это конечно c++ с миллиардами строк кода написанными людьми и кучей библиотек...
Нужны идеи а не бомбежь...
Jak @ 16.06.23китая пишешь. Какая-то своя игра
Что это значит я не понимаю , вот есть у вас 10 литров воды в ведре, а у нас бутылка литровая и нам туда всю эту воду перелить нужно... Вот аналогия с полной игрой и сокращённой... Я просто не понимаю зачем вы это пишите, либо не понимаете что вся игра не влезет в ттх современных ПК, либо просто бомбежь...
c00l0ne @ 16.06.23Вы сами говорите язык не важен , тут же шкурите меня за VBasic .net
Конечно язык не важен. И про бейсик я тебя не шкурил, я говорил, что на бейсике такую программу не написать. Что-то проверить, конечно можно.
c00l0ne @ 16.06.23Каждому языку своя ниша
именно. бейсик для солвера не подходит.
ты же пишешь
c00l0ne @ 13.06.23ну и алгоритм уже является полноценным солвером всех стартеров
и тут же говоришь, что это сокращенный вариант
ЗЫ. Вот какой мне смысл переходить на другой язык?
У меня наработок 100к++!!! строк разных программ, мне что их все переписывать на rust?
Только этот китай у меня в текстах 3мб символов. 3 мегабайта в 21 файле *.pas! Конечно половина там мусора, всяких ответвлений, проб...
Не верю я что будет прям лучше, проще и быстрей.
В смысле алгоритмов там все тоже самое, циклы, массивы, всякие if ... все такое же. Другого не придумаешь. Вся логика осталась.
Да, может тоже самое записано немного по-другому. Не record, как в delphi, а struct как в с++. Но суть-то та же!
Представь, вот я пишу стихи на русском языке, это родной для меня язык, я легко на нем могу записать свои мысли и увидеть результат. А мне говорят, НЕЕЕЕЕТТТ, надо писать на французском, там красивей звучит. Зачем мне его учить? Конечно если б я только начинал учить языки ... можно было бы выбрать другой. Delphi меня полностью устраивает, вот надо мне на экране поставить картинку, кнопку, grid какой-то с текстами, таблицу, ткнул пару кнопок, установил размер, надписи, свойства и все готово! Все работает, а в VC танцы с бубном.
Jak, я имел ввиду что я в delphi не смогу помочь потому что посл раз видел его 17 лет назад в универе, пишите на нем если нравится
Думаю тема исчерпана
Jak @ 16.06.23говоришь, что это сокращенный вариант
ЗЫ. Вот какой мне смысл переходить на другой язык?
Полный вариант точно невлезет, там таблица переходов будет много гигабайт, но как нибудь попробую
Пока что ближайшая цель сделать датасет 10 000 000 раздач и сыграть их ну против фантазии например
Посмотреть евшку какую покажет
Jak, ну вот теперь все понятно, почему быстрее считает)
Перелистываем страницу, давайте займёмся серьезными вещами:
https://www.google.com/url?sa=t&source=web&rct=j&url=https://sites.ualberta.ca/~amw8/hearts.pdf&ved=2ahUKEwivptH-nrP_AhUKvYsKHWKfABEQFnoECAsQAQ&usg=AOvVaw0y0UzqgxZsLt5cCPLu0U9V
Создам отдельно тему
Пока что мой опыт это запуск из книжек примеров по обучению
Ну и часов 10 в Python код разбирал...
Посмотрим что за лето получится навернуть...