Frage

Ich habe versucht, einen Baum in Java zu erstellen und zu bevölkern und dann den Minimax -Algorithmus zu verwenden, um den besten Kurs für eine KI zu finden.

Rekursive Funktion zum Erzeugen von Baum:

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);
        }
    }

Funktion, um Baum mit Werten zu bevölkern:

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');
            }
        }       
    }

Testfunktion, um zu sehen, ob alles funktioniert hat, indem der Inhalt gedruckt wird:

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);
        }
    }

Und die Knotenklasse selbst: endgültige Klassenknoten {
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()
{

}

}

Ich führe die Druckfunktion aus und druckt 1 bxxxcxxx, was ich für den ersten Knoten erwartet habe. Ich nannte es mit einem leeren Knoten und Tiefe von 1. Warum erzeugt (oder druckt es) den Rest des Baumes bis zur Tiefe 6?

Obwohl ich denke, dass dies möglicherweise nicht miteinander verbunden ist, wird dieser Code irgendwann in einem Android -Spiel verwendet.

War es hilfreich?

Lösung

Java passt Node nach Wert, also Ihre Aufgabe n = new Node(); hat keine Wirkung. Dein gen Die Funktion sollte den von ihm erstellten Knoten zurückgeben, anstatt einen als Parameter zu nehmen.

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top