Рекурсивная популяция дерева - PullRequest
0 голосов
/ 02 декабря 2011

Я пытался создать и заполнить дерево в Java, а затем использовать минимаксный алгоритм, чтобы найти лучший курс для ИИ.

Рекурсивная функция для генерации дерева:

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

Функция для заполнения дерева значениями:

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

И, сам класс узла: Финальный класс Node {
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()
{

}

}

Я запускаю функцию печати, и она печатает 1 BxXXCXXX Что я ожидал для первого узла. Я назвал его пустым узлом и глубиной 1. Почему он не генерирует (или не печатает) остальную часть дерева, вплоть до глубины 6?

Хотя я думаю, что это, возможно, не связано, этот код в конечном итоге будет использоваться в игре для Android.

1 Ответ

2 голосов
/ 02 декабря 2011

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