Мне нужно представить дерево с несколькими ветвями на узел.Какую структуру я должен использовать?Это для вычисления состояний игры в шахматы.Он взрывается экспоненциально, поэтому память будет проблемой.Я использую C ++ 11, но я открыт для других стандартов.Кроме того, обрезка должна быть O (1).
EDIT1 Чтобы расширить, я собираюсь провести соревнование по шахматному ИИ.Основная PvP-игра уже завершена, и я программирую AI API.Конкурсанты напишут свой ИИ, и тогда мы заставим их участвовать в турниреИИ победителя будет использован в Player vs Computer games.Я просто думаю о лучшей структуре для хранения моих состояний игры и мыслей ИИ.
Я читал о Deep Blue, и он думает, что от 5 до ~ 25 шагов вперед.Я могу представить себе большинство компьютеров, способных обрабатывать 5 ходов на глубину с помощью BFS, но что-то более глубокое, и я считаю, что мне придется использовать DFS.
AI будут синхронизированы, а конкурирующие AI будут воспроизводиться только локально, так что нет.чтобы представить преимущества в мощности процессора.
Я читаю о поисках Монте-Карло и Альфа-бета.
Мои первоначальные мысли о структуре данных следующие:
union CHESS_MOVE {
unsigned short m;
ChessPosT pos[2];
///...
};
class ChessMoveNode {
CHESS_MOVE move;
std::set<ChessMoveNode> nextmoves;
};
class ChessMoveTree {
std::set<ChessMoveNode> next;
};
Плата может быть рассчитана в любое время путем объединения пути от корня до листа.Хотя пересчет платы может стать очень дорогим со временем.Идеи?Должен ли я хранить доску?Доска хранится в виде массива из 64 индексов, содержащих номер фигуры.Таким образом, это 16 байтов, по сравнению с 2, но использование памяти сэкономило бы много пересчета состояния платы.
Для моего личного ИИ я буду реализовывать функцию оценки доски, которая будет ранжироватьигровые состояния, а затем все не максимальные игровые состояния будут отбрасываться, а также обрезать игровые состояния, которые становятся недействительными при выборе хода.