Здравствуйте, гость Правила · Помощь

»  Оценка карты играющего при заданном сносе, Определение результата игры для мизера и игры на взятки Подписаться | Сообщить другу | Версия для печати
      » 11/05/2018, 13:21,  Pochemuk 
Кутруповезет (11 мая 2018, 12:46)
То, что здесь описано, это как раз алгоритм бета-отсечения - когда рассматривается ход вистующих. А вот альфа-отсечение - когда рассматривается ход играющего - у вас не описано. Если его действительно в вашей программе нет, то его можно добавить без изменения всей идеологии, и это должно дать не меньшее ускорение.

Ну вот ... Пока я тут соловьем изливался, написал коротко и по существу smile.gif
      » 11/05/2018, 13:59,  Pochemuk 
Фрэд (10 мая 2018, 18:31)
Да, я понимаю, что вот это вот всё немного "через одно место", но эффективность налицо. Например, расклады, которые простым минимаксом (без хеша и отсечений) считались несколько часов, с помощью этой приблуды стали считаться 1 минуту. Расклад, который считался 7 минут, стал считаться 5 секунд. А какую эффективность даёт классическая альфа-бета, примерно такую же или выше?

Насчет скорострельности - это к Николаю. У него все же более продвинутый инструмент.

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

Так вот, несмотря на то, что писался этот прототип лет 10 назад и на Delphi, время обсчета весьма запутанного расклада около 6 секунд.

Север
s Q
c 10
d 10 9 8 7
h K J 10 8
Запад
s A K
c A Q 9
d K Q J
h A 9
Восток
s J 10 7
c K J 8 7
d A
h Q 7
Снос
s 9 8
c -
d -
h -

Скачки. W на первой руке играет 7БК.

Должен сказать, что эта эвристика на таком этюдном раскладе скорее мешает, чем помогает. Да и порядок перебора мастей и карт не самый благоприятный для альфа-бета отсечений. Тем не менее ...

Другие расклады не просите просчитать и засечь. У меня там вообще никакого интерфейса нет. Расклад приходится заменять прямо в исходниках, потом перекомпилировать. А у меня и Delphi сейчас не установлен.
      » 11/05/2018, 16:08,  Фрэд 
Кутруповезет (11 мая 2018, 12:46)
Фрэд (10 мая 2018, 18:31)

Теперь о том, как это работает (пошагово). Мы проверили ход первой картой, рассмотрели все ответы на него и получили, например, 6 взяток. Проверяем ход второй картой и, например, видим, что какой-то ответ вистующих даёт те же 6 взяток. Всё, дальнейшие ответы не рассматриваем.

То, что здесь описано, это как раз алгоритм бета-отсечения - когда рассматривается ход вистующих. А вот альфа-отсечение - когда рассматривается ход играющего - у вас не описано. Если его действительно в вашей программе нет, то его можно добавить без изменения всей идеологии, и это должно дать не меньшее ускорение.

Почему же, всё ровно тоже самое (только наоборот) рассматривается и для противоположной стороны.
      » 11/05/2018, 16:14,  Фрэд 
Pochemuk (11 мая 2018, 13:20)
Фрэд (10 мая 2018, 18:31)
Сразу скажу, что я оперировал в качестве результата полным кол-вом взяток, которые берёт разыгрывающий, а не кол-вом взяток, которые получаются из хвоста розыгрыша. Но это на самом деле не принципиально, потому что в любой момент розыгрыша я знаю, сколько уже взяток он взял, они фиксируются в глобальной переменной.

Можно и так, но это неудобно при кэшировании ...

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

Именно так я и делаю)

Pochemuk (11 мая 2018, 13:20)
Фрэд (10 мая 2018, 18:31)
Кстати, насчёт мультитейбла. Ну я его сделал (дело 10 минут). На массиве раскладов скорость возросла примерно процентов на 7. Но коллизии всё равно есть. Причём их даже больше, но это я связываю с тем, что вместо одной таблицы на 2 млн ячеек я сделал 8 таблиц по 300 000 ячеек (точнее, переменная, описывающая таблицу, осталась одна, я просто ввёл для неё ещё одну размерность). З00 тыщ судя по всему маловато даже для раскладов с одинаковым кол-вом карт.

Это потому что все таблицы одинакового размера. А этого не нужно.

Для 9-карточных концовок с избытком хватит таблицы из нескольких сот ячеек.
Для 2-карточных концовок, вообще, достаточно 2-3 десятков ячеек.
А самые большие таблицы нужны для 5-6-7-карточных концовок, наверное. Там уже счет пойдет на десятки и сотни тысяч. Вот сэкономленный объем и надо им отдать.
Я ещё вчера изменил размеры таблицы, сделал их разными. Коллизии уменьшились, но не намного. Я могу вывести на экран их число для разных таблиц, посмотрю, где их больше всего.
      » 11/05/2018, 16:29,  Фрэд 
Pochemuk (11 мая 2018, 13:59)
У меня же сейчас есть только прототип - реализация альфа-бета перебора без кэширования. Но там применена одна хиленькая эвристика лучшего хода - сначала рассматриваются берущие ходы, а потом отдающие.

Так вот, несмотря на то, что писался этот прототип лет 10 назад и на Delphi, время обсчета весьма запутанного расклада около 6 секунд.

Отключил у себя хеш, проверил этот расклад без него. Да, у меня считается около 30 секунд.. Любопытно, первый ход надо делать в 9 черв, я бы сходу и не сообразил наверное. А почему снос - две карты от длинной?
      » 11/05/2018, 16:48,  Pochemuk 
Фрэд (11 мая 2018, 16:08)
То, что здесь описано, это как раз алгоритм бета-отсечения - когда рассматривается ход вистующих. А вот альфа-отсечение - когда рассматривается ход играющего - у вас не описано. Если его действительно в вашей программе нет, то его можно добавить без изменения всей идеологии, и это должно дать не меньшее ускорение. [/QUOTE]
Почему же, всё ровно тоже самое (только наоборот) рассматривается и для противоположной стороны.

Тут не в том дело, что для противоположной стороны не рассматривается ...

Еще раз попробую ...

Вот у тебя на следующий уровень передается оценка верхней границы (за того игрока, чей ход в ней). Назовем ее БЕТА. Если какой либо ход в получившейся позиции показывает превышение этой БЕТЫ, то можно не рассматривать остальные, тому как мы совсем не пойдем так, чтобы эту позицию сделать!

А вот нижняя границы оценки не передается на следующий уровень. Ты ее каждый раз рассчитываешь заново. Сначала даешь какое-то малое значение, а потом потихоньку уточняешь. И потом, при передаче хода сопернику именно эта оценка нижней границы АЛЬФА передается на следующий уровень как БЕТА.

Получается, что на каждом уровне рекурсии ты эту АЛЬФУ создаешь заново, теряя всю информацию о ранее полученной оценке.

А в альфа-бета отсечении эта оценка сквозная. Она передается из ветви в ветвь дополнительным параметром АЛЬФА, корректируясь в сторону увеличения. Таким образом, уже с самого начала мы имеем все более узкий диапазон оценок границ. И БЕТА в каждой ветви уже с самого начала, с самого первого варианта хода имеет более низкие значения, что увеличивает число отсечений.
      » 11/05/2018, 16:54,  Pochemuk 
Фрэд (11 мая 2018, 16:29)
Pochemuk (11 мая 2018, 13:59)
У меня же сейчас есть только прототип - реализация альфа-бета перебора без кэширования. Но там применена одна хиленькая эвристика лучшего хода - сначала рассматриваются берущие ходы, а потом отдающие.

Так вот, несмотря на то, что писался этот прототип лет 10 назад и на Delphi, время обсчета весьма запутанного расклада около 6 секунд.

Отключил у себя хеш, проверил этот расклад без него. Да, у меня считается около 30 секунд.. Любопытно, первый ход надо делать в 9 черв, я бы сходу и не сообразил наверное. А почему снос - две карты от длинной?

Потому что это этюд smile.gif

Ну заторговался человек smile.gif Хотя, кто его заторговал - не ясно wink.gif

Вот понятно теперь, как альфа-отсечение влияет? Еще в несколько раз сокращает время.

Я бы на твоем месте не занимался сейчас подбором размера кэша, а сделал бы нормальный алгоритм отсечений. Тому как при увеличении числа отсечений средняя глубина перебора резко изменится, уменьшится число обращений к кэшу, уменьшится число коллизий.

Это сообщение отредактировал Pochemuk - 11/05/2018, 16:56
      » 11/05/2018, 16:57,  Фрэд 
Я понял. Попробую ещё раз подумать)
      » 12/05/2018, 01:24,  Pochemuk 
Фрэд (11 мая 2018, 16:57)
Я понял. Попробую ещё раз подумать)

Вот-вот ... подумай.

Тут нужно просто уяснить, что оценка (примерный результат) конкретного хода в конкретной позиции - это понятие локальное. А границы полученных оценок - глобальные. И они проходят сквозняком через всю процедуру перебора, постепенно сужаясь, а не скачут вверх/вниз, как у тебя сейчас.

Нужно перестать мыслить конкретными значениями. Это было свойственно для простого минимаксного перебора. Для перебора с альфа-бета отсечениями нужно мыслить категориями примерных оценок и их взаимодействием с диапазоном границ (и влиянием на него): если оценка попала в такой диапазон, то это потому-то и поступаем так-то.

Тогда и суть альфа-бета отсечений станет ясной и, самое главное, будет понятно, как этот диапазон границ кэшировать. А кэширование - это сокращение перебора, примерно, на два порядка даже для единичного расклада. Для группы похожих раскладов - эффект гораздо выше.
      » 12/05/2018, 02:00,  Фрэд 
Да это я уяснил) Не зря же я сказал о смене всей идеологии. Это надо переделывать рекурсию, чтобы вызывать её с доп.параметрами, а у меня сейчас в ней всего один параметр - номер хода. Я вот прямо сейчас попытался пока что прикрутить к тому, что есть, дополнительные 2 параметра (один для играющего, другой для вистующего), но глобальных. Чтобы они ползли только вверх и в любой момент указывали на тот уровень (который априори выше текущего), с которым надо сравнивать текущий результат. При этом неважно, в какой ветви ты находишься. Заработало оч.быстро, но неправильно) Где-то я перемудрил, буду разбираться. А может, как часто бывает, что-то скопировал и забыл, грубо говоря, поменять 2 на 3 или х на у.
« Предыдущая тема | Перечень тем | Следующая тема »
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей: