Java递归博弈论获得最佳结果

Java递归博弈论获得最佳结果,java,recursion,Java,Recursion,我的任务是编写一个函数,该函数将为计算机找到回溯算法中的最佳移动方式。我的解决方案找到了一个可赢的答案,但不是最佳答案。我很难找到一种方法来保持分配给不同选项的值,这些选项在下一次递归调用期间不会重置。因此,如果它通过移动1,2,3,4,2和3都导致一个可赢的解决方案,它将需要3而不是2,即使2是更好的选择。我可以在我的代码中看到为什么会发生这种情况,但我似乎无法思考如何修复它。我尝试使用wins和total wins变量,但这似乎不起作用。因此,该函数再次可以找到一条可赢的途径,但并不总是选择

我的任务是编写一个函数,该函数将为计算机找到回溯算法中的最佳移动方式。我的解决方案找到了一个可赢的答案,但不是最佳答案。我很难找到一种方法来保持分配给不同选项的值,这些选项在下一次递归调用期间不会重置。因此,如果它通过移动1,2,3,4,2和3都导致一个可赢的解决方案,它将需要3而不是2,即使2是更好的选择。我可以在我的代码中看到为什么会发生这种情况,但我似乎无法思考如何修复它。我尝试使用wins和total wins变量,但这似乎不起作用。因此,该函数再次可以找到一条可赢的途径,但并不总是选择最佳的可赢招式。任何帮助都将不胜感激

Move bestMove = null;


    int totalwins= 0;
    public Move findbest(Game g) throws GameException {
        int wins = 0;

        PlayerNumber side = g.SECOND_PLAYER;
        PlayerNumber opp = g.FIRST_PLAYER;
        Iterator<Move> moves = g.getMoves();
        while(moves.hasNext()){

            Move m = moves.next();
            //System.out.println(m + " Totalwins " + totalwins);
            Game g1 = g.copy();
            g1.make(m);
            //System.out.println("Turn: " + g.whoseTurn());
            if(!g1.isGameOver()){
                bestMove = findbest(g1);
            }else{
                if(g1.winner() == side ){
                    bestMove = m;
                    wins++;
                }else if(g1.winner() == opp){
                    wins--;
                }
                if(wins > totalwins){
                    totalwins += wins;
                    bestMove = m;
                }
            }
            if(bestMove == null){//saftey so it won't return a null if there is no winnable move.  
                bestMove = m;
            }
        }
        //System.out.println("Totalwins = " + totalwins);
        return bestMove;
    }
Move bestMove=null;
整数=0;
公共移动findbest(游戏g)抛出GameException{
int=0;
PlayerNumber侧=第二名玩家;
PlayerNumber opp=g.第一名球员;
迭代器moves=g.getMoves();
while(moves.hasNext()){
Move m=moves.next();
//系统输出打印项次(m+“Totalwins”+Totalwins);
游戏g1=g.copy();
g1.make(m);
//System.out.println(“Turn:+g.whoseTurn());
如果(!g1.isGameOver()){
bestMove=findbest(g1);
}否则{
如果(g1.winner()==侧){
bestMove=m;
wins++;
}else if(g1.winner()==opp){
赢--;
}
如果(wins>totalwins){
全胜+=全胜;
bestMove=m;
}
}
如果(bestMove==null){//saftey,那么如果没有可赢的移动,它将不会返回null。
bestMove=m;
}
}
//System.out.println(“Totalwins=“+Totalwins”);
返回最佳移动;
}

如评论中所述,你需要有某种评级系统来确定哪一步才是最好的


然后,制作一个全局变量
Move bestMove
,而不是让
findBest
返回“best Move”,只需让它检查当前的移动是否是一个成功的移动,如果是,还要检查它的评级是否比当前的
bestMove好。
如果这两个条件都是真的,然后将当前移动分配到
最佳移动。

如评论中所述,您需要有某种评级系统来确定哪种移动真正是最好的


然后,制作一个全局变量
Move bestMove
,而不是让
findBest
返回“best Move”,只需让它检查当前的移动是否是一个成功的移动,如果是,还要检查它的评级是否比当前的
bestMove好。
如果这两个条件都是真的,然后将当前移动分配给最佳移动。

为了确定最佳移动,您必须有一个排名系统。一步比另一步好吗?你必须有一个清晰的方法来比较动作。然后,它将取决于游戏的类型。在某些游戏中,可以通过某种算法计算出最佳移动。在其他情况下,最好先计算所有可能的移动,然后对它们进行排序。你的情况似乎是后者。要使用递归回溯,您必须找到一种方法,在每次递归调用时确定哪一步是最好的,并返回该步。我希望能想出一种方法,来计算每一步可以获得的可赢状态数。然后,哪一个移动具有最多的可赢状态将被返回Peter3,看看递归和基于排名/权重的算法,比如a*(发音为“a,Star”,这是一种在游戏AI中常见的路径查找算法)。它可能会给你(非常)有用的提示和/或灵感。这也与阿夫桑托斯所说的有关,也是一个例子。希望有帮助!为了确定最好的东西,你必须有一个排名系统。一步比另一步好吗?你必须有一个清晰的方法来比较动作。然后,它将取决于游戏的类型。在某些游戏中,可以通过某种算法计算出最佳移动。在其他情况下,最好先计算所有可能的移动,然后对它们进行排序。你的情况似乎是后者。要使用递归回溯,您必须找到一种方法,在每次递归调用时确定哪一步是最好的,并返回该步。我希望能想出一种方法,来计算每一步可以获得的可赢状态数。然后,哪一个移动具有最多的可赢状态将被返回Peter3,看看递归和基于排名/权重的算法,比如a*(发音为“a,Star”,这是一种在游戏AI中常见的路径查找算法)。它可能会给你(非常)有用的提示和/或灵感。这也与阿夫桑托斯所说的有关,也是一个例子。希望有帮助!添加时,您可以跟踪排名最高的移动,无需迭代列表抱歉,最近刚刚编写了一个类似的算法,实际上我必须将所有返回值存储在
ArrayList
中,然后迭代它们,所以我的想法是错误的。编辑了我的答案。上面已经有了bestMove的全局变量。我尝试用wins和totalwins变量设置权重,并将bestMove指定为两者中较高的一个。我感谢你的帮助。我马上就要在我的桌面上完成了,我会发布我最后做的事情你可以在添加它们时跟踪排名最高的移动,不需要迭代列表对不起,最近刚刚写了一个类似的算法,实际上我必须将所有返回值存储在
数组列表中
并迭代它们,所以我的想法是错误的。编辑了我的答案。上面已经有了bestMove的全局变量。我试着把体重调好