素数大富豪cpuの出す手の分析


素数大富豪アドベントカレンダー2017の12/5分です。
昨日は 9973_prm(もりしー)さんの4枚出し素数の記事でした
"CPU戦は素数大富豪にはまるきっかけになった"とのこと、嬉しいですね。
明日は m_2sei(二世)さん:山札について語ります の予定です。

素数大富豪cpuの出す手を集計してみようと時々思うことがあったのですが機会がなかったのです。
そこで、素数大富豪アドベントカレンダーが空いている。これはやるしかないと思ったわけです。
そういうわけで現在のデフォルトの設定で5000回対戦させた結果を集計してみました。
また、10,100,1000回まとめて対戦させたり結果を集計できる機能をこちらに用意しました。
特別な知識がなくても設定をいろいろ変えて集計してみることができるようになっています。

早速結果です。画像は25位までです。最後まで全部含めた集計データはこちらです。
(リンク先はタブで区切ったtxtファイルです。Excelなどに貼り付けると見やすくなると思います)

きっと各自いろんな発見をするんではないかと思いますが、適当に語ります:
・2枚出しは57,1213,811,911,1013,613,89の順でやはりという感じです。
・3枚出しは61211,71011,81013,41011まではやはりという感じです。
 そのあとは3枚6桁が登場するよりも8101,13127,9511と続くのでした。
・193(一休さん)は登場していません。319,391,913,931は全部合成数なので193の順になるのです。
 cpuはこういう弱くなってしまう出し方はしない傾向にあるということだと思います。
(ちなみに139は2回登場しています。革命があったんですね)
・実は私もcpu対戦をしていて、4枚4桁→4枚7桁という戦法は効果的だと感じていました。
 しかしやはりそれは駆使できる素数の個数に限りがある人間のための戦い方で、
 cpuは今回の集計で4枚出しを1673種類も使っています。
 そのうち素数出しは1024、合成数出しは648通り(数が合わないのは1728の分)もあります
・4枚出しは、1729に続く2位が84121で意外でした。1212103や1210103も意外でした。
 その後には、-1011で終わる6桁の 461011,941011,681011,981011 が集まっています。
 上記の戦法ではあまり使われない素数たちです。
 このあたりの強さの4枚出しは、4枚出しでラリーをするつもりなレベルのように思います。
・最も使われた4枚合成数出しは68125=5^4*109で、8回出現しています。知らなかったです・・。
 次に使われた4枚合成数出しの出現回数は3回になるので結構差がついています。
 4以上の偶数を1つずつ(5は2つ)消費できるので実際便利なのかもしれません。
・411211や511211は区切り方によって分割されるので順位的にはちょっと損ですね。
(4,11,2,11は12回、4,1,12,11は29回、5,11,2,11は11回、5,1,12,11は19回)
・せっかくなので5枚出しもちょっとだけ調べてみました。1000回対戦で266手。
 484411,61101011,8126101の3種が3回、他20種類が2回、残り217種が1回ずつです。
 やはり、ばらけています。また、上位は偶数消費型の傾向が目立ちます。

266手全部含めた集計データ

ここからはさらにちょっと裏話や雑談になります。
cpuと言っても、Alpha碁のような高等な機械学習をさせたわけではありません。
予め私が経験に基づいて作った命令に従って行動しているという描写がより近いです。
行動を作る一部に、一手がどれだけ強いかを数値化する(経験に基づく適当な)関数があります。
cpuがどんな手を使うかは、特にこの関数にある程度左右されます。
(見ての通り1729を積極的に出すように補正したりもしています。)
ちょっと試してみることができるようにしてみます:
枚出しで を評価
function hk3(x,y){ #y枚出しでxを出すときの強さの評価
 if(x==57)return 1;if(x==1729)return 0.98;
 var j=Math.pow(x/[1,13.1,1213,81013,1212121,999999999][y],1/y);
 if(y==3&&x>=81013)j=0.95+0.05*(x-81013)/(131313-81013);
 if(y==4&&x>=1212121)j=0.95+0.05*(x-1212121)/(13131313-1212121);
 if(j>1)j=1; /*if(bk)j=1-j;*/ return j;}
4枚出し以上は(当時やり込みが少なかったのもあるのか)いまいちな印象です。
どうやらcpuは4枚出しの1212103はかなり無敵だと思っているらしいです。
それで1212103がそんなに上位にいるのも納得です。

そういうわけで人間の感覚からすると改善の余地はまだまだあるcpuなのですが、
もちろん短時間での全探索能力と、それによる非人間的な合成数出しが得意です。
パスして先手を譲ると残り11枚から必殺技を決めてきたりします。
以前にもっちょさんが紹介していた 379*10847=4111013とか、
今ちょっとやった所、13→3^3*5*5*19=12825 とか、1213→2^3*8513=68104 とか。
集計データの最後の方にもカードを11枚使った合成数出しがちょいちょいあります。
キグロさんの小説のように素数大富豪プレイヤーには個性がつきもので、
cpuも個性を持ったやつということで、今回の集計は一部にはそれを示すものだったと思います。

なので例えば今回の集計で上位にある素数が特に有用とは限らないですが、
もしかしたら実際有用だったりするものもあるかもしれません。
良いのがあればぜひ新しい出会いのきっかけにしてもらえると良いと思います。

2017/12/5

inserted by FC2 system