Программа построения равновесных стратегий для игры

Разработка равновесных jam-fold стратегий в игре для двух человек. Стратегия для Texas holdem, в которой оценивается зависимость вероятности победы в турнире от количества фишек у игроков. Эффективное вычисление математического ожидания для игры Omaha.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 07.07.2016
Размер файла 306,3 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

3. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

4. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

5. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

6. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

7. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[24][4]=

{{1,2,0,0}, //Вариант 1

{1,3,0,0},

{2,1,0,0},

{2,3,0,0},

{3,1,0,0},

{3,2,0,0},

{0,1,3,3}, //Вариант 2

{0,2,3,3},

{0,1,2,2},

{0,3,2,2},

{1,0,3,3}, //Вариант 3

{2,0,3,3},

{1,0,2,2},

{3,0,2,2},

{1,2,3,3}, //Вариант 4

{2,1,3,3},

{1,3,2,2},

{3,1,2,2},

{0,2,1,1}, //Вариант 5

{0,3,1,1},

{2,0,1,1}, //Вариант 6

{3,0,1,1},

{2,3,1,1}, //Вариант 7

{3,2,1,1}}; //Таблица для перебора мастей

int Variants[7]={6,10,14,18,20,22,24}; //Массив вариантов перебора

int Types[7]={1,2,2,2,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=7; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aabc - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 4 стратегически различных варианта:

1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

4. Когда масть которой второй игрок может собрать флаш совпадает с мастью второй карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[4][4]=

{{0,0,0,0}, //Вариант 1

{1,1,1,1}, //Вариант 2

{2,2,2,2}, //Вариант 3

{3,3,3,3} //Вариант 4

}; //Таблица для перебора мастей

int Variants[4]={1,2,3,4}; //Массив вариантов перебора

int Types[4]={1,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=4; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aaab - aaab. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 5 стратегически различных вариантов:

1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

4. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не присутствует у первого игрока. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

5. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[12][4]=

{{1,0,0,0}, //Вариант 1

{2,0,0,0},

{3,0,0,0},

{0,2,2,2}, //Вариант 2

{0,3,3,3},

{1,2,2,2}, //Вариант 3

{3,2,2,2},

{1,3,3,3},

{2,3,3,3},

{2,1,1,1}, //Вариант 4

{3,1,1,1},

{0,1,1,1} //Вариант 5

}; //Таблица для перебора мастей

int Variants[5]={3,5,9,11,12}; //Массив вариантов перебора

int Types[5]={1,2,2,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=5; //Количество типов вариантов

Рассмотрим вариант перебора для подгруппы aaab - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 3 стратегически различных варианта:

1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш совпадает с мастью первой карты которой первый игрок не может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[4][4]=

{{0,0,0,0}, //Вариант 1

{3,3,3,3}, //Вариант 2

{2,2,2,2},

{3,3,3,3} //Вариант 3

}; //Таблица для перебора мастей

int Variants[3]={1,3,4}; //Массив вариантов перебора

int Types[3]={1,2,2}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=3; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aaaa - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 2 стратегически различных варианта:

1. Когда масть которой второй игрок может собрать флаш совпадает с мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет только одна значимая масть, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш не присутствует у первого игрока. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[4][4]=

{{0,0,0,0}, //Вариант 1

{1,1,1,1}, //Вариант 2

{2,2,2,2},

{3,3,3,3}

}; //Таблица для перебора мастей

int Variants[2]={1,4}; //Массив вариантов перебора

int Types[2]={1,2}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=2; //Количество типов вариантов

Рассмотрим правила перебора для групп одномастные - двухмастные. Для перебора вариантов этой ситуации нам необходимо учесть, что группа одномастных состоит из трёх подгрупп: aaaa, aaab и aabc. Каждую из этих подгрупп будем перебирать с двухмастными отдельно.

Рассмотрим вариант перебора для подгрупп aabb - aabc. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 12 стратегически различных вариантов:

1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

4. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

5. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

6. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масти карт которые не могу собрать флаш у второго игрока не пересекаются с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

7. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

8. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

9. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

10. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

11. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

12. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок и масть второй карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

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

Процедуру перебора двух кластеров данного сочетания групп данного сочетания подгрупп на языке C++ можно посмотреть в приложении A9.

Рассмотрим вариант перебора для подгрупп aabb - aaab. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 7 стратегически различных вариантов:

1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

4. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

5. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока совпадает с первой мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

6. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока совпадает со второй мастью которой может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

7. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и масть первой карты которая не может собрать флаш у второго игрока не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[12][4]=

{{1,0,0,0}, //Вариант 1

{2,0,0,0}, //Вариант 2

{3,0,0,0},

{0,1,1,1}, //Вариант 3

{2,1,1,1}, //Вариант 4

{3,1,1,1},

{0,2,2,2}, //Вариант 5

{0,3,3,3},

{1,2,2,2}, //Вариант 6

{1,2,2,2},

{2,3,3,3}, //Вариант 7

{3,2,2,2}};

int Variants[7]={1,3,4,6,8,10,12}; //Массив вариантов перебора

int Types[7]={2,2,2,2,3,3,3,3}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=7; //Количество типов вариантов

Рассмотрим вариант перебора для подгрупп aabb - aaaa. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 3 стратегически различных варианта:

1. Когда масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы все масти.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[4][4]=

{{0,0,0,0}, //Вариант 1

{1,1,1,1}, //Вариант 2

{2,2,2,2}, //Вариант 3

{3,3,3,3},

}; //Таблица для перебора мастей

int Variants[3]={1,2,4}; //Массив вариантов перебора

int Types[3]={2,2,3}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=3; //Количество типов вариантов

Рассмотрим правила перебора для групп двухмастные - двухмастные. Зафиксируем карты первого игрока. В зависимости от расположения мастей у карт второго игрока в такой ситуации возможно 7 стратегически различных вариантов:

1. Когда первая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

2. Когда первая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш. Количество этих вариантов без фильтрации будет . У этого сочетания будет две значимые масти, все карты можно будет отобразить в множество и осуществить перебор общих карт соответствующей для этого множества процедурой.

3. Когда первая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

4. Когда первая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

5. Когда вторая масть которой второй игрок может собрать флаш совпадает с первой мастью которой первый игрок может собрать флаш и первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

6. Когда вторая масть которой второй игрок может собрать флаш совпадает со второй мастью которой первый игрок может собрать флаш и первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

7. Когда первая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок и вторая масть которой второй игрок может собрать флаш не совпадает с мастями которыми может собрать флаш первый игрок. Количество этих вариантов без фильтрации будет . У этого сочетания значимы будут все масти.

После перебора этих вариантов делаем аналогичные действия что и в предыдущей ситуации.

Для процедуры на языке C++ нам нужно будет изменить значение нескольких переменных в процедуре для предыдущей ситуации:

char TD[12][4]=

{{0,0,1,1}, //Вариант 1

{1,1,0,0}, //Вариант 2

{0,0,2,2}, //Вариант 3

{0,0,3,3},

{1,1,2,2}, //Вариант 4

{1,1,3,3},

{2,2,0,0}, //Вариант 5

{3,3,0,0},

{2,2,1,1}, //Вариант 6

{3,3,1,1},

{2,2,3,3}, //Вариант 7

{3,3,2,2},; //Таблица для перебора мастей

int Variants[7]={1,2,4,6,8,10,12}; //Массив вариантов перебора

int Types[7]={2,2,3,3,3,3,3}; //Массив типов перебора общих карт для каждого варианта перебора

int numVariants=7; //Количество типов вариантов

9. Расчёт таблицы

В ходе разработки программы, для эффективной работы основного алгоритма программы будет понадобилось рассчитать некоторые предрасчётные данные. Для этого была разработана отдельная программа на языке C++ в рамках которой были реализованы алгоритмы описанные в предыдущих частях.

Из-за высокой сложности реализуемых алгоритмов остро встал вопрос верификации полученных данных. Для проверки результатов был выбран эквилятор propokertools.com. Клиент-серверная архитектура данного инструмента позволила легко и быстро интегрировать программу для расчёта таблицы по средствам протокола HTTP. В результате чего любой получаемый результат мог быть автоматически проверен сторонним эквилятором. На каждом этапе верификации программ случайным образом генерировала входные данные после чего проверяла полученный результат с помощью эквилятора. Из-за ограничений со стороны web-сервера propokertools.com на каждом этапе проверки удавалось верифицировать не более 1000 наборов входных данных и результатов.

Алгоритм расчёта теоретический мог выполнятся параллельно, поэтому после реализации однопоточной версии была разработана и верифицирована многопоточная версия программы. После этого была проведена оценка эффективности расчётов и прогнозирования времени расчёта полной таблицы. Для этого было проведено тестирование на 10000 случайных входных данных. Работая в 10 потоков на процессоре Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz программа произвела расчёты для 10000 входов за 56 секунд. На основании полученного результата с помощью интерполяции было предсказано время расчёта всей таблицы:

секунд, где

- количество уникальных ячеек в таблице,

- размер выборки для тестирования,

- время обработки тестового набора.

Таким образом одному компьютеру на расчёт таблице понадобится порядка суток.

Для увеличения эффективности расчётов была разработана стратегия пакетной обработки данных. Так таблица была разбита на 20 частей равного размера и сложности. Это позволило проводить вычисления на нескольких компьютерах одновременно. При добавлении нескольких компьютеров схожей мощности удалось посчитать заданную таблицу за 48 часов.

После расчётов были полученные данные были собраны в одну таблицу. Размер собранной таблицы составил 6480649344 байт. После агрегации таблицы был проведён очередной этап верификации. Теперь проверялась не работа алгоритма а результаты записанные в произвольно выбранную ячейку.

В заключении работы с таблицей была проведена редукция избыточных данных. Так в одной ячейки хранится распределение для 12 различных исходов. Для задачи нахождения математического ожидания действия AllIn в игре для двух игроков нам будет достаточно знать математическое ожидание выигрываемой части банка (далее equity). Для этого нам не обязательно хранить все 12 исходов. Достаточно хранить только два значения: equity и суммарное количество возможных исходов. Что бы минимизировать потери точности от данного перехода величину equity было решено хранить в формате double. В результате вместо 12*4=48 байт на одну ячейку таблицу удалось сократить до 1*8+1*4=12 байт на ячейку или в 4 раза. Также не стоит забывать, что расчёт equity для Omaha и Omaha Hi/Lo будет отличатся, поэтому сокращённую таблицу придётся хранить в двух экземплярах.

10.Расчёт равновесия по Нэшу

В рамках данной ВКР была создана программа для расчёта равновесных стратегий с помощью метода фиктивного разыгрывания. Благодаря использованию подсчитанной ранее таблицы для вычисления математического ожидания действий удалось достичь приемлемой производительности. Так расчёт одной итерации на компьютере с процессором Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz занимает в среднем 1.3 секунды.

Помимо скорости итерации метод продемонстрировал хорошую сходимость.

Для вычисления сходимости была использована следующая функция невязки

,

где

- математическое ожидание эксплотирующей стратегии для действия AllIn первого игрока против рассчитанной после текущей итерации равновесной стратегии второго игрока для действия Call,

- математическое ожидание эксплотирующей стратегии для действия Call второго игрока против рассчитанной после текущей итерации равновесной стратегии первого игрока для действия AllIn.

Таким образом для ситуации когда у каждого игрока по 100 фишек, обязательные ставки: 5 фишек - малый блаинд, 10 фишек - большой блаинд, после 100 итераций . Это составляет менее 0.01% от призового фонда. Ниже приведён график иллюстрирующий процесс сходимости, по оси X количество пройденных итераций, по оси Y значение :

Рис.2 График сходимости

На основе низкого значения невязки после 100 итераций можно сделать вывод, что полученные стратегии являются - равновесными по Нэшу согласно определению, так как ни один игрок не может увеличить своё математическое ожидание изменив свою стратегию в одностороннем порядке.

Для более удобного использования программы был разработан GUI с помощью фрейморка Qt. Графический интерфейс позволяет указать следующие параметры для расчётов: тип игры, размеры обязательных ставок, количество фишек у игроков, количество итераций для расчёта.

Рис.3 Окно для ввода данных

Программа может отображать получаемые данные как во время выполнения расчётов

Рис.4 Интерфейс во время работы программы так и после их завершения

Рис.5 Отображение результатов

После расчётов также имеет возможность посмотреть математические ожидание конкретного набора карт. Выводятся математическое ожидание действия AllIn и действия Fold, а также их разница. Кроме математического ожидания напротив надписи "Played" выводится вероятность с которой нужно играть текущую карту при смешанной равновесной стратегии. Карты можно выбрать с помощью ввода номера кластера:

Рис.6 Выбор карты по Id

А также с помощью ввода карт в текстовой нотации:

Рис.7 Выбор карты текстовой нотацией

11. Интерпретация полученных результатов

При изучении равновесных стратегий в модели jam-fold для двоих игроков можно заметить тот факт, что стратегии зависят только от соотношения максимально-возможного банка розыгрыша и обязательных ставок (далее эффективный стек). На основе этой особенности можно построить таблицу зависимости процента играемых в равновесии карт и эффективного стека для трёх игр: Texas hold'em, Omaha и Omaha Hi/Lo.

Таблица 4. Стратегии для действия AllIn первого игрока

Размер эффективного стека

Texas hold'em

Omaha

Omaha Hi/Lo

2

89.4

98.8

99.3

4

73.8

85.3

91.2

6

68.3

76.4

83.7

8

61.9

71.6

77.3

10

58.3

67.9

73.2

15

45.7

59.8

68.7

20

40.2

53.6

58.5

Таблица 5. Стратегии для действия Call второго игрока

Размер эффективного стека

Texas hold'em

Omaha

Omaha Hi/Lo

2

100.0

100.0

99.9

4

74.1

98.1

99.1

6

54.4

84.9

93.2

8

45.0

70.4

85.1

10

37.4

59.6

74.1

15

28.5

44.1

49.3

20

21.7

35.3

38.9

Как видно из таблиц для игр типа Omaha равновесные стратегии более "агрессивны" чем для Texas Holdem. Практический во всех ячейках значения процента играемых карт для этих игр выше аналогичных у Texas Holdem более чем на 10 пунктов. Данный эффект можно объяснить тем, что по правилам Omaha сила начальных карт игроков распределена менее дисперсионно чем у Texas Holdem.

Также можно заметить, что стратегии в Omaha Hi/Lo в среднем содержат больший процент играемых карт чем в обычной Omaha. Это можно связать с тем, что из-за дополнительного розыгрыша банка по правилам Lo при вскрытии карт будут часто возникать ситуации деления банка. Т. е. даже при слабых картах вероятность проиграть все фишки будет ниже.

Заключение

В настоящие время популярность игры Omaha растёт. Постепенно появляется всё больше регулярных турниров по этой игре на сайте Pokerstars.net. При этом стратегии для этой игры пока слабо изучены. Ощущается нехватка инструментов для её анализа и изучения. Приложения разработанное в качестве дипломного проекта позволит изучить равновесные jam-fold стратегии в игре для двух человек. Также на основе этого приложения можно проводить исследования не только отдельных раздач, но их последовательности в виде турнира. В частности есть аналогичные исследования для Texas holdem в которых оценивается зависимость вероятности победы в турнире от количество фишек у игроках [14]. На основе рассчитанных в ходе выполнения проекта таблиц можно будет эффективно вычислять математическое ожидание для игры Omaha. Это позволит анализировать стратегии для ситуаций с большим количество игроков. А впоследствии создавать калькуляторы для Omaha по функционалу не уступающие текущим калькулятором для игры в Texas holdem.

Размещено на Allbest.ru


Подобные документы

  • Реализация программы для решения матричных игр. Задание матрицы игры вручную и случайным образом, нахождение оптимальных стратегий игроков итерационным и методом чистых стратегий. Проектирование и листинг программного кода, сохранение матрицы игры.

    контрольная работа [716,7 K], добавлен 11.06.2011

  • Разработка аналога игры "Крестики-нолики", где игроки выбирают размер поля. Правила игры. Интерфейс программы. Главная функция main. Класс XO. Метод вывода поля и хода игроков. Методы поиска крестиков, ноликов. Методы проверки выигрышных ситуаций игроков.

    курсовая работа [281,5 K], добавлен 30.01.2018

  • "Точки" как игра на бумаге в клетку, в которой участвуют от двух и более человек, знакомство с правилами. Рассмотрение особенностей реализации игры "Точки" на любом из объектно-ориентированных языках программирования. Этапы развития Visual Basic.

    курсовая работа [554,5 K], добавлен 15.05.2014

  • Методы вычисления точных вероятностей в покере. Проектирование алгоритма нахождения вероятности выигрыша для нескольких игроков. Теоретический расчет вероятности выигрыша в игре. Программная оптимизация и упрощение алгоритмов вычисления вероятностей.

    курсовая работа [96,1 K], добавлен 17.06.2013

  • Понятие и эволюция игр, анализ их различных жанров и существующих аналогов. Выбор программных средств для реализации игры, написание сюжета и выбор среды разработки игры. Алгоритмы для придания гибкости обучающей игре. Описание программных модулей.

    дипломная работа [2,7 M], добавлен 27.10.2017

  • Разработка эскизного и технического проекта программы игры "Собери картинку". Назначение и область применения, основные технические характеристики. Разработка рабочего проекта, разработка и спецификация программы игры. Описание и тестирование программы.

    курсовая работа [22,6 K], добавлен 10.06.2010

  • Разработка компьютерной игры "Эволюция" с помощью игрового движка Unit. Сравнение критериев игры-аналога и разрабатываемой игры. Разработка графического интерфейса пользователя. Настройки камеры в редакторе Unity. Структура файла сохранения игры.

    дипломная работа [3,6 M], добавлен 11.02.2017

  • Описание алгоритма хода ЭВМ в режиме "пользователь-компьютер" в игре "Морской бой". Описание совокупности классов, их полей и методов. Разработка интерфейса и руководства пользователя по проведению игры. Листинг программы, написанной на языке Java.

    курсовая работа [645,0 K], добавлен 26.03.2014

  • Разработка проекта аппаратной реализации сетевой игры "Пинг Понг", рассчитанной на двух игроков на базе микроконтроллеров AVR АТMEGA 128. Выполнение прошивки микроконтроллера с помощью пользовательского интерфейса среды программирования CodeVisionAVR.

    курсовая работа [1,2 M], добавлен 25.04.2012

  • Методика и основные этапы разработки стратегической игры, ее элементы и принцип работы программы. Порядок построения информационной модели. Диаграмма потоков данных и действий. Выбор языка программирования и его обоснование. Критерии качества среды.

    курсовая работа [3,5 M], добавлен 11.12.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.