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
没有评论:
发表评论