鬼畜材料练习生 2021-10-15 18:21 采纳率: 66.7%
浏览 14
已结题

为什么我的alphabeta算法加了置换表以后就变成笨蛋了?


int nega_max(int level,int max_depth,int alpha,int beta,last_level_information_t last_level_information){
    //初始化临时数据
    int val=0;
    int best=0;
    int score=0;
    int parameter_cal_score = -last_level_information.who_big;
    int parameter_get_move= -last_level_information.who_go;
    //生成ID
    QString des;
    for(int i=0;i<182;i++){
        QString c=QString::number(t_Board[i]);
        des+=c;
    }
    QString md5;
    QByteArray bb;
    bb = QCryptographicHash::hash ( des.toLatin1(), QCryptographicHash::Md5 );
    md5.append(bb.toHex());
    //同步棋盘
    if(level==max_depth){
        for(int i=30;i<152;i++){
            t_Board[i]=Board[i];
        }
    }
    //估分
    if(level<=0){
        return cal_score(parameter_cal_score);
    }
    last_level_information_t now_level_information={parameter_cal_score,parameter_get_move};


    //生成着法表
    QVector <possible_t> steps;
    get_all_possible_move(steps,parameter_get_move,0,t_Board);

    //查询置换表
    if(level!=max_depth){
        QList<int>values = hash.values(md5);
        if(values.size()==1){
            return (values.at(0));
            }

        }
    }

    //AI常规计算部分
    fakemove(steps[0]);
    best=-nega_max(level-1,max_depth,-beta,-alpha,now_level_information);
    unfakemove(steps[0]);
    steps[0].score=best;
    if(level==max_depth){
        best_move=steps[0];
    }
    //计算第二个及以后的走法
    for(int i=1;i<steps.size();i++){
        if(best<beta){
            if(best>alpha){
                alpha=best;
            }
            fakemove(steps[i]);
           score=-nega_max(level-1,max_depth,-alpha-1,-alpha,now_level_information);
            if(score>alpha&&score<beta){
                best=-nega_max(level-1,max_depth,-beta,-score,now_level_information);
                steps[i].score=best;
                if(level==max_depth){
                    best_move=steps[i];
                }
            }else if(score>best){
                best=score;
                if(level==max_depth){
                    best_move=steps[i];
                }
            }
            unfakemove(steps[i]);
        }
    }
    //置换表未命中
    hash.insert(md5,best);//将该节点插入置换表
    return best;
}

电脑加了置换表以后,送马送车,不知道怎么回事啊?怎么办啊?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    问题事件

    • 系统已结题 10月23日
    • 创建了问题 10月15日

    悬赏问题

    • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
    • ¥15 关于#Java#的问题,如何解决?
    • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
    • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
    • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
    • ¥15 cmd cl 0x000007b
    • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
    • ¥500 火焰左右视图、视差(基于双目相机)
    • ¥100 set_link_state
    • ¥15 虚幻5 UE美术毛发渲染