1

この 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 を返します。アルゴリズムコードは次のとおりです。ProcessmultiprocessingH

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

しかしいつもではない。再帰的な方法に間違いはありますか?私は本当にそれを理解することはできません。

私のアイデアは、ターンごとにローカルキューを構築し、そのキューから最大/最小値を抽出して、前のターンのキューである「上部」キューに移動することでした。

4

2 に答える 2

1

ここで問題がどこにあるのかを自問自答している人はいないと思いますが、将来の読者のために:メソッドは渡されたキューでq_elemsメソッドを実行し、そのメソッドは実際にキューから要素をポップアウトし、それらを返しますが、それらを削除しますキューから。get

問題が解決しました。

于 2013-01-26T16:12:50.573 に答える
0

したがって、そのメッセージから、q_elems(local_queue) が [] を返しているように聞こえます。これは、local_queue に何もないことを意味します。

possible_moves() が空のリストを返す可能性はありますか (たとえば、ボード上ですべての移動が行われた後)? possible_moves が何も生成しない場合、ローカル キューには何もありません。

于 2013-01-26T00:03:45.273 に答える