私はミニマックス アルゴリズムのためにリスト上で Python のmax
および関数を使用しており、またはmin
によって返される値のインデックスが必要です。言い換えると、どの動きが最大値 (最初のプレーヤーのターン) または最小値 (2 番目のプレーヤー) を生成したかを知る必要があります。max()
min()
for i in range(9):
new_board = current_board.new_board_with_move([i / 3, i % 3], player)
if new_board:
temp = min_max(new_board, depth + 1, not is_min_level)
values.append(temp)
if is_min_level:
return min(values)
else:
return max(values)
値だけでなく、最小値または最大値の実際のインデックスを返すことができる必要があります。
ベストアンサー1
リストがありvalues = [3,6,1,5]
、最小の要素のインデックスが必要であるとしますindex_min = 2
。この場合、つまり です。
itemgetter()
他の回答で提示されている解決策を避け、代わりに
index_min = min(range(len(values)), key=values.__getitem__)
を必要とせずimport operator
、 を使用する必要もなくenumerate
、 を使用するソリューションよりも常に高速です (以下のベンチマーク) itemgetter()
。
numpy配列を扱っている場合やnumpy
依存関係として余裕がある場合は、
import numpy as np
index_min = np.argmin(values)
次の場合には、これを純粋な Python リストに適用した場合でも、最初のソリューションよりも高速になります。
- それはいくつかの要素よりも大きいです(私のマシンでは約2**4要素)
- 純粋なリストから
numpy
配列へのメモリコピーは可能である
私は自分のマシンで、上記の2つのソリューション(青:純粋なPython、最初のソリューション)(赤:NumPyソリューション)とitemgetter()
(黒:参照ソリューション)に基づく標準ソリューションのベンチマークをPython 2.7で実行しました。Python 3.5を使用した同じベンチマークでは、上記のPython 2.7の場合とまったく同じ方法を比較できることが示されました。