Gobang ai: La idea e implementación de la búsqueda minimax y el algoritmo de poda α-β (qt y c ++) (4) Implementación simple del módulo de eliminación de cálculo

1. ¿Qué se considera matar? ¿Por qué se cuenta como muerte?

Contar para matar es simplemente matar al ajedrez .

Usé Gobang ai para jugar con otros durante un tiempo y descubrí que mirar la profundidad de 6 niveles usando el árbol del juego (simulando ai para dar 4 pasos y la simulación de humano para dar 3 pasos) en realidad no es suficiente, porque el verdadero maestro Puede ver mucho más que el sexto piso. Después de que el maestro hace un plan, al principio, toma la posición que parece " no tan importante ", y luego puede formar un juego de muerte de doble vivo 3 o vivo 4 para derrotar a ai. La inteligencia artificial de la que me di cuenta es en realidad muy miope, es decir, solo puedo ver los beneficios dentro del sexto piso, pero no puedo ver los beneficios generales más grandes.

Aquí me refiero al artículo de este gran hombre, que es muy bueno, pero no puedo entenderlo muy bien, y solo puedo escribirlo basándome en mi propio entendimiento: el quinto artículo de Gobang AI Algorithm-Counting Kill .

¿Cómo hacer que la computadora "planifique" así? Una idea sencilla es matar. Es fácil pensar que contar una muerte es solo un juego de muertes. Es fácil pensar que contar una muerte también es una búsqueda minimax . Es solo que no necesitas considerar los 10 nodos (implementados previamente). Solo necesitas considere el nodo de muerte del blanco (ai) (para formar un nuevo). Si el negro es par 5, vivo 4, golpe 4, vivo 3), el negro solo considera el mejor nodo, entonces el número de ramas b se reduce considerablemente , y la profundidad de búsqueda puede alcanzar más de 16 capas (muchas de ellas no se pueden buscar para 16 capas, porque no hay más nodos de muerte), antes de alcanzar la profundidad de búsqueda, siempre que gane un nodo blanco, tendrá éxito incluso si se mata. Este es el módulo count kill que simplemente implementé.

La función de cálculo de muertes que implementé es relativamente simple, pero ha mejorado aún más el poder del ajedrez.

En segundo lugar, la realización concreta

Primero, calcula la muerte. Si la muerte tiene éxito, usa el punto de muerte. Si no tiene éxito, usa el punto que se encuentra en la búsqueda original de minimax de 6 niveles .

La primera es encontrar el punto de muerte para las blancas.

QList<QPoint> chessAi::seek_kill_points(int (*board)[15]){
    
    //找白棋的连5,活4,冲4,活3的杀棋位置
    QList<QPoint> pointList;

    POINTS P=seekPoints(board);//一般来说,能冲4或者活3的必在评分前20的点内

    int sameBoard[15][15];
    copyBoard(board,sameBoard);

    for(int i=0;i<20;++i){
    
    
        sameBoard[P.pos[i].x()][P.pos[i].y()]=C_WHITE;//模拟落子
        if(evaluate(sameBoard).STAT[WIN]>0){
    
    //产生连5
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[FLEX4]>evaluate(board).STAT[FLEX4]){
    
    //产生新活4
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[BLOCK4]>evaluate(board).STAT[BLOCK4]){
    
    //产生新冲4
            pointList.append(P.pos[i]);
        }else if(evaluate(sameBoard).STAT[FLEX3]>evaluate(board).STAT[FLEX3]){
    
    //产生新活3
            pointList.append(P.pos[i]);
        }
        sameBoard[P.pos[i].x()][P.pos[i].y()]=C_NONE;//还原落子
    }
    return pointList;
}

Cálculo simple para matar el módulo :

struct EVALUATION{
    
    
    int score;
    gameResult result;
    int STAT[8];//储存部分棋形的个数,下标WIN=1为白连5,LOSE=2为黑连5,FLEX4=3为白活4,BLOCK4=5为白冲4,FLEX3=7为白活3
};
struct POINTS{
    
    //最佳落子位置,[0]分数最高,[19]分数最低
    QPoint pos[20];
    int score[20];//此处落子的局势分数
};
struct DECISION{
    
    
    QPoint pos;//位置
    int eval;//对分数的评估
};

DECISION decision;

bool chessAi::analyse_kill(int (*board)[15], int depth){
    
    
    EVALUATION EVAL=evaluate(board);
    if(depth==0||EVAL.result!=R_DRAW){
    
    
        if(depth==0){
    
    //若抵达最深层,走一步对白棋的最好位置,若白棋还没赢则返回false
            POINTS P;
            P=seekPoints(board);            
            board[P.pos[0].x()][P.pos[0].y()]=C_WHITE;

            gameResult result=evaluate(board).result;
            if(result==R_WHITE)return true;
            else return false;
        }else if(EVAL.result==R_WHITE)return true;//找到白棋杀棋
        else return false;//白棋输
    }else if(depth%2==0){
    
    //max层,我方(白)决策
        QList<QPoint> pointList=seek_kill_points(board);//产生杀棋点

        if(pointList.length()==0)return false;//没有杀棋点
        for(auto i:pointList){
    
     
            int sameBoard[15][15];
            copyBoard(board,sameBoard);

            sameBoard[i.x()][i.y()]=C_WHITE;//模拟己方落子
            if(analyse_kill(sameBoard,depth-1)){
    
    
                if(depth==16){
    
    //开始层,需决定落子,结果存于decision中
                    decision.pos.setX(i.x());
                    decision.pos.setY(i.y());
                    decision.eval=INT_MAX;//杀棋评分没有作用
                }
                return true;
            }
        }
        return false;
    }else{
    
    //min层,敌方(黑)决策,只下对自己最好的棋
        int rBoard[15][15];
        reverseBoard(board,rBoard);
        POINTS P=seekPoints(rBoard);//找对于黑子的最佳位置,需要将棋盘不同颜色反转,因为seekPoint是求白色方的最佳位置

        int sameBoard[15][15];
        copyBoard(board,sameBoard);

        sameBoard[P.pos[0].x()][P.pos[0].y()]=C_BLACK;//模拟敌方落子:只走最好的一步
        //无需剪枝
        return analyse_kill(sameBoard,depth-1);
    }
}

//调用
if(!ai.analyse_kill(ai.chesses,16)){
    
    
     qDebug()<<"没找到杀棋";
     ai.analyse(ai.chesses,6,-INT_MAX,INT_MAX);
}else{
    
    
     qDebug()<<"找到了杀棋";
}

fin

El simple hecho de escribir un módulo para matar conteos aún mejora algunas de las habilidades del ajedrez.

Todavía vale la pena estudiar el conocimiento del juego de ajedrez. Cuando estaba buscando información en Zhiwang.com, descubrí que puedo usar Gomoku ai como tesis de maestría. Después de leerlo, sentí eso. . De hecho, la revisión de documentos nacionales es más acuosa. ¡Los verdaderos maestros están en GitHub!

Supongo que te gusta

Origin blog.csdn.net/livingsu/article/details/104655537
Recomendado
Clasificación