この Python コードでは、同期の問題にすぎないと思います。このコードは、ミニマックス アルゴリズムを Tic Tac Toe ゲームに適用することを目的としており、可能なすべての動きを 1 つずつ調べる単一のプロセスではなく、並列プロセスで実装されています。それを本当に悪い考えだとレッテルを貼る前に、私はそうすることを要求されました.
未知のメソッドは、その名前で示唆されていることを正確に実行すると仮定し、適切に機能すると仮定します (手動でテストされています)。私が100%確信していない唯一の方法はこれです。コードは次のとおりです。
def q_elems(queue):
li = []
while not queue.empty(): li.append(queue.get())
return li
ゲームボードは、単純なBoard
クラス (拡張list
クラス) で表されます。
クラスはPython モジュール
SimpleQueue
からインポートされます。function は、私が実装したヒューリスティック関数です。この関数は、プレイヤー MAX に適したボードには正の値を返し、MIN には負の値を返し、引き分けの場合には 0 を返します。アルゴリズムコードは次のとおりです。Process
multiprocessing
H
def minimax(board: Board, depth: int, turn: int, queue: SimpleQueue) -> int:
queue.put(10000)
if is_winning(board) or is_tie(board) or depth == 0:
queue.put(H(board))
return
local_queue = SimpleQueue()
prcs_list = []
for child_brd in possible_moves(board, MAX if turn == TURN_MAX else MIN):
p = Process(target=minimax, args=(
Board(child_brd), # board
depth - 1, # depth
TURN_MIN if turn == TURN_MAX else TURN_MAX, # turn
local_queue) # queue
)
prcs_list.append(p)
[p.start() for p in prcs_list]
[p.join() for p in prcs_list]
# turn was MAX
if turn == TURN_MAX:
queue.put(max(q_elems(local_queue)))
return
# turn was MIN
else:
queue.put(min(q_elems(local_queue)))
return
主な方法は単純です:
k = SimpleQueue()
minimax(b, MINIMAX_DEPTH, turn=TURN_MAX, queue=k)
私はしばしばこの種のエラーに遭遇します:
Traceback (most recent call last):
File "game.py", line 202, in <module>
minimax(b, MINIMAX_DEPTH, turn=TURN_MAX, queue=k)
File "game.py", line 182, in minimax
queue.put(max(q_elems(local_queue)))
ValueError: max() arg is an empty sequence
しかしいつもではない。再帰的な方法に間違いはありますか?私は本当にそれを理解することはできません。
私のアイデアは、ターンごとにローカルキューを構築し、そのキューから最大/最小値を抽出して、前のターンのキューである「上部」キューに移動することでした。