2021年3月13日星期六

How can I return the next move in the alpha-beta algorithm?

I'm implementing an AI to play Tic Tac Toe and I'm using the alpha-beta algorithm to search for the best move. Below is the code I have so far. I managed to make the algorithm work -- the value of the states seems to be correct, but I'm not being able to return the right next move/board. I've tried a few things. I tried to use guitracer, I tried to read other implementations, but I can't find a solution for my implementation. Could anyone tell me what I'm doing wrong?

alpha_beta(max,Board,Value, NextBoard):-      ab_minimax(max,Board,-inf,inf,Value, NextBoard).        ab_minimax(max,Board,_,_,-1, NextBoard):-      is_winning_state_o(Board), !.  ab_minimax(min,Board,_,_,1, NextBoard):-      is_winning_state_x(Board), !.   ab_minimax(_,Board,_,_,0, NextBoard):-      is_a_draw(Board), !.  ab_minimax(max,Board,Alfa,Beta,Value, NextBoard):-      children(Board, max, Children),      ab_max_children(Children,Alfa,Beta,-inf,Value, NB, NextBoard).  ab_minimax(min,Board,Alfa,Beta,Value, NextBoard):-      children(Board, min, Children),      ab_min_children(Children,Alfa,Beta,inf,Value, NB, NextBoard).    ab_max_children([],_,_,Max,Max, NextBoard, NextBoard).  ab_max_children([H|T],Alfa,Beta,Max1,Max, NB, NextBoard):-      ab_minimax(min,H,Alfa,Beta,Value, NextBoardX),      (           Value > Beta -> % Beta cut              Max = Beta,              NextBoard = H          ; (              max(Value,Alfa,Alfa1), % updates Alpha              max(Value,Max1,Max2),              (Max2 == Value -> NB1 = H; NB1 = NB)              ab_max_children(T, Alfa1, Beta, Max2, Max, NB1, NextBoard)          )      ).    ab_min_children([],_,_,Min,Min, NextBoard, NextBoard).  ab_min_children([H|T],Alfa,Beta,Min1,Min, NB, NextBoard):-      ab_minimax(max,H,Alfa,Beta,Value, NextBoardX),      (          Alfa > Value -> % Alpha cut              Min = Alfa,              NextBoard = H          ; (              min(Value,Beta,Beta1), % updates Beta              min(Value,Min1,Min2),              (Min2 == Value -> NB1 = H; NB1 = NB),              ab_min_children(T, Alfa, Beta1, Min2, Min, NB1, NextBoard),          )      ).  
https://stackoverflow.com/questions/66619508/how-can-i-return-the-next-move-in-the-alpha-beta-algorithm March 14, 2021 at 07:15AM

没有评论:

发表评论