首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP树构建函数在深度=4时中断,而在深度<4时工作,为什么?

PHP树构建函数在深度=4时中断,而在深度<4时工作,为什么?
EN

Stack Overflow用户
提问于 2009-10-23 22:41:09
回答 2查看 467关注 0票数 0

坦白说,这是我大学任务的一部分,但我已经做了很多.因此,请感到舒服,继续阅读,因为我不需要备忘单左右:)该项目现在部署在我的网站

好的,我可能在几分钟前找到了原因: array_push()在一个数组中推送了许多项之后失败了。可笑的小阵列容量? 当初始深度设置为3时,它可以工作,因为77行不会炸掉数组;但是初始深度4会产生超出PHP数组容量的更多行(奇怪,以前从未想过这一点)。 在注释掉array_push()部分后,此树构建函数将工作,10+秒的初始深度为6.所以我想修复会在PHP中找到另一个集合类型,它可以容纳那么多的元素. 测试表明,在我当前的递归树构建函数下,数组存储中允许的最大行数大约为950.除此之外,还会导致一个“不可见的”允许内存大小耗尽的错误,这只会使PHP脚本无法进一步执行。我可以简单地通过引入更多的数组存储对象来解决这个问题。 所以请忽略下面的单词,因为现在这个问题已经改变了,焦点也不再存在。

猴子级和新手级没有bug就完成了(至少我希望如此)。我遇到了一个奇怪的问题,当实现极小极大搜索算法在老牌水平,特别是当试图建立一棵树,直到N-深度。

我的buildTree函数只有在初始深度设置不大于3时才能工作。当初始深度设置为2时,它将生成16个树节点;当设置为3时时,生成77个树节点。我认为逻辑工作正常,因为您可以使用检查这一点。

此函数的目的是模拟ai/player的n步移动。每次移动都会改变游戏板上的单元格状态。请访问上述网站,并玩一个菜鸟游戏,让你明白这是什么目的。

比如说,这个函数是用于人工智能的。AI采取移动A,然后玩家应该采取他/她的移动B根据AI的移动,然后等等.在移动之后,船上的某些细胞需要翻转。评分功能是根据当前的游戏板状态来评估一个分数。当函数完成时,我可以得到一个完整的列表,其中每一行实际上表示树中的一个节点,如下所示:

AI | |-----------| PLAYER PLAYER | | |--------|-----------| |-------|---------| AI AI AI AI AI AI ......................

下面是一个but函数,花了几个小时观察它,但找不到原因:

代码语言:javascript
运行
复制
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时,我仍然对这意味着什么感到困惑。有人能帮我吗?任何建议都是非常感谢和感谢的,提前!

EN

回答 2

Stack Overflow用户

发布于 2009-10-23 23:09:22

为了调试目的,我有以下功能:

代码语言:javascript
运行
复制
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()

代码语言:javascript
运行
复制
debug_array($var1, $array, object, (bool)$test,...)
票数 1
EN

Stack Overflow用户

发布于 2009-10-23 23:00:44

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1616292

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档