0

率直に言って、これは私の大学の課題の一部ですが、私はすでにかなりのことを行っています... チートシートなどを求めているわけではないので、安心して読み続けてください:) プロジェクトは現在、私のウェブサイトに展開されています

さて、ほんの数分前にその理由を見つけたかもしれません: array_push() は、配列内の多くのアイテムをプッシュした後に失敗します。とてつもなく小さいアレイ容量???

77行では配列が爆発しないため、初期深度が3に設定されている場合に機能します。しかし、最初の深さを 4 にすると、PHP 配列の容量を超える行が生成されます (奇妙なことに、これまで考えたこともありませんでした)。

array_push() 部分をコメントアウトした後、このツリー構築関数は機能します。最初の深さ 6 で 10 秒以上かかります...したがって、修正は PHP で多くの要素を保持できる別のコレクション型を見つけることになると思います.. .

テストによると、現在の再帰的なツリー構築関数では、配列ストレージで許可される行の最大数は約 950 です。これを超えると、「目に見えない」許可されたメモリ サイズが使い果たされたというエラーが発生し、PHP スクリプトがそれ以上実行されなくなります。 . 配列ストレージ オブジェクトを追加するだけで、この問題を解決できます。

そのため、質問が変更され、フォーカスがなくなったため、以下の単語は無視してください。

サルレベルとルーキーレベルはバグなしで終了しています(少なくともそうであることを願っています). ベテラン レベルでミニマックス検索アルゴリズムを実装しているときに、特に N 番目の深さまでツリーを構築しようとしたときに、奇妙な問題に遭遇しました。

私の buildTree 関数は、初期深度が 3 以下に設定されている場合にのみ機能します。初期深度が 2 に設定されている場合は 16 個のツリー ノードが生成され、3 に設定されている場合は 77 個のツリー ノードが生成されます。Fire Bug を使用して確認できるため、ロジックが機能すると思います。コンソール。

この関数の目的は、n ステップの AI/プレイヤーの動きをシミュレートすることです。各動きは、ゲームボード上のセルのステータスを変更します。前述の Web サイトにアクセスして、ルーキー ゲームをプレイして、これが何のためにあるのかを理解してください。

たとえば、この関数は AI に使用されます。AI が手 A を実行し、プレイヤーは AI の動きに応じて手 B を実行する、というように... 移動後、ボード上の特定のセルを裏返す必要があります。スコア関数は、現在のゲームボードのステータスに基づいてスコアを評価することです。関数が終了すると、次のように、各行が実際にツリー内のノードを表す完全なリストを取得できます。

                                 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() をエコーアウトするか、ajax リクエストからの json 出力のコメント (評価している場合) で javascript のデバッグを試みるか、http://www.firephp.org/のようなものを使用できます。そうすれば、JavaScript コールバックでデバッグできます。自然発生的なバグは、見つけて修正するのが最も困難です。それは今でも私にとってはうまくいっているようです。

于 2009-10-23T23:00:44.853 に答える