0

坦率地说,这是我大学作业的一部分,但我已经做了很多......所以请放心并继续阅读,因为我不要求备忘单左右:) 该项目现在部署在我的网站上

好的,我可能在几分钟前就找到了原因:array_push() 在推送数组中的许多项目后失败。阵列容量小得离谱???

它在初始深度设置为 3 时起作用,因为 77 行不会炸毁阵列;但是初始深度为 4 将生成超出 PHP 数组容量的更多行(奇怪,以前从未想过这一点)。

在注释掉 array_push() 部分之后,这个树构建函数将起作用,初始深度为 6 需要 10 秒以上的成本......所以我想修复会在 PHP 中找到另一个可以容纳这么多元素的集合类型。 .

测试表明,在我当前的递归树构建函数下,数组存储中允许的最大行数大约为 950 ......除此之外会导致“不可见”允许内存大小耗尽错误,这只会导致 PHP 脚本无法进一步执行. 我可以通过引入更多的数组存储对象来解决这个问题。

所以请忽略下面的话,因为现在问题已经改变,焦点不再存在。

猴子级别和菜鸟级别已经完成,没有错误(至少我希望如此)。在 Veteran 级别实现极小极大搜索算法时,我遇到了一个奇怪的问题,特别是在尝试构建深度为 N 的树时。

我的 buildTree 函数仅在初始深度设置不大于 3 时起作用。当初始深度设置为 2 时,它生成 16 个树节点,当设置为 3 时生成 77 个树节点。我认为逻辑有效,因为您可以使用 Fire Bug 检查安慰。

此函数的目的是模拟 AI/玩家移动 n 步。每一步都会改变游戏板上的单元格状态。请访问上述网站并玩一个菜鸟游戏,以便您了解它的用途。

比如说,这个功能是用于人工智能的。AI走A,然后玩家根据AI的走法走B,以此类推…… 走后,板上的某些单元需要翻转。score 函数是根据当前的游戏板状态来评估分数。当函数完成时,我可以获得一个完整列表,其中每一行实际上代表树中的一个节点,如下所示:

                                 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 时它确实起作用时,我仍然对这意味着什么感到困惑……有人可以帮帮我吗?任何建议都非常感谢,并提前非常感谢!

4

2 回答 2

1

出于调试目的,我有这个功能:

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 "</pre>";
}

使用它非常简单,将尽可能多的变量传递给 debug_array()

debug_array($var1, $array, object, (bool)$test,...)
于 2009-10-23T23:09:22.060 回答
0

您可以尝试通过回显 console.logs() 来调试 javascript,甚至可以在 ajax 请求的 json 输出中添加注释(如果您正在评估它们),或者使用类似http://www.firephp.org/的东西。这样您就可以使用 javascript 回调对其进行调试。自发的错误是最难发现和修复的。看起来它现在对我来说工作正常。

于 2009-10-23T23:00:44.853 回答