Здравствуйте, гость | Правила · Помощь |
» Оценка карты играющего при заданном сносе, Определение результата игры для мизера и игры на взятки |
|
Очень интересная и познавательная дискуссия, всем спасибо) Ситуация у меня в проге такая, что мне удалось, по-видимому, удачно организовать транспонирование и хэширование, в отличие от альфа-бета-перебора. Потому что, когда я его отключаю, время просчёта почти не увеличивается. А если отключить хэширование, то упомянутая здесь задача Галактионова считается часа 3 примерно. С хэшированием (у меня на компе), но без отсечений - 2 секунды. Помимо этого, правда, у меня организованы следующие правила отсечения заведомо неоптимальных ходов:
1. Из карт, идущих подряд (типа трельяжа и т.п. с учётом выхоженных) рассматриваем только ход одной из них. 2. Каждые 3 хода (после получения кем-то взятки) проверяем расклад на предмет "остальные все мои" для разыгрывающего. Немного, но ускоряет перебор. 3. Если масть одного вистующего бьётся козырем второго, он ходит с младшей карты этой масти (остальные карты этой масти не рассматриваются). 4. То же самое касается разыгрывающего. Но для него также прописывается правило ходить младшей картой масти (а остальные карты этой масти не рассматривать), если любая карта этой масти заведомо бьётся кем-то из вистующих (ну например у кого-то из них синглетный туз или Т-К в этой масти). Плюс к этому, если разыгрывающему вышли в козырь (а оба вистующих дают в масть), он бьёт младшим из наличествующих козырей. Пункты 3 и 4 не касаются мизеров, конечно. Эти правила заметно ускоряют перебор. Примерно раза в 3. Таких правил можно напридумывать много. Но это увеличивает объём кода, а, кроме того, можно понаделать ошибок, заблокировав правильные ходы. Покамест я хочу разобраться с альфа-бета-перебором. Идея-то его проста как дважды два четыре, но с применением его к расчёту раскладов возникли некоторые трудности. Ведь мы не можем оценить конкретный ход, пока не разыграем после него всё до конца. Единственное, что можем сделать - это проверить, доберём ли мы за оставшиеся после него ходы взяток больше, чем при более ранних вариантах. Ну, например. Выход с первой карты разыгрывающего дал ему 8 взяток. Проверяем выход со второй карты. И вдруг видим, что после первых двух кругов ходов взяток у него 0. Осталось 8 кругов ходов, т.е. больше 8 взяток он уже не возьмёт. Следовательно, отсекаем вариант выхода с этой карты. Всё это касается, конечно, и промежуточных вариантов розыгрыша. Вот это я и попытался реализовать. Но в результате скорость обсчёта раскладов выросла только в 2 раза примерно. Что мало. Пока у меня всё) |
|
||||
Чего ты "помешался" на этом переборе? Я тебе про то и толкую, что не перебором надо заниматься, а алгоритмизацией собственно преферанса как игры. "В преферанс поиграть не пробовали?.." ) Мне лично и в голову не пришло бы увязывать то, что ты сказал. Потому что в преферансе так делают разве что в турнирной игре, где надо "мочить" конкретного соперника. Но это мелкий нюанс напоследок - если остальное уже готово. И что? Из этого и надо исходить как из начального условия: "иногда ему может быть пофиг куда ходить". Что в этом удивительного или особенного? Для всех наших ходов всегда можно получить точный окончательный результат, читай, оптимальное решение. Правда, в соответствии с исходными данными, которые автор алгоритма соизволил принимать во внимание, в соответствии с заданным критерием оптимальности и достигнутой точностью работы созданного алгоритма. |
||||
|
||
Я бы не назвал это отсечениями. Чтобы не возникало терминологической путаницы. В терминах альфа-бета перебора отсечением называется прекращение уточнения результата хода, если предварительная оценка оказалась хуже, чем результат другого хода. Зачем делать ход, который заведомо хуже другого? А раз он не будет сделан, то и его точный результат нас не интересует. А то, что ты перечислил, можно назвать как-то по другому, но только не отсечениями. П. 1 даже называть как-то не надо. И так понятно, что это надо применять. П. 2 мы не реализовывали. Но вряд ли в нем много пользы при кэшировании. Ситуации, когда "все мои" быстро заносятся в кэш и по второму разу не обсчитываются. П. 3, 4 это и есть эвристики лучшего хода. Только их не надо мешать в кучу с прочими улучшениями, а выделить отдельно. Что касается максимально возможного числа взяток исходя из оставшихся карт, то это можно учесть корректировкой диапазона альфа-бета. И у нас и у Словеснова именно так и сделано. |
||
|
||
Я ни на чем не помешался. Просто в этой теме обсуждают программы, которые работают на принципе минимаксного перебора. |
||
» 18/03/2018, 22:52, Кутруповезет
|
||
Вот еще по графическому интерфейсу: - Если нажать кнопку "Разыграть до конца", то после розыгрыша невозможно нажать ни на "Новый расклад", ни на "Изменить расклад", приходится возвращаться к 1 ходу. Это сообщение отредактировал Кутруповезет - 18/03/2018, 23:05 |
||
|
Букву уже удалил, сам заметил)
Да, согласен, что надо сделать возможным переход к новому раскладу с любого момента розыгрыша текущего. Это делов на 5 минут в общем) |
» 19/03/2018, 12:10, american_boy
|
||||
Честно говоря, не понимаю, почему программисты ставят палки в колёса. Не преферансисты должны подстраиваться под существующие методы перебора, а программисты, выслушав суть проблемы, сначала попытаться понять о чем говорят опытные преферансисты, потом взять какое-то время подумать, возможно, посоветоваться. И начать действовать как им говорят. Другого пути нет. А тут сразу в одну минуту слышишь: нельзя, невозможно, нереально. Кто как не опытные преферансисты подскажут логику принятия решений? |
||||
» 19/03/2018, 15:02, Невозмутимый
|
да программисты походу видимо никогда в преферанс не играли, только пихают несчастным преферансистам свои методы
слава богу что нашлись готовые помочь ценным советом |
3 Пользователей читают эту тему (3 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
0 Пользователей: