Пилю программку по обсчёту китайского покера

Последний пост:26.11.2023
22
1 2 3 4 5 23 43 114
  • Так, с подсчётом вероятности собрать фантазию вроде разобрались...
    Теперь попробую скрестить ужа с ежом. А именно, так как максимизировать кол-во очков сразу для всей руки я не могу(все комбинации не перебрать), попробую минимизировать "ущерб" от (дельта ЕВочков и дельта ЕВ фантазии)
    грубо говоря, в раскладе



    2ка сверху снижает вер-ть фантазии(на или ) с 59% до 35%, ну, а двойка хоть и наносит "ущерб" ЕВ очкам, но не такой сокрушительный. Следовательно, если мимимизировать "суммарный ущерб", 2ка в топ идти не должна
    11/741
    Ответить Цитировать
    0
  • БиллиУбили, да не, 2ке в топе самое место. трипс собрать можем - считай тоже фантазия
    4/10
    Ответить Цитировать
    5
  • БиллиУбили, Я в угаре , с помощью СВОЕЙ проги решил , что должна быть в топе , но с помощью СВОИХ же вычислений ей там не место.
    1/7
    Ответить Цитировать
    2
  • Цитата (Wall-e0605 @ 17.1.2019)
    БиллиУбили, да не, 2ке в топе самое место. трипс собрать можем - считай тоже фантазия


    Цитата (Bolshewik @ 18.1.2019)
    Я в угаре , с помощью СВОЕЙ проги решил , что должна быть в топе , но с помощью СВОИХ же вычислений ей там не место

    А что, программка должна сразу полный функционал использовать? когда я клал двойку наверх, я не рассматривал фантазию(верхнюю линию) и по расчётам выходило, что она наносила "вред" и нижний линии, и средней.
    Если подключить подсчёт(учёт) фантазии, то ясно, что 2ка в топе наносит больший урон. Если определить урон, как потерю общего ЕВ руки(опять же рассматривая заполнение линий независимо друг от друга).

    2All
    Думал я, думал, как склеить подьём(3 карты) и текущую руку...и что-то муторно выходит. Ведь мало того, что 3 приходящих карты зависят от колоды, то ещё и существует N способов их разложить. Поэтому просто сохранять руку и подьёмы вместе бессмысленно - это ничего не даёт.
    Рассмотрим такую ситуацию:



    пришли
    выбор несложный: положить 2ку в мидл и либо класть вниз в расчёте на стрит, либо надеяться собрать внизу трипс или 2пары.
    Как можно было решить эту задачу?
    Перебрать все варианты расклада , получить все(новые) возможные 3ёхкарточные наборы из колоды, снова перебрать все варианты расклада, но уже для окончания руки. Найти для всех возможных рук ЕВ, обратным поиском найти ЕВ всех вариантов расклада и выбрать из них максимальный.
    Но можно и по-другому.
    Хотя вариантов конечных "живых" рук много, они всё же конечны. Тогда можно назначить их вершинами графа, а рёбра, связывающих их с незаконченной рукой, будут соответствовать наборам карт, которые могут придти за оставшиеся расклады.
    Тогда ЕВ незаконченной руки будет сумма всех путей(вероятности) до всех вариантов конечных рук(для них ЕВ твёрдо и чётко посчитано).
    Тогда как же определить, как разложить ?
    надо сравнить пути от промежуточных вершин(вариантов расклада) до конечных рук. Естественно, эти пути(вероятности) будут меняться в процессе заигрывания карт из колоды...но свой выбор мы будем делать на основании текущей "информации". То есть, если путь для стрита короче - мы будем класть А вниз, если короче путь для (трипс или 2 пары+ внизу) - не будем класть.
    В данном примере мы уже никак не успеем среагировать на выход королей из колоды и поедем по старым рельсам.

    ЗЫ да, внизу ещё возможен стрит на 89, но я опустил этот факт для простоты описания.
    ЗЫ2 Количество промежуточных вершин тоже конечно. Более того, некоторые сразу приводят к скупу.
    12/741
    Ответить Цитировать
    0
  • отберите у него грибы
    5/10
    Ответить Цитировать
    4
  • Wall-e0605, Да он Кулона переплюнет.
    2/7
    Ответить Цитировать
    1
  • Так, новости такие. От графа пока откажемся, слишком мало кода в интернете, все почему-то выходят на матрицу смежности, что как-то не солидно. Ну, да ладно.
    Удалось развить функцию, находящую вероятность завершить строку(до этого аналогичная считала вероятность собрать фантазию в топе).
    Теперь функция работает с полным перебором колоды, ей не надо напрямую сообщать кол-во оставшихся карт того или иного достоинства.
    Для задачи "имеем колоду, из которой последовательно(по одной) вытаскиваем М карт, каждый раз мы можем либо оставить(добавить) карту к уже имеющимся в линии, либо сбросить. Найти вероятность собрать перечень комбинаций.

    Псевдокод такой.
    1. Имеем линию для завершения, например
    2. Определяем успешные комбинации, например , и т.д.
    3. Для каждого шага и для каждой карты из колоды у нас 2 альтернативы: либо оставить карту, либо сбросить.
    4. Введём дополнительную функцию, которая считает полную вероятность собрать комб. из п2, с колодой без карты из п3, для случаев, когда мы её добавили и когда сбросили. Она нужна для того, что если пришла на первом подьёме(осталось ещё 3), то может быть выгоднее её сбросить, чем положить. Так как для какой-то конкретной колоды вероятность закончить стрит за оставшиеся "подьёмы" может быть ниже, чем собрать 2пары.
    5. Для п.3 вызываем доп. функцию и решаем: оставлять(добавлять) карту или скидывать.
    6. Повторяем п.5 для уменьшенной на 1 карту колоды
    7. Выход из функции по 2 условиям: либо (какая-то)комбинация собрана, либо мы израсходовали все "подьёмы".

    Доп. функция
    написана с помощью рекурсии, но можно и циклами.

    // FP - колво свободных "мест"
    double complete_p(std::string d, std::string s, int FP)
    {
    std::string foo, foo2;
    double t;
    std::sort(s.begin(), s.end());


    if(s == "45678" || s == "34567" || s == "56789" )
    //|| s == "56777" || s == "56766" || s == "55567")
    return 1.0;
    if(s == "56777" || s == "56667" || s == "55567")
    return 1.0;
    // else if(s == "56677" || s == "55667" || s == "55677")
    //return 1.0;
    else if (s.length() == 5)
    return 0.0;
    if(s.length() == 4 && FP== 1) //кладём любую пришедшую карту
    {
    for(int i=0; i < d.size(); ++i)
    {foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*complete_p(foo2,foo,FP-1);
    }
    return t;
    }
    //} while(d.size() >0);
    if(s.length() == 3 && FP== 2) //кладём любую пришедшую карту
    {
    for(int i=0; i < d.size(); ++i)
    {foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*complete_p(foo2,foo,FP-1);
    }
    return t;
    }
    };


    // M - колво подьёмов по одной карте
    double fill_p(std::string d, std::string s, int M)
    {
    std::string foo, foo2;
    double t =0.0;
    std::sort(s.begin(), s.end());


    if(s == "45678" || s == "34567" || s == "56789" )
    //|| s == "56777" || s == "56766" || s == "55567")
    return 1.0;
    if(s == "56777" || s == "56667" || s == "55567")
    return 1.0;
    //else if(s == "56677" || s == "55667" || s == "55677")
    //return 1.0;
    else if (s.length() == 5)
    return 0.0;

    //кладём или не кладём?
    if (s.length() == 4 && M == 1)
    {
    for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    //кладём по-любому
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    }return t;
    }
    //тоже кладём по-любому
    if (s.length() == 3 && M == 2)
    {
    for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    }return t;
    }

    if ( M > 2 && s.length() == 3)
    {for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    if (complete_p(foo2,foo,1) >= complete_p(foo2,s,2))
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    else
    t = t + 1.0/(double)d.size()*fill_p(foo2,s,M-1);
    }
    return t;
    }

    if ( M >= 2 && s.length() == 4)
    {for(int i=0; i < d.size(); ++i)
    {
    foo = s + d.at(i);
    foo2 = d;
    foo2.erase(foo2.begin() + i);
    if (complete_p(foo2,foo,0) >= complete_p(foo2,s,1))
    t = t + 1.0/(double)d.size()*fill_p(foo2,foo,M-1);
    else
    t = t + 1.0/(double)d.size()*fill_p(foo2,s,M-1);
    }
    return t;
    }
    };

    Перехожу к отладке подьёмов из 2 карт{можно положить 0, 1 или 2карты}
    13/741
    Ответить Цитировать
    0
  • БиллиУбили, пока ты тут херней теорией занимаешься другие на практике плюсуют и неплохо.
    3/7
    Ответить Цитировать
    1
  • Цитата (Bolshewik @ 23.1.2019)
    БиллиУбили, пока ты тут херней теорией занимаешься другие на практике плюсуют и неплохо.

    молодцы, чо
    14/741
    Ответить Цитировать
    0
  • Цитата (БиллиУбили @ 20.1.2019)
    А что, программка должна сразу полный функционал использовать? когда я клал двойку наверх, я не рассматривал фантазию(верхнюю линию) и по расчётам выходило, что она наносила "вред" и нижний линии, и средней.
    Если подключить подсчёт(учёт) фантазии, то ясно, что 2ка в топе наносит больший урон. Если определить урон, как потерю общего ЕВ руки(опять же рассматривая заполнение линий независимо друг от друга).

    2All
    Думал я, думал, как склеить подьём(3 карты) и текущую руку...и что-то муторно выходит. Ведь мало того, что 3 приходящих карты зависят от колоды, то ещё и существует N способов их разложить. Поэтому просто сохранять руку и подьёмы вместе бессмысленно - это ничего не даёт.
    Рассмотрим такую ситуацию:



    пришли
    выбор несложный: положить 2ку в мидл и либо класть вниз в расчёте на стрит, либо надеяться собрать внизу трипс или 2пары.
    Как можно было решить эту задачу?
    Перебрать все варианты расклада , получить все(новые) возможные 3ёхкарточные наборы из колоды, снова перебрать все варианты расклада, но уже для окончания руки. Найти для всех возможных рук ЕВ, обратным поиском найти ЕВ всех вариантов расклада и выбрать из них максимальный.
    Но можно и по-другому.
    Хотя вариантов конечных "живых" рук много, они всё же конечны. Тогда можно назначить их вершинами графа, а рёбра, связывающих их с незаконченной рукой, будут соответствовать наборам карт, которые могут придти за оставшиеся расклады.
    Тогда ЕВ незаконченной руки будет сумма всех путей(вероятности) до всех вариантов конечных рук(для них ЕВ твёрдо и чётко посчитано).
    Тогда как же определить, как разложить ?
    надо сравнить пути от промежуточных вершин(вариантов расклада) до конечных рук. Естественно, эти пути(вероятности) будут меняться в процессе заигрывания карт из колоды...но свой выбор мы будем делать на основании текущей "информации". То есть, если путь для стрита короче - мы будем класть А вниз, если короче путь для (трипс или 2 пары+ внизу) - не будем класть.
    В данном примере мы уже никак не успеем среагировать на выход королей из колоды и поедем по старым рельсам.

    ЗЫ да, внизу ещё возможен стрит на 89, но я опустил этот факт для простоты описания.
    ЗЫ2 Количество промежуточных вершин тоже конечно. Более того, некоторые сразу приводят к скупу.


    БиллиУбили,
    Ну как посчитал? Забудь про ЕВ, оно слишком субъективно. Попробуй посчитать точный шанс на, то что комбинация не сгорит. Его наверняка есть с чем сравнить, чтоб понять не полный ли бред получается.
    Пиши почаще, интересно.
    1/35
    Ответить Цитировать
    0
  • к слову о 2ке в топе. не такая уж и плохая идея

    6/10
    Ответить Цитировать
    1
  • все такие помошники ... а зачем помогать читерить? ну сделает он прогу , ну пойдет с ней потом вас же шкурить ... а вы пометите его ботом и будете его избегать ... оч хорошо что софт сделать сложно ... тем более хорошего уровня ...
    софта у меня нет , есть симулятор с вероятностями того сего ...

    гадаю я по кофейной гуще в ананас хорошо , всегда готов против твоей проги на 5-10к руб сыграть ...

    еще если тебе интересно я писал софт для генерации формул :

    с помощью них можно полностью решить китай, но нужны мощностя суперкомпа... + тонны времени на программирование...

    пс прочитал выше размышления и путь решения ... могу поставить 50 баксов что софт не получится...
    Сообщение отредактировал c00l0ne - 26.1.2019, 12:58
    1/882
    Ответить Цитировать
    0
  • Так, ну новости какие. Убил 4 или 5 дней на ловлю ошибку. В рекурсивном вызове функции я не вводил новую переменную, и поэтому в цикле она передавалась раз за разом. Я уж грешил на std::string, но всё оказалось проще (смайлик, вытирающий пот со лба).
    Да, рекурсивную функцию удалось расширить до подьёмов из двух карт(можно положить 0,1,2 карты). Для колоды из 20 карт считает около минуты. Теперь можно переходить к тестированию подьёмов из 3ёх карт.

    Цитата (diklee @ 25.1.2019)
    Попробуй посчитать точный шанс на, то что комбинация не сгорит

    Наоборот. Подсчёт шансов бессмысленно считать дальше, когда на каком-то подьёме он обратился в 0(и дальше, естественно, "улучшиться не может". Пока я подсчёт не обрубаю.
    Спасибо за поддержку.

    Цитата (c00l0ne @ 26.1.2019)
    гадаю я по кофейной гуще в ананас хорошо , всегда готов против твоей проги на 5-10к руб сыграть ...

    ну, извини, я смотрел всего ОДИН стрим с тобой. И всего 2-3 раздачи. Каждый раз ты ГАДАЛ, как бы положить. И более того, прокручивал раздачу до конца и делал совершенно неправильные выводы "вот, значит на 2ом подьёме надо было играть по-другому", что говорит о том, что ты не знаешь, как было ПРАВИЛЬНО играть 2ой подьём. Так как это знание не зависит от того, что тебе пришло на следующих подьёмах в конкретной "раздаче".
    Цитата (c00l0ne @ 26.1.2019)
    еще если тебе интересно я писал софт для генерации формул

    видео недоступно
    Цитата (c00l0ne @ 26.1.2019)
    с помощью них можно полностью решить китай, но нужны мощностя суперкомпа... + тонны времени на программирование...

    Если у тебя есть какая-то задача и ты посчитал для неё абсолютно точное решение - выкладывай. Сравним ответы.
    Цитата (c00l0ne @ 26.1.2019)
    пс прочитал выше размышления и путь решения ... могу поставить 50 баксов что софт не получится...

    Согласен, решить задачу класса NP не так уж и просто.
    15/741
    Ответить Цитировать
    0
  • Цитата (БиллиУбили @ 28.1.2019)
    Наоборот. Подсчёт шансов бессмысленно считать дальше, когда на каком-то подьёме он обратился в 0(и дальше, естественно, "улучшиться не может". Пока я подсчёт не обрубаю.
    Спасибо за поддержку.

    Я не имел ввиду попытки посчитать ев стартовой руки. Я про часный случай, где мы решаем с тузом ити на гатшот или раннер раннер две пары. Там есть четкая вероятность собраться или сгореть.
    2/35
    Ответить Цитировать
    0
  • Цитата (diklee @ 29.1.2019)
    Я про часный случай, где мы решаем с тузом ити на гатшот или раннер раннер две пары. Там есть четкая вероятность собраться или сгореть.

    Я писал про работу алгоритма. На каждом подьёме он сравнивает шансы завершить руку(линию) для 3 вариантов разложения подьёма и выбирает максимальный. Но они все могут быть равны 0. Значит алгоритм максимальным выберет первый попавшийся. И продолжит "считать" дальше. Хотя уже тут его можно было бы оборвать. Но ИРЛ это соответствует гарантированному скупу на предпоследнем подьёме. Достаточно редкая ситуация и лучше ничего в работе алгоритма не трогать.
    16/741
    Ответить Цитировать
    0
  • БиллиУбили, а можно знать как правильно класть ?) внутри меня же не кластерный вычислительный центр , а делать выводы по 2-3 раздачам такое себе ... есть раздачи карра но я их не дам) могу продать
    2/882
    Ответить Цитировать
    0
  • c00l0ne, я говорил про стрим, где ты разбираешь раздачи, а не играешь. У тебя было овердохуя времени, чтобы разобраться, а не гонять подьёмы туда-сюда. Дай ссылку на твой стрим, где ты, по твоему мнению, оптимально кладёшь
    17/741
    Ответить Цитировать
    0
  • БиллиУбили, посл стрим https://www.twitch.tv/videos/370152423
    оптимально человек не может класть , только боты ...
    я кладу "как Бог" )))

    одно не понимаю, зачем тебе софт для китая ?
    1$ за расчет будешь брать? )
    3/882
    Ответить Цитировать
    0
  • чтобы проверить свою прожку посчитай евшку фула со стартера 44223
    уверен с 44 голой будте евшка выше чем с 4422
    4/882
    Ответить Цитировать
    0
  • уфф...удалось ввести подьём по 3 карты(кладём 0,1 или 2 карты)
    Для линии из 3 карт время расчёта по сравнению с подьёмами по 2 карты(кладём 0,1 или 2 карты) увеличилось более, чем в 2 раза.
    Для колоды 25 карт:
    4.5 мин vs 2 мин

    Вероятность закончить комбинацию уменьшилась:
    0.172 vs 0.184

    Теперь жду ваш совет, что делать дальше:
    подрубать 2 линию или поработать надо оптимизацией алгоритма? Принимаю ваши комментарии до завтрашнего утра.

    поправка 3 карты(кладём 0,1 или 2 карты) -> 3 карты(кладём 1 или 2 карты)
    Сообщение отредактировал БиллиУбили - 30.1.2019, 19:48
    18/741
    Ответить Цитировать
    0
1 2 3 4 5 23 43 114
2 человека читают эту тему (2 гостя):
Зачем регистрироваться на GipsyTeam?
  • Вы сможете оставлять комментарии, оценивать посты, участвовать в дискуссиях и повышать свой уровень игры.
  • Если вы предпочитаете четырехцветную колоду и хотите отключить анимацию аватаров, эти возможности будут в настройках профиля.
  • Вам станут доступны закладки, бекинг и другие удобные инструменты сайта.
  • На каждой странице будет видно, где появились новые посты и комментарии.
  • Если вы зарегистрированы в покер-румах через GipsyTeam, вы получите статистику рейка, бонусные очки для покупок в магазине, эксклюзивные акции и расширенную поддержку.s