Domanda

Ho cercato di creare e popolare un albero in Java, quindi utilizzare l'algoritmo Minimax per trovare il corso migliore per un'intelligenza artificiale.

Funzione ricorsiva per generare albero:

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

Funzione per popolare l'albero con valori:

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

Funzione di prova per vedere se tutto funzionava, stampando il contenuto:

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

E, la classe del nodo stesso: nodo della classe finale {
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()
{

}

}

Eseguo la funzione di stampa e stampa 1 bxxxcxxx che mi aspettavo per il primo nodo. L'ho chiamato con un nodo vuoto e una profondità di 1. Perché non genera (o stampando) il resto dell'albero, fino alla profondità 6?

Anche se penso che questo non sia probabilmente non correlato, questo codice sarà alla fine utilizzato in un gioco Android.

È stato utile?

Soluzione

Java passa Node per valore, quindi il tuo incarico n = new Node(); non ha alcun effetto. Tuo gen La funzione dovrebbe restituire il nodo che crea, invece di prenderne uno come parametro.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top