|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
Предпросчет возможных ходов в игре Nine Men's Morris (Мельница)23.12.2019, 08:46. Показов 3653. Ответов 33
Метки нет (Все метки)
Идея так себе, но неполный поиск в ширину даже на два хода тоже не сильно доставляет. Да и точность у него хромает. Пока склоняюсь к мысли просчета начальной стадии - выставления фишек. Дальше придется все же писать обход.
0
|
||
| 23.12.2019, 08:46 | |
|
Ответы с готовыми решениями:
33
Программа для вывода возможных ходов коня по клику на клетку шахматной доски Генерация ходов в настольной игре |
|
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
|
|
| 23.12.2019, 08:49 | |
|
А в памяти разве так трудно дерево поиска развернуть?
0
|
|
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
| 23.12.2019, 08:59 [ТС] | ||
|
Если интересно, то на тему решений самой игры есть статья на английском: http://library.msri.org/books/... gasser.pdf
0
|
||
|
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
|
|
| 23.12.2019, 09:07 | |
|
Ну, дык, нужно сначала делать в памяти, а только потом (если не будет вмещаться) можно свопить на диск.
Кстати, операция чтения/записи самая долгая по времени.
0
|
|
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||||||
| 23.12.2019, 09:31 | ||||||||
|
Каждое состояние будет иметь одинаковый размер, а значит можно хранить сразу все состояния в 1 файле и получать нужное тупо по индексу. Ну и для быстроты можно или в заголовке или отдельном файле - хранить дерево индексов. Только file of T не используйте, он устарел. Вместо него надо использовать BlockFileOfT:
Но и делать всё через диск - тоже плохо вообще, потому что работа с диском это таки медленно. Лучше всего использовать промежуточный вариант: хранить данные которые сейчас считаем в оперативке, а когда закончили - сбрасывать на диск. Благо, кишки BlockFileOfT уже это умеют. Всё что прочитано и записано - хранится в оперативке до вызова .Flush . Главное только .Flush вызывать не забывать по своему усмотрению, а то его будет вызывать тогда - когда система решит что вы достаточно прочитали/записали, что может сильно расходится с задачей. Но, над скоростью и достаточным объёмом диска - стоит всё же подумать перед тем как писать код. Вот у вас есть хотя бы 282 свободных ГБ на диске? А если бы вы это решали создавать тучу папок - на одни только заголовке в файловой системе больше потратилось бы (если система вообще разрешит эти заголовки выделить).
1
|
||||||||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
| 23.12.2019, 10:25 [ТС] | ||
|
0
|
||
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||
| 23.12.2019, 11:14 | ||
|
Вообще я не сильно в правилах игры разбирался. А там как - получается после каждого хода (кроме конца игры) есть всегда по 3 варианта следующего хода, или бывает меньше? Если да - можно хранить не сразу все состояния, а увеличивать файл по мере необходимости. При этом в каждом состоянии хранить 3 индекса, каждый из которых ссылается на точку в файле, где описано состояние после этого хода. Ну и если хода нет - хранить -1. Если всегда возможны все 3 хода - памяти так понадобится только больше. Но если нет - можно сильно сэкономить.
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||
| 23.12.2019, 23:32 [ТС] | ||
|
Из интересного: нашел в интернете базу данных для игры с компьютером. 78 гб весит. И это если учесть, что неликвидные ходы для компьютера-оппонента оттуда, очевидно, вырезаны. Перспектива пока удручает. Еще придется бороться с зацикливанием алгоритма, когда фишку двигают туда-сюда до бесконечности. Задачка... Добавлено через 36 минут Думаю отказаться от полного перебора и немного схалтурить: 1) Если есть возможность в свой ход собрать мельницу - собираем, при этом рассматриваем далее случай не для всех, а для конкретной одной съеденной фишки противника, которую определяем каким-либо не особо трудным алгоритмом (смотрим, могут ли белые следующим ходом собрать мельницу, и мешаем им; можем убрать белую фишку и построить новую мельницу - убираем; могут заблокировать нашу отстроенную мельницу - мешаем им: имеется у них скопление фишек на поле - опять же мешаем) 2) Проверка явных угроз постройки мельниц белыми в один ход. Нашли такую - пытаемся устранить за один ход. Без других вариантов 3) А лучшее на конец: если через n ходов мы никого не съели или нас поели больше, чем мы их - рубим ветку Должно сильно облегчить жизнь
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||
| 24.12.2019, 10:13 [ТС] | ||||
Для нормальной доски как верхний предел существует около 3^24 (282 млрд) состояний (24 клетки, каждая может быть пуста или занята командой). Я, увы, не в состоянии справиться с составлением хорошей хеш-функции. Из идей: разбить на 5 байт, где каждый байт кодирует 5 клеток доски, то есть мы получаем 5 байт на всю доску. Это пока минимум. Дальше можно уменьшать количество вариантов, но вроде не критично. Получим что-то около (5 байт * 9 млрд состояний) или 45 Гб, по скромным прикидкам. Паршивый результат, но на диске поместится. Неликвидные ходы можно будет и позже отсортировать. Из неудобств пока работа с типизированным файлом, откуда придется брать вместо готовых состояний пятерки и связывать между собой.
0
|
||||
|
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
|||
| 24.12.2019, 11:11 | |||
|
Ksardas_178, попросите администрацию, всё, начиная с поста #4 выделить в отдельную тему с названием
Игра Nine Men's Morris (Мельница) А где-нибудь в эту игру можно с компьютером поиграть?
0
|
|||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
||||
| 24.12.2019, 11:59 [ТС] | ||||
|
mr-Crocodile,
Онлайн-реализаций много есть, если поискать.
0
|
||||
|
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
|||
| 24.12.2019, 13:46 | |||
|
Ksardas_178, а какая цель вообще? Сделать ИИ играющий в эту игру с человеком? так для этого не нужно все возможные варианты хранить. или что делаешь и для чего? я ZX Spectrum-128 написал в личку, попросил. Если он посчитает нужным - выделит сообщения в отдельную тему.
0
|
|||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|||
| 24.12.2019, 13:53 [ТС] | |||
|
mr-Crocodile,
0
|
|||
|
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
||
| 24.12.2019, 14:04 | ||
![]() Зачем хранить варианты возможных ходов для человека? Просто проверяй, может человек сделать такой ход или нет. всё. никаких баз данных и баз знаний для этого не нужно.
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 24.12.2019, 14:18 [ТС] | |
|
mr-Crocodile, я о том, что бот должен знать выход из позиции, которую создаёт человек. Соответственно для хода человека дерево развития игры имеет максимальное ветвление. Фактически после фильтрации полного дерева игры (буде кому-то придет в голову его записывать) мы выбираем единственно верный ход для ИИ и получаем базу знаний и алгоритм работы: человек сделал то-то - мы делаем конкретно вот это, а не выбираем из сотен вариантов, и наше решение при этом с наибольшей вероятностью ведёт к победе.
0
|
|
|
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
||
| 24.12.2019, 14:20 | ||
|
0
|
||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 24.12.2019, 14:24 [ТС] | |
|
mr-Crocodile, неполный поиск в ширину? Можно, но далеко не так эффективно. Придется задуматься над оценкой позиции. Каковы будут критерии?
Опять же, если существуют реализации, основанные на предпросчете, наверное, они не так уж плохи?
0
|
|
|
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
|
|||
| 24.12.2019, 14:38 | |||
|
Ksardas_178, мы уже говорим про эффективность?
Тогда я снимаю своё предложение. Безусловно, полная база знаний по всем возможным вариантам намного эффективнее, чем любая эвристика и оценочная функция. Я, конечно, сомневаюсь, что ты сам сможешь составить такую базу, но, если есть готовая и ты сможешь ей воспользоваться, то - ВПЕРЁД! не знаю. Думаю, что нужно просчитывать варианты на пару-тройку ходов вперёд, для каждого получать оценку поля и выбирать тот ход, который ведёт к максимальной оценке. Как оценивать поле, спросишь ты.Ну, например, наивысшая оценка - у противника нет хода, следующая высокая оценка - получить три своих в ряд. следующая оценка, чуть ниже, заблокировать две шашки противника, ещё ниже - поставить две свои в ряд и т.д. я ни разу не играл в эту игру, не знаю её правил, что я буду давать советы по оценке?! Не по теме: анекдот.
1
|
|||
|
58 / 42 / 21
Регистрация: 01.01.2018
Сообщений: 273
|
|
| 24.12.2019, 16:00 [ТС] | |
|
mr-Crocodile, не зря же говорят, что белые начинают и выигрывают) За идеи по оценке спасибо. Сам не игрок
Добавлено через 7 минут К слову об очень хороших вариантах: вообще говоря, если игра не гарантирует победу даже при идеальной стратегии (наш случай), то оценка качества ходов в виде отношения получившихся путей к победе ко всем возможным путям из новой ветки тоже несколько хромает. Надо брать за основу что-то другое. Скажем, неочевидность выбора для оппонента. И если играть против человека, то выбирать те варианты, которые ему труднее будет просчитать и при этом одновременно легче выбрать ошибочное направление. Но это так, мысли вслух
0
|
|
|
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
|
||||
| 26.12.2019, 07:38 | ||||
|
Хеш функций режет информацию на кусочки и берёт только 1 из этих кусочков. Вся остальная информация теряется и восстановить её уже и теоретически невозможно. Хеш функция это не то же самое что архиватор. .GetHashCode обычно используется в чтоб разложить информацию по полочкам. Пример из реальности: в библиотеке все книги отсортировали по алфавиту. Имея букву, означающую раздел (то есть первую букву названия всех книг в нём) - нельзя получить всю книгу потому что 1. от всей книги - есть только 1 буква из названия и 2. таких книг может (и скорее всего будет) много. Зато, если вы знаете что название нужной вам книги начинается с определённой буквы - вам надо искать не по всей библиотеке, а только в 1 разделе. Хеш-таблицы не экономят память. Они только помогают быстрее находить нужную информацию. А памяти и производительности для их обслуживания - надо больше (но в случае хеш-таблиц - производительность как раз компенсируется скоростью поиска информации). --- Про что говорил я: Весь смысл типизированных файлов в том, что абсолютно все элементы имеют одинаковый размер. К примеру если размер элемента =L, а номер элемента, который вы ищите =N - можно точно сказать что нужный вам элемент находится в файле начиная с байта № N*L. Что я имел в виду - использовать что то типа связного списка. Только обычно элемент связного списка хранит свои данные и адрес следующего элемента в оперативной памяти. А в вашем случае - каждый элемент (то есть состояние) будет хранить свои данные + адрес следующих состояний в файле (то есть не адрес, а номер элемента, который выше я назвал N). --- Но, что можно - дать низкий приоритет проигрышной ветке. То есть просчитывать её ближе к концу. Но как я и сказал - хеш таблицы тут вообще ни к месту.
0
|
||||
| 26.12.2019, 07:38 | |
|
Помогаю со студенческими работами здесь
20
Как сделать систему ходов в карточной игре? Алгоритм для просчета допустимых ходов в игре нарды. Найти объем информации после 11 сделанных ходов в игре
Алгоритм получения всех вариантов ходов бота в карточной игре 101 Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|