バラつきをなくす、各ラウンドの最終ターンで最善の手を考える

同じカードが固まっていると選択肢が狭まり、最善を考えようにもどうしようもなくなるときもある。
ということで最善の手を考えないときでも、まったくの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