|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
Минимаксная процедура с alpha и beta отсечениями18.05.2014, 14:38. Показов 7703. Ответов 20
Метки нет (Все метки)
Необходимо построить программу, которая бы реализовывала минимаксную процедуру.
Дан простой граф: На нем нужно реализовать минимаксную процедуру. Для начала хочу сделать это на бумаге, ибо быдлокодить, без понимания алгоритма смысла нет совсем. Для чего нужна минимаксная процедура? Я полагаю, она нужна для того, чтобы ускорить поиск по дереву решений (в данном случае мой граф не огромный, но это просто пример, на самом деле это может быть игра в шахматы, где количество комбинаций не умещается в памяти компьютера). Это так? Когда применять минимаксную процедуру? Одногруппник пытается впарить, что нужно сначала пройти по всему дереву решений (обычный минимакс), а потом отсекать, да еще и как-то сверху вниз. Даже слушать не стал, ибо показалось бредом. Ведь мы же юзаем минимакс с отсечениями для ускорения поиска решения, отсекая заведомо неоптимальные варианты. Рассудите, пожалуйста. P.S.: а AI тут нет?
0
|
|
| 18.05.2014, 14:38 | |
|
Ответы с готовыми решениями:
20
подгруппа порожденная перестановками alpha и beta Возможно ли будет обновиться с Consumer Preview до Alpha, Beta, RC и Final? Посчитать количество строк где не совпадает значение столбца alpha и beta |
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 19.05.2014, 10:44 | ||
|
Минимакс - это стратегия поиска ходов с минимальными потерями. "Голый" минимакс не ускоряет поиск решений. А вот альфа-бэта отсечение - да, так как не нужно генерировать полное дерево решений.
Вики: компьютерные шахматы
0
|
||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||
| 19.05.2014, 18:30 [ТС] | |||||
|
Я имел в виду то, что Artfical Intellegence тут нет подфорума? Это как раз туда скорее. А Минимакс с отсечениями это процедура, которая подразумевает то, что мы работает с чистым графом, то есть не надо решать сначала голым минимаксом, а потом с отсечениями по прорешенному. Правильно? Вот это хочу понять очень очень. Мы же решаем эту задачу снизу вверх? И минимакс просто, и минимакс с отсечениями. Так ведь? Мне кажется вот очень хороший пример: (который нифига не работает тут, на киберфоруме — гифка. Просмотреть можно нажатием на него и просмотром в оригинальном размере). Как раз здесь (нижние цифры не видно), сначала выбирается что-то из нижних цифр, которые мы не видим. При этом заполняется альфа — максимальное число из выбранных. Как только потомки у вершины кончились, то присваиваем вершине, потомков которой мы рассматривали, получившееся альфа, бета делаем равной альфа, бета сбрасываем. Проходим по второй ветви, пишем в альфа текущее из правой ветви. Если вдруг альфа стала больше бета, то отсекаем остальные вершины (считай просто перестаем рассматривать потомков вершины (правый кружочек)), делаем бета = альфа, альфа обнуляем и т.д. Если бы альфа не стало бы больше бета, то мы бы все таки просмотрели всех потомков правого кружочка, определились бы с финальным альфа. Далее видимо, выбирали мы минимальное, ибо в итоге 7 записали в верхний ромб. И т.д. Что это в итоге есть? Это часом не обычный обход дерева? Как-то нет, кажется... Хотя... Вот бывают такие варианты обхода деревьев (с алголиста): В прямом порядке Симметричный В обратном порядке В ширину У обхода в обратном порядке есть такое примечание:
Или же есть примечание для Симметричного обхода:
0
|
|||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||||||
| 19.05.2014, 19:48 | ||||||
Сообщение было отмечено VladSharikov как решение
Решение
Моя ошибка, альфа-бэта не позволяет выбросить ветку дерева не проходя её полностью, так что в этом виде тут нет оптимизации.
На вики дается вот такой алгоритм
http://ru.wikipedia.org/wiki/%... 1%82%D1%8B Для игр с небольшим разнообразием ходов можно попробовать построить дерево для всех возможных ходов. Для сложных игр типа шахмат скорее всего следует генерировать дерево определенной глубины и на последующих ходах достраивать дерево, освобождая память от просчитанных ходов куда не пошли, и (наверное, вот она - оптимизация?) ветки отсеченные на альфа-бэта
1
|
||||||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 20.05.2014, 02:17 [ТС] | |
|
wingblack, чем инициализируется функция alphabeta?
Добавлено через 5 часов 28 минут wingblack, да, пасибо, что мордой тыкнули в вики, как-то я не додумался (я про английскую). Искал искал. Часа три искал. Потом еще часа 2. Потом плюнул, переписал псевдокод на вики в JS — сейчас наслаждаюсь рабочей прогой. ![]() Profit. На бумаге прорешал минимаксом — сошлось, минимаксом с отсечениями — тоже самое, все сошлось. ПК, мои руки и мои руки с отсечениями считают одинаково ![]() Спасибо за ссылочку. Осталось прикрутить интерфейс. Код даже выкладывать не буду — все есть в вики.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 20.05.2014, 20:54 | ||
|
На ютубе видел что для инициализации альфа-бэта используется плюс и минус бесконечность.
0
|
||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||||||||
| 22.05.2014, 00:00 [ТС] | |||||||||||||
|
У меня следующий вопрос. Все не как у людей Мне нужно сделать визуализацию результата работы алгоритма. Мне надо нарисовать граф и показать, какие вершины отсекаются и т.д.Вот есть код:
Мне нужно заполнить все вершины (или не заполнить, в случае, если ветвь отсеклась) и показать отсечения. Вопрос не в том, как это сделать на JS, вопрос в том, как перенести результат работы алгоритма на граф, то есть когда что выводить и куда. Я полагаю, в этом помогут alpha и beta. Можете это прояснить, пожалуйста?
0
|
|||||||||||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 24.05.2014, 14:27 | |
|
думаю, что в местах где break метить узел и все поддерево для отсечения
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 25.05.2014, 18:45 [ТС] | |
|
wingblack, допустим, спасибо.
А в узлы что писать и где? Там же где break? alpha и beta выводить нужно? Или как? Я не очень этот момент понимаю что-то
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
||
| 25.05.2014, 19:52 | ||
|
если тебе нужна по альфа-бэта - то выводи когда встречаешь место в коде где проводится отсечение то просто пометить узел, как угодно, просто зависти тип узлов с дополнительным полем для метки. помеченные узлы выделять цветом или еще как
0
|
||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||||||
| 25.05.2014, 20:27 [ТС] | |||||||||||
|
Попробовал сделать то, что Вы сказали. Вот результат:
Не получилось :'( Вывод в условиях перед break:
0
|
|||||||||||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 26.05.2014, 12:16 | |
|
Выведи значения альфа-бэта на всех узлах
Пометь узлы где происходит отсечение более явно - смена цвета или формы. Также дай логи работы алгоритма.
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 29.05.2014, 11:25 [ТС] | |
|
Вот результат работы алгоритма:
Этого я достиг при этом коде. Ссылка на гитхаб, желтым выделена добавленная строчка. Другой вопрос как сделать вывод нужных значений в нужные узлы дерева. Я попытался вывести alpha и beta перед return alpha и return beta соответственно, но это привело к плохому результату К неправильному. Что в общем-то не удивительно, потому что никаких сбросов alpha и beta нет, следовательно если в самой левой ветви дерева самое маленькое из возможных alpha, то оно будет тянуться по всем ветвям и запишется туда. В общем что говорить, лучше 1 раз показать. Вот результат такого вывода:Вот проблемные места, по которым видно, что что-то тут не так: Почему у первой стрелочки минимальное из 7 и 6 вдруг стало 5? У второй стрелки: как вдруг из 4, 3 и 2 выбралось 5 как максимальное. Что-то тут не так... ![]() Да и вообще страшно предполагать теперь насколько каждая из вершин отображена правильно. Это результат работы такого кода. Ссылка все туда же, желтым выделено новое по отношению к предыдущему сниппету. P.S.: ссылка показывает только одну строку, забыл, что тут нельзя выделить сразу две строчки. Вторая строка в конце такого же блока во втором блоке. Что касаемо логов, то их нет. Что именно выводить нужно, чтобы получить логи работы алгоритма и где? Я выведу. Вообще по работе алгоритма моего... Зеленый цвет показывает, что идет-то он похоже правильно и обходит все так, как надо и отсекает правильно, так ведь? Но проблема с выводом значений в неконцевые узлы. Как уже писалось выше, скорее всего где-то нужно сбрасывать значения Alpha и Beta или же, скорее всего, добавить какое-то доп. значение и сбрасывать его, чтобы не ломать сам алгоритм.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|||
| 29.05.2014, 13:20 | |||
|
Да, на рисунке есть ноды без цифр, так же быть не должно? console.log('beta '+beta+' alpha '+alpha); А это куда пишет ? На крайний случай - запись в переменную, которую потом вывести в код страницы.
0
|
|||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||
| 29.05.2014, 13:40 [ТС] | ||
Пишу с телефона, не очень удобно цитировать. По поводу узлов без цифр - дак они отсечены, поэтому и без цифр и без цвета. А по поводу логов - вечером буду дома, попробую что-то сделать, но разобраться будет нереально, ибо ресурсия. Я уже пытался. Попробую, как дома буду.
0
|
||
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 29.05.2014, 19:17 | |
|
На графе выводить в числа в каждую ноду, а то в последнем рисунке цифры были не везде
Добавить в рекурсию инкрементацию глобальной переменной, которую и выводить вместе с остальной информацией для дебага ?
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
||||||||
| 29.05.2014, 21:10 [ТС] | ||||||||
До места, где начинают выводится неверные значения. Вот результат: P.S.: Красным и синим отмечены узлы, которые считают минимальное из своих детей и максимальное из своих детей: maximizing - синий, minimizing - красный. Вот лог достижения этого результата: P.S.: В логе фигурируют названия узлов — min1, max23, min223 и т.д. На самом деле все просто... Но вот еще картинка, чтобы понять это было легче: P.P.S: В логе встретится ****** — с этого момента начинают неправильно выводится значения, значение конечного узла 7, а бета остается 5, значение 6, а бета остается 5. Что в общем-то неудивительно и я, кажется, уже предполагал в чем проблема — alpha и beta тянутся с самой левой ветви и до конца. Надо что-то придумывать для того, чтобы выводились правильные значения в узлы. В этом и вопрос — что?
0
|
||||||||
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|
| 29.05.2014, 21:56 [ТС] | |
|
Немного обновил код, попытался добавить переменную, которая, как я думал, помогла бы мне.
Код тут. А вот результат: Вот, что стало отображаться правильно: Но уровнем выше те же проблемы: Что-то делаю не так.
0
|
|
|
294 / 265 / 48
Регистрация: 09.04.2013
Сообщений: 1,038
|
|
| 29.05.2014, 23:43 | |
|
Eсли в логах в начале строки каждого вывода писать название текущей ноды, то будет более удобно понимать где сейчас алгоритм находится
Снова в графе ноды без цифр - отсеченные ? У меня в голове пунктик что в альфа-бэта мы все равно должны пройти по всем нодам, разве нет ?
0
|
|
|
25 / 25 / 7
Регистрация: 02.12.2010
Сообщений: 824
|
|||||||
| 30.05.2014, 00:51 [ТС] | |||||||
|
Давайте рассуждать вместе: Зачем нужен minimax? Минимаксная процедура? Я не про какое-то сложное определение и проекцию на шахматы или крестики-нолики или крестики-нолики-пять-в-ряд, а про пример выше. Вот есть данный граф (понятно, что это пример, но все же). Минимакс мы применяем для того, чтобы найти корень — значение узла на самом верхнем уровне. А зачем нужен AlphaBeta (оптимизация минимакса)? Затем, чтобы найти корень. Минимакс займет, к примеру, 10 минут — просто, например. А альфабета — 3 минуты. Это хорошо. Вместо 3 тратим 10. Вы предлагаете выполнить минимаксную процедуру, а затем выполнить ее оптимизацию и потратить 10+3 минуты = 13 минут. Какая тут оптимизация? Я вот это себе твержу и стою на своем. Разве неправильно думаю? Вот Вы же сами приводили пример с шахматами. Полного дерева решений мы не получим никогда — не хватит памяти, ибо комбинаций нереально много, поэтому там мы применяем не минимакс, а альфабета. Согласитесь, там же не надо каждый узел раскрывать (да и не сможем)? А чем мой пример отличается? Тоже самое, но кол-во узло и глубина не миллионы и десятки тысяч, а ~50 и 4. Или я неправильно думаю? Вот логи с текущей вершиной (к сожалению через строку, очень знаете ли неудобно убирать каждый пробел. Или регулярку на возврат на предыдущую строку подскажете? ):
0
|
|||||||
| 30.05.2014, 00:51 | |
|
Помогаю со студенческими работами здесь
20
Продам плату Stream Alpha Plus + Alpha Pro 2.0 + Tele 2.2 б/у В чем разница между Visual Studio .NET Beta 2 и .NET Framework SDK Beta 2? Максиминная, минимаксная мультимаксипликативная композиции Как написать программу "минимаксная задача динамического программирования"? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
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 .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|