同じカードが固まっていると選択肢が狭まり、最善を考えようにもどうしようもなくなるときもある。
ということで最善の手を考えないときでも、まったくのramdomではなく複数枚持っているカードから優先的に出すように変更。
# 偏っているカードから出していく # それぞれのカードの枚数を数えあげる a = 13 * [0] for i in self.hand: a[to_num(i) - 1] += 1 # 重複した数字の多いものを候補にあげる max_num = max(a) b = [] for i in self.hand: if a[to_num(i) - 1] == max_num: b.append(self.hand.index(i)) # 候補に挙がったものからランダムに選択 from random import choice return self.hand.pop(choice(b))
そして、前回の、「最善の手を考える」方法を各ラウンドの最終ターンに適用させてみる。
同じくRandomAI×2との10000回勝負。
まずは最終ターンだけに適用した場合。
$ time python saichugen.py [2360, -1168, -1192] real 0m41.262s user 0m40.880s sys 0m0.122s
うん、前回とだいたい同じくらい?
次は4、5ラウンドの最終ターンに最善手を考えさせる。
$ time python saichugen.py [4130, -1957, -2173] real 0m57.744s user 0m57.055s sys 0m0.198s
おぉ、劇的にあがってる!!
じゃぁ、3、4、5ラウンドの最終ターンに考えさせたらどうなる?
$ time python saichugen.py [5681, -2941, -2740] real 1m28.371s user 1m27.700s sys 0m0.188s
ついに勝率が5割を超えた!!
計算時間も増大してるけど…まぁ10000回だしな。書き方を良くすればまだどうにかなるかも?
調子に乗って2、3、4、5ラウンドの最終ターンで考えさせてみよう。
$ time python saichugen.py [6403, -3347, -3056] real 2m15.897s user 2m14.457s sys 0m0.278s bash-3.2$
おぉー!時間はかかるけどまだ得点率はあがるようだ!
となると、毎ラウンドの最終ターンに適用させると…!?
$ time python saichugen.py [6683, -3433, -3250] real 3m18.879s user 3m17.409s sys 0m0.384s
んー、さすがに1ラウンド目では最善も何もあったもんじゃないか?
時間が増える割にはそれほど大きな得点増加にはならない。
というわけで、この方法はかなり有効であるということが分かった。
各ラウンドの結果の評価方法をさらに改良すればもう少し精度が良くなることも?
とは言えこの方法は最終ターンのみで、他の場面ではまだまだランダムを使っているから、そこをさらに考えるようにすればまだ上がるか…?
もしくはまた新しい考え方が必要になるのか。
といっても現時点での自分の成績が平均0.45得点だから既にこのAIに負けてるわけだけど orz
AIでどこまで勝率をあげられるんだろうなー?
コイツが最中限オンラインで自動的に戦えるようにするには…MozRepl? w3m?調べてみようー
http://yowaken.dip.jp/tdiary/20081022.html#p02