|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
Хеширование состояния поля в игре Nine Men's Morris (мельница)26.12.2019, 10:20. Показов 2237. Ответов 12
Метки нет (Все метки)
Не уверен, что в тот раздел. Подскажите, если что
Итак, есть поле для игры на 24 ячейки, есть 2 игрока с девятью фишками на руках. Фаза 1: каждый игрок поочередно выставляет на свободную ячейку фишки Фаза 2: игроки перемещают фишки по линиям на поле Фаза 3: игрок с 3 оставшимися фишками получает возможность переставлять свою фишку на любое свободное поле Если игрок собрал мельницу (3 фишки в ряд), то он забирает любую фишку соперника. Дальше уточнять правила не буду, только приведу ссылку на англоязычную статью: http://library.msri.org/books/... gasser.pdf Там описываются идеи, заложенные в основу вычисления хеш-функции, и приводятся правила игры. Теперь о задаче: необходимо закодировать любое возможное в ходе игры состояние поля наименьшим количеством бит (короче, оценочная функция должна описывать любое состояние и при этом возвращать числовое значение в разумных пределах) Немного моих выкладок (в терминах памяти): итак, если 24 клетки могут иметь три состояния (свободна либо занята игроком), то грубая оценка сверху дает 3^24 состояний доски. Допустим, состояние 5 клеток мы поместим в один байт (241 из 256 значений, почти полностью займем место), тогда на всю доску у нас уйдет 5 байт. При количестве состояний 3^24 (282 млрд) мы можем хранить их, используя всего лишь 282*5 Гб дискового пространства. На руках сейчас имеется 700 гб, и очень не хотелось бы использовать их все. Вот так как-то. Из бонусов: это все нужно для предпросчета игры для примитивненького ИИ, и для упрощения можно предположить, что у соперника нет шансов построить мельницу и отнять у нас фишку
0
|
|
| 26.12.2019, 10:20 | |
|
Ответы с готовыми решениями:
12
Предпросчет возможных ходов в игре Nine Men's Morris (Мельница) Определение состояния соседей в игре в жизнь
|
|
Модератор
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
||
| 26.12.2019, 15:54 | ||
|
Состояние, кроме расположения фишек должно включать фазу и чей ход. Можно отдельно хранить (и кодировать) состояния для фазы 1 и состояния для фаз 2/3. Добавлено через 21 минуту Заглянул в статью. Там всё это написано. И даже приводится алгоритм для вычисления цены всех состояний. В чём вопрос?
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 26.12.2019, 17:35 [ТС] | |
|
Shamil1, возможно, я чего-то не разглядел, но в статье описаны идеи, примененные для сокращения количества состояний. Да, на их основе можно перебрать все состояния, выкинуть лишние и получить около 8 млрд в сухом остатке, но вопрос в том, как построить алгоритм перевода состояния поля в число.
Добавлено через 2 минуты И да, надеюсь, вариант вроде "перебирать что есть, выкидывая лишнее, и пересчитывать новый индекс для реально существующих состояний" мы не рассматриваем. Неприемлемо по времени.
0
|
|
|
Модератор
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|
| 27.12.2019, 00:50 | |
|
В статье описан алгоритм, который работает на десктопе 1990-го года. Полагаю, проблем по времени быть не должно.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 27.12.2019, 18:55 | ||
|
А ты действительно хочешь делать ИИ в виде гигабайт данных вида (состояние -> ход) ?
Почему бы не реализовать что-то наподобие шахматного ИИ? Например, для каждого хода - дерево возможных будущих событий с отсеченем плохих веток. А перевести число из одной системы счисления в другое - не должно составить проблем. Там получается 39 бит. Записываем ответ в буфер uint64 и выдергиваем из него эти 5 байт информации, и также в обратную сторону.
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|||
| 28.12.2019, 11:43 [ТС] | |||
|
На вопрос о том, как закодировать поле не функцией с 2^34 состояниями мне, видимо, никто ответить не сможет.
0
|
|||
|
Модератор
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|
| 29.12.2019, 00:17 | |
|
Нужно хранить оценки для фаз 2/3 и считать минимаксом фазу 1.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|||
| 29.12.2019, 02:44 | |||
|
Да, оно будет занимать 8 байт памяти, но значимыми тут являются только крайние 5 (остальное всегда нули), вот их и хранить. Ты во время своей рекурсии как хранишь состояние доски - как 24 байта, или кратковременно развертываешь в 24 байта, а перед стартом новой вложенной рекурсии сворачиваешь ее до 5 байт, предварительно освободив память? А ты учел момент что тебе не нужно сворачивать все ветки, а только после хода противника откидывать "не сработавшие" и расширять ту которая соответствует новому ходу? Еще можно состояние доски обрабатывать в виде 48 бит, по 2 бита на ячейку, где единица это флаг где какого цвета камень сидит. А для хранения все также в 5 байт сворачивать. С точки зрения стратегии все такие "картинки" будут абсолютно одинаковыми состояниями.
0
|
|||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 29.12.2019, 12:23 | |
|
*4 оси симметрии.
А в что у тебя упирается рекурсия, в объем памяти или по времени перебора всех вариантов?
0
|
|
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||
| 29.12.2019, 21:45 [ТС] | ||||
|
Добавлено через 6 минут
0
|
||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|||
| 30.12.2019, 11:37 | |||
|
Нужно определить функцию которая по текущему состоянию доски подскажет какие нужно произвести операции над доской чтобы из любого из равносильных состояний доски получить только одно предпочитаемое равносильное состояние, от которого и начинать строить дерево вариантов. Например, тебе нравится чтобы белые фишки были поближе к часовой стрелке на 1 час. Нужно посмотреть какая последовательность операций позволит перебирать все равносильные состояния доски без повторений. Например, можно повернуть доску на 90 градусов 0,1,2,3 раза, потом 0,1 раз отзеркалить по вертикали, потом повернуть 0,1,2,3 раза, потом отзеркалить 0,1 раз по главной диагонали, потом повернуть 0,1,2,3 раз Я не сильно в этом шарю, но предположу что это сокращает размер функции до (4 + 4*4 + 4*4*4) раз (впрочем, здесь будет много состояний которые имеют симметрию - они не будут давать такого большого сокращения функции) Как сказали тут уже - надо как-то учесть специфику игры чтобы сократить хранимые варианты. А я еще скажу что для идеального ИИ заведомо проигрышные ветки хранить будет не нужно, хотя сначала потребуется определить их. Предположу, что даже если делать поиск в ширину, сохраняя на диск каждую итерацию углубления и потом проходя по ней в новой итерации, то итоговое количество вариантов получится все же поменьше. P.S. Если делать не рекурсивно, а строить наподобие K-D дерева, то многие ветки будут переплетаться, экономя немного времени. Кстати говоря, дерево... В программировании же извечный выбор между памятью и производительностью, очевидно что у тебя выбор в сторону уменьшения памяти, почему бы тогда не хранить доску по принципу дерева, но хранить не состояния, а только ходы обоих игроков? Тогда на одно состояние нужно только 5 бит. Добавлено через 54 минуты а если их еще не округлять до байта, а хранить пакетами по 8 штук - еще немного места сэкономим
0
|
|||
|
Модератор
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|
| 30.12.2019, 12:04 | |
|
ИМХО
Нужно взять фиксированное распределение - например, 3 белых и 3 чёрных фишки - и построить для него все варианты. Затем уменьшить в 16? раз (4 поворота и 2 оси симметрии). После чего, попробовать построить хеш-функцию для данного распределения.
0
|
|
|
Модератор
3133 / 2280 / 469
Регистрация: 26.03.2015
Сообщений: 8,874
|
|||||||
| 31.12.2019, 13:28 | |||||||
Сообщение было отмечено Ksardas_178 как решение
РешениеПреобразования можно описать массивами замен:
Фактически, предыдущем абзаце описан алгоритм кэшфункции. Проблема в том, что для поиска элемента с индексом эн нужно перебрать все предшествующие (напоминает поиск в линейном списке). Для ускорения используем кэш - массив перестановок с их индексами. Методом деления пополам находим максимальную перестановку меньше/равно искомой и её индекс. Дальше запускаем алгоритм из предыдущего абзаца, но не с самого начала, а с найденного значения. Например, можно "закэшировать" каждую 10,000-ую перестановку (нужно найти баланс между скоростью вычисления нужного индекса и памятью под кэш).
1
|
|||||||
| 31.12.2019, 13:28 | |
|
Помогаю со студенческими работами здесь
13
Активность текстового поля, зависящая от состояния переключателя Создать строку состояния, содержащую три информационных поля
База данных и плагин morris.js Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Налог на собак: https:/ / **********/ gallery/ V06K53e
Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf
Пост отсюда. . .
|
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop?
Ниже её машинный перевод.
После долгих разбирательств я наконец-то вернула себе. . .
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|