Немного фона: как способ узнать многоуровневые деревья на С++, я решил создать все возможные платы TicTacToe и сохранить их в дереве, так что ветка, начинающаяся с node, является всеми платами, которые могут следовать из этого node, а дочерние элементы node - это платы, которые следуют за одним шагом. После этого я подумал, что было бы интересно написать AI, чтобы играть в TicTacToe, используя это дерево в качестве дерева решений.
TTT - разрешимая проблема, в которой идеальный игрок никогда не проиграет, поэтому казалось, что простой AI должен кодировать мой первый опыт AI.
Теперь, когда я впервые реализовал AI, я вернулся и добавил два поля для каждого node при генерации: количество раз, которое X будет выигрывать, а количество раз O будет выигрывать у всех детей ниже node. Я решил, что лучшим решением было просто заставить мой ИИ на каждом ходу выбрать и спуститься по поддереву, где он выигрывает больше всего. Затем я обнаружил, что, хотя он играет большую часть времени, я нашел способы, которыми я мог бы победить. Это не проблема с моим кодом, просто проблема с тем, как у меня был AI, выберите его путь.
Затем я решил выбрать дерево с максимальными выигрышами для компьютера или максимальными потерями для человека, в зависимости от того, что больше. Это сделало его ЛУЧШИМ, но все же не идеальным. Я все еще мог победить.
Итак, у меня есть две идеи, и я надеюсь на ввод, который лучше:
1) Вместо того, чтобы максимизировать выигрыши или потери, вместо этого я мог бы присвоить значения 1 для выигрыша, 0 для ничьей и -1 для потери. Тогда выбор дерева с наивысшим значением будет лучшим, потому что следующий node не может быть шагом, приводящим к потере. Это легкое изменение в генерации платы, но оно сохраняет одно и то же пространство поиска и использование памяти. Или...
2) Во время создания платы, если есть доска, в которой X или O победят в следующем шаге, будет создан только ребенок, который предотвратит эту победу. Никакие другие дочерние узлы не будут рассмотрены, и после этого поколение будет продолжать как обычно после этого. Он уменьшает размер дерева, но затем я должен реализовать алгоритм, чтобы определить, есть ли один выигрыш в игре, и я думаю, что это можно сделать только в линейном времени (что делает создание платы намного медленнее, я думаю?)
Что лучше, или есть еще лучшее решение?