2011-12-02 16 views
0

私はJavaでツリーを作成して移植しようとしていましたが、ミニマックスアルゴリズムを使ってAIのための最良のコースを見つけました。ツリーの再帰的集団

public void printTree(Node node){   
     if(node!=null){ 
      System.out.println(node.depth + " " + node.state); 
      printTree(node.e1); 
      printTree(node.e2); 
      printTree(node.e3); 
      printTree(node.p1); 
      printTree(node.p2); 
      printTree(node.p3); 
     } 
    } 
:すべてが内容を印刷して、働いていたかどうかを確認するために

public void score(Node node, char a){  
    //Assigning scores to states to find utility value 
    //Changing state strings to reflect current state of nodes and phase 
    if(node!=null && node.depth!=6){ 
      if(node.depth%2==1){ 
      //Player's turn 
      node.state = node.state.substring(0, node.depth))+a+node.state.substring((node.depth+2));   
      score(node.e1, 'a'); 
      score(node.e2, 'b'); 
      score(node.e3, 'a'); 
      score(node.p1, 'b'); 
      score(node.p2, 'a'); 
      score(node.p3, 'b'); 
      } 
      else if(node.depth%2==0){ 
      //AI's turn 
      node.state = node.state.substring(0,(node.depth+4))+a+node.state.substring((node.depth+6)); 
      score(node.e1, 'a'); 
      score(node.e2, 'b'); 
      score(node.e3, 'a'); 
      score(node.p1, 'b'); 
      score(node.p2, 'a'); 
      score(node.p3, 'b'); 
      } 
     }  
    } 

テスト機能:値でツリーを移入する

public void gen(Node n, int depth){ 
    if(depth == 6){ 
     n = new Node(); 
     n.depth = height; 
    } 
    else{ 
     n = new Node(); 
     n.depth = depth;    
     gen(n.e1, depth+1); 
     gen(n.e2, depth+1); 
     gen(n.e3, depth+1); 
     gen(n.p1, depth+1); 
     gen(n.p2, depth+1); 
     gen(n.p3, depth+1); 
     } 
    } 

機能:

再帰関数がツリーを生成します

そして、ノードクラス自体: finalクラスノード {
public String state = "BCXXXCXXX";

//utility value 
public int score; 
public int oscore; 
public int utility; 
public int min; 
public int max; 
public int depth; 

Node p1; 
Node p2; 
Node p3;  
Node e1; 
Node e2; 
Node e3; 

public Node() 
{ 

} 

}

Iは、印刷機能を実行し、それは私が最初のノードについて予想 1 BxXXCXXXを印刷します。私は空ノードと深さ1でそれを呼び出しました。ツリーの残りの部分を深さ6まで生成(または印刷)していないのはなぜですか?

私はこれがおそらく無関係であると考えていますが、このコードは最終的にAndroidゲームで使用されます。

+1

ミニマックスアルゴリズムでは、ツリーを構築しないでください。再帰パターンには暗黙的に記述する必要があります。 –

+0

それはどういう意味ですか? – zigzag90

+0

再帰的DFSと同じように、一度にパスを生成する必要があります。 –

答えて

2

Javaは値でNodeを渡すので、割り当てn = new Node();は効果がありません。 gen関数は、作成したノードをパラメータとして受け取るのではなく、そのノードを返します。

public Node gen(int depth){ 
    Node n = new Node(); 
    if (depth == 6){ 
     n.depth = height; 
    } else { 
     n.depth = depth;    
     n.e1 = gen(depth+1); 
     n.e2 = gen(depth+1); 
     n.e3 = gen(depth+1); 
     n.p1 = gen(depth+1); 
     n.p2 = gen(depth+1); 
     n.p3 = gen(depth+1); 
    } 
    return n; 
} 
+0

出力は変わりましたが、私の印刷機能が無限ループを示しているので、これがトリックであったかどうかは確認できません。私はJavaに新しいので、私はそれにも間違っている何かがありますか? – zigzag90

+0

@ zigzag90これは予想外です。プリントアウトの最初の30〜40行を共有できますか? – dasblinkenlight

+0

私は申し訳ありませんが、私は関数の古いバージョンを使用していました。今回はうまくいった。私は今、全体のプロジェクトにそれを追加しようとします、ありがとう! – zigzag90