見出し画像

[Unity Blocks 14]シミュ―レーションを軽くした結果

モンテカルロ法の処理を軽くする

GetAllInstructionsの処理を軽くするために、反転、回転しても形状が変わらないピースの場合はスキップするようにしました。(正方形のピースは回転した場合の判定は回転前と変わらないみたいなところ)

もちろんピースの使用状況にもよりますが、平均して3sぐらいかかっていた部分は1sぐらいになりました。ですが、ゲーム最後までこの関数を使うにはかなりきつそうです。

ゲームの最後までシミュレーション時、GetAllInstructions関数ではなく、ランダムに選んだ位置でランダムに選んだピースがはまれば、それを採用するGetRandomInstruct関数を作成して実行してみました。

実行結果は1sだったところが0.3sまで早くなりました。それでも少し遅くはなりますが・・・。

これで何度か実行してみました。

CPU1:9ターン目まで軽い処理、それ以降は重い処理(前回は10)
CPU2:最後まで軽い処理

モンテカルロ法のシミュレーション回数:2
シミュレーションする手数:100 (前回は10)

多分勝率は半分と少し・・・。

下がりましたwww

前回の結果のサンプル数が少ないので、もっと試すと以外と勝率は低かったかもしれないですね。

そもそもプログラムがあっているかについては検証がめんどくさいので会っている前提で進めていきます。

モンテカルロ法の処理について考える

それなりに早い処理にはなりましたが、やはりスパコンでもないパソコンで手数が多いこのゲームのシミュレーションはきつかったみたいです。

序盤・中盤よりも最後が肝心なゲームだと思っていましたが、中盤のピースの置き方で勝ち負けが決まってしまいそうでした。最後にモンテカルロ法でピースを置いても時すでにお寿司だったみたいです。

最初からモンテカルロ法を採用したとしても、最も手数が多くなるタイミングで600手ほどに増えます。これでも最初のうちは大きいピースから消費するようにしていました。これらを検証するには少し厳しそうです。

また、その後もランダムに置くことを考えるとシミュレーション回数はもっと数を多くしないと難しそうでした。最後の方だけシミュレーション回数を増やしてもいいですが、やはり重要な中盤では効果が薄そうです。

軽い方の処理について考える

モンテカルロ法は失敗しましたが、軽い処理の方はそれなりに強かったかなと思いました。

実際に自分で対戦しましたが、
自分が先攻:スコア1差で勝ち
自分が後攻:スコア3差で負け

自分があんまりやったことがないのはあるんですが、以外と強かったです。。。

今回のような場合は置いたピースを逐一評価する方がコスパは良さそうでした。

改善点をあげるとすると、より陣地を広くとるべきだと思うので、ボード中央にこだわらず、ピースがある程度ばらけるような評価関数であればより強いと思いました。

最後に

これでUnity Blocksと名付けたプロジェクトは終わりにします。次はもっとUnityらしいシェーダーとかの機能を使いたいです。。。

コード
https://github.com/ktokTs/Blocks/tree/main

最後にCPU同士の対戦盤面

スクリーンショット 2022-01-25 193600


この記事が気に入ったらサポートをしてみませんか?