Функция построения дерева PHP ломается, когда глубина = 4, но работает, когда глубина <4, почему? - PullRequest
0 голосов
/ 24 октября 2009

Честно говоря, это часть моего университетского задания, НО я уже сделал немало ... так что, пожалуйста, чувствуйте себя комфортно и продолжайте читать, так как я не прошу шпаргалку или около того :) Проект теперь развернут на моем сайте

Хорошо, я мог бы найти причину всего несколько минут назад: Функция 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 ... Может кто-нибудь мне помочь? Любое предложение высоко ценится и большое спасибо заранее!

Ответы [ 2 ]

1 голос
/ 24 октября 2009

для отладки у меня есть эта функция:

<code>function debug_array(){

        echo "<pre>";

        foreach(func_get_args() as $v){
            $v = Filter::htmlspecialchars($v, ENT_QUOTES, 'UTF-8');
        is_array($v) || is_object($v) ? print_r($v) : var_dump($v); 
        }
        echo "
"; }

очень просто использовать его, передавая столько переменных, сколько вам нужно, в debug_array ()

debug_array($var1, $array, object, (bool)$test,...)
0 голосов
/ 24 октября 2009

Вы можете попытаться отладить javascript, повторив console.logs () или даже комментарии в выводе json из запросов ajax (если вы оцениваете их), или использовать что-то вроде http://www.firephp.org/. Таким образом, вы можете отлаживать его с помощью обратных вызовов javascript. Самопроизвольные ошибки труднее всего найти и исправить. Похоже, теперь он работает нормально для меня.

...