Честно говоря, это часть моего университетского задания, НО я уже сделал немало ... так что, пожалуйста, чувствуйте себя комфортно и продолжайте читать, так как я не прошу шпаргалку или около того :)
Проект теперь развернут на моем сайте
Хорошо, я мог бы найти причину всего несколько минут назад:
Функция array_push () завершается ошибкой после добавления множества элементов в массив. Смешно маленькая емкость массива ???
Это работает, когда начальная глубина установлена в 3, так как 77 строк не будут УДАРАТЬ массив; но начальная глубина 4 будет генерировать больше строк сверх возможностей массива PHP (странно, никогда раньше не задумывался об этом).
После комментирования части array_push () эта функция построения дерева будет работать, стоимость 10+ секунд для начальной глубины 6 ... Так что я думаю, что исправлением будет поиск другого типа коллекции в PHP, который может содержать столько элементы ...
тест показывает, что в моей текущей рекурсивной функции построения дерева наибольшее количество строк, допустимых в хранилище массива, составляет примерно 950 ... Кроме того, это может привести к ошибке «невидимый» исчерпанный объем памяти, которая просто убивает скрипт PHP от дальнейшего исполнения. Я могу решить эту проблему, просто добавив больше объектов для хранения массивов.
Поэтому, пожалуйста, не обращайте внимания на слова ниже, так как теперь вопрос был изменен, и фокус больше не существует.
Уровень обезьяны и уровень новобранца закончены без ошибок (по крайней мере, я на это надеюсь).
Я столкнулся со странной проблемой при реализации алгоритма минимаксного поиска на уровне Ветеранов, особенно при попытке построить дерево до N-й глубины.
Моя функция buildTree будет работать только при начальной глубине не более 3.
Он генерирует 16 узлов дерева, когда начальная глубина установлена в 2, и 77, если установлено в 3.
Я считаю, что логика работает, как вы можете проверить это с помощью Fire Bug Console.
Цель этой функции - моделировать движения игрока / игрока за n шагов. Каждый ход меняет статус ячеек на игровой доске. Перейдите на вышеупомянутый веб-сайт и поиграйте в игру новичка, чтобы понять, для чего она нужна.
Скажем, эта функция используется для ИИ. ИИ делает ход А, затем игрок должен сделать свой ход В в соответствии с ходом ИИ, и так далее ... После выполнения хода необходимо перевернуть определенные ячейки на доске. Функция счета предназначена для оценки счета на основе текущего статуса игровой доски.
Когда функция завершается, я могу получить полный список, где каждая строка фактически представляет узел в дереве, например:
AI
|
|-----------|
PLAYER PLAYER
| |
|--------|-----------| |-------|---------|
AI AI AI AI AI AI
......................
Ниже приведена функция, которая глючит, часами смотрела на нее, но не может найти причину:
function buildTree($gamecells, $depth, $side, $parent)
{
//make copies of the arguments passed.
$currentCells = $gamecells;
$currentDepth = $depth;
$currentSide = $side;
$currentParent = $parent;
$nextMoves = $this->checkForValidMoves($currentCells, $currentSide);
if(count($nextMoves) != 0 ) //can still move on.
{
foreach($nextMoves as $nextMove)
{
$flippedCells = $this->flipCells($currentCells, $nextMove, $side);
$result = $this->getScore($flippedCells, $this->Session->read('aiside'));
$score = $result['score'] - $result['libertyPenalty'];
$parentsTrace = $currentParent.'_'.$nextMove;
if($currentDepth > 1) //currentDepth == 1 means this is a leaf node.
$this->buildTree($this->getGamecellMap($flippedCells), $currentDepth-1,
$this->swapSides($currentSide), $parentsTrace);
array_push($this->movesTree, array
('depth'=>$currentDepth,
'parentTrace'=>$parentsTrace,
'move'=>$nextMove,
'score'=>$score));
}
}
if($currentDepth == 1) //we have traversed all leaf nodes, time to quit.
return;
}
Поскольку я использую PHP + AJAX, мой обычный способ отладки в PHP (вывод некоторых функций) не будет работать. Кроме того, я все еще не понимаю, что это значит, когда он работает, когда начальная глубина не превышает 3 ...
Может кто-нибудь мне помочь? Любое предложение высоко ценится и большое спасибо заранее!