スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ポケモンGOのマニアックな話~CPの周期性について~

誰が得するんかってぐらいマニアックな話です。

CPでポケモンをソートしてると、個体値とCPとの関係である周期性があることに気づきます。ポケモンの種類によって周期性がごちゃごちゃになることが多いのですが、

高レベル+高個体値 → 高レベル+低個体値 → 低レベル+高個体値 → 低レベル+低個体値

となる傾向があります(あくまで概念図なんで実際はこの通りに並びません)。このあたりは手前味噌ですが、前に投稿した記事を参考にしてください。http://nekokan333.blog.fc2.com/blog-entry-429.html

ぶっちゃけた話、CPでソートした際
Lv20で高個体値 → Lv20で低個体値 → Lv19で高個体値 → Lv19で低個体値 → Lv18で高個体値 → …
って並んでくれればすごく選別が楽になるかもしれません。これが起こる条件を考えていきます。便宜上、これをCPの周期性と呼ぶことにします。

ポケモンのレベルと、可能性のあるCPの範囲をプロットしてみます。同一レベルでCPの幅があるのは個体値が異なるためです。仮に、このように、
20160902_1.png
CPの範囲がレベル別にきっかり分かれている場合は、CPの周期性が強く、望み通りのケースといえるでしょう。これを強い周期性とします。ところが、実際は次のようになり、
20160902_2.png
同一CP値でも異なるレベルの解が起こり得ることがあります。CP値からレベルを特定することはできず、先の概念図とは異なり望んでいたケースではありません。CPの周期性はないわけではないので、弱い周期性ということにしておきましょう。

さっきの図から、強い周期性が起こるための条件は、

強い周期性の条件
レベルnのCPの最大値 < レベルn+1のCPの最小値

ということになります。ポケモンのレベルは.5刻みの小数ですが、ゲットしたてのポケモンは僕が100体ぐらい調べた限り.5のケースはなかった(全て整数レベル)だったので、nとn+1ということにしました。n=1~39.5です。(nの上限は40.5なので)

さて、ここから若干数学的なアプローチで考えます。CPの計算式の次の通りです。
\[CP(L)=\frac{(a+a_{iv})\sqrt{d+d_{iv}}\sqrt{h+h_{iv}}}{10} [C(L)]^2 \tag{1}\] 参考:http://qiita.com/shuheilocale@github/items/0442944326bebdb42df9
 a, d, h : 攻撃、防御、HPの種族値
 同ivの下付き文字 : 攻撃、防御、HPの個体値(0~M=15)
 L : ポケモンのレベル(L=1, 1.5, 2, ……, 40.5)
 C(L) : Lを変数としたCP補正値の関数

CP補正値については、上の記事のリンクにもありますがこちらを参考に:http://www.pokemontrash.com/pokemon-go/niveau-pokemon-poussieres/

次に、同一レベルのCPの最大値と最小値を考えます。個体値はそれぞれ0~M(M=15)であることから、
\[\max[CP(L)]=\frac{(a+M)\sqrt{d+M}\sqrt{h+M}}{10} [C(L)]^2 \tag{2}\]\[\min[CP(L)]=\frac{a\sqrt{dh}}{10} [C(L)]^2 \tag{3}\]となります。強い周期性の条件は、
\[\max[CP(L)]<\min[CP(L+1)] \tag{4}\] です。以下、LはL=1, 1.5, ……, 39.5です。ここで、レベルによらない部分を定数として、
\[K_{max}=(a+M)\sqrt{d+M}\sqrt{h+M} \tag{5}\]\[K_{min}=a\sqrt{dh} \tag{6}\] とおくと、(4)は、
\[K_{max} [C(L)]^2 < K_{min} [C(L+1)]^2] \\ \frac{K_{max}}{K_{min}} < \left[\frac{C(L+1)}{C(L)}\right]^2 = DC(L) \tag{7}\]
となります。左辺のK_max/K_minを種族CP係数と呼ぶことにします。右辺がわかりづらいので、DC(L)という別の関数で表しました。強い周期性が起こるための条件を求めることができました。

C(L)とDC(L)の具体的な値を計算してプロットしてみると、
20160902_3.png
C(L)はほぼ0からゆるやかに上昇し、0.8の近くが最大値になっています。DC(L)は3.13付近から急速に減少し、1付近で収束しています。DC(L)の最大値は3.134(L=1)、最小値は1.014(L=39.5)です。式(7)から、種族CP係数がDC(L)の最小値1.014より小さければ、全てのレベルに対して強い周期性が認められることになります。

また、式(7)を満たす最大のLをL*とおくことにします。「L*のレベルまでなら、強い周期性が維持される」という意味合いです。DC(L)は減少関数なんで。

最後に、個々のポケモンの種族CP係数の値や、L*を計算してみます。種族値のデータはhttps://gamy.jp/pokemongo/pokemongo-base-status を参考にしました。結果は次のようになりました(ちょっと表が長いです)。

ポケモン名種族CP係数L*
フシギダネ1.2786339934
フシギソウ1.2165845075
フシギバナ1.1664810246.5
ヒトカゲ1.3018499143.5
リザード1.2230002635
リザードン1.1663346326.5
ゼニガメ1.2899373823.5
カメール1.2211803265
カメックス1.1683563066
キャタピー1.4860826792.5
トランセル1.4734340542.5
バタフリー1.2306320164.5
ビードル1.4777791932.5
コクーン1.4589868292.5
スピアー1.2315705134.5
ポッポ1.3648623333
ピジョン1.2544496064
ピジョット1.1865698095.5
コラッタ1.409166852.5
ラッタ1.2329004944.5
オニスズメ1.3648869213
オニドリル1.2080659485
アーボ1.3305738693.5
アーボック1.2076247125
ピカチュウ1.3182392423.5
ライチュウ1.1944492925.5
サンド1.3308776733.5
サンドパン1.2029445465
ニドラン♀1.3113339813.5
ニドリーナ1.2347079784.5
ニドクイン1.1692743876
ニドラン♂1.3196678163.5
ニドリーノ1.2383822264.5
ニドキング1.1705891036
ピッピ1.2580899564
ピクシー1.1727517516
ロコン1.3261059453.5
キュウコン1.1828494926
プリン1.3452380953
プクリン1.1932033895.5
ズバット1.3776685893
ゴルバット1.1959419975.5
ナゾノクサ1.2684324
クサイハナ1.212631995
ラフレシア1.1703205666
パラス1.3124943443.5
パラセクト1.2089154185
コンパン1.2824558834
モルフォン1.1983894665.5
ディグダ1.6327204852
ダグトリオ1.2769919614
ニャース1.3427023643
ペルシアン1.215683015
コダック1.2717014694
ゴルダック1.173718476
マンキー1.3158410133.5
オコリザル1.2010082055.5
ガーディ1.2456293714.5
ウインディ1.1539855077
ニョロモ1.3326753013.5
ニョロゾ1.2411590274.5
ニョロボン1.1686846556
ケーシィ1.4177606032.5
ユンゲラー1.2764456964
フーディン1.2074751975
ワンリキー1.2752558894
ゴーリキー1.2059861855
カイリキー1.165404046.5
マダツボミ1.2821301394
ウツドン1.2147062025
ウツボット1.1702828656
メノクラゲ1.310736323.5
ドククラゲ1.180850816
イシツブテ1.3206299163.5
ゴローン1.2339732014.5
ゴローニャ1.1771639116
ポニータ1.2299767454.5
ギャロップ1.1843558045.5
ヤドン1.2608314844
ヤドラン1.1651788436.5
コイル1.341232033
レアコイル1.2061826765
カモネギ1.2515288274.5
ドードー1.3259736183.5
ドードリオ1.2041135465
パウワウ1.2724247834
ジュゴン1.1846419935.5
ベトベター1.2497145094.5
ベトベトン1.1652330986.5
シェルダー1.3393694173
パルシェン1.1978115495.5
ゴース1.3501188053
ゴースト1.2467270184.5
ゲンガー1.1921364445.5
イワーク1.3364379183.5
スリープ1.2770024034
スリーパー1.182586316
クラブ1.3459439573
キングラー1.2063320735
ビリリダマ1.3234241543.5
マルマイン1.2159766195
タマタマ1.2719360924
ナッシー1.1553503226.5
カラカラ1.290122513.5
ガラガラ1.2171219815
サワムラー1.2314914164.5
エビワラー1.2318795294.5
ベロリンガ1.2181160175
ドガース1.2722149724
マタドガス1.1818702256
サイホーン1.262940864
サイドン1.1803508896
ラッキー1.5601857862
モンジャラ1.2082531875
ガルーラ1.1916852755.5
タッツー1.3463707353
シードラ1.2133209765
トサキント1.2956371053.5
アズマオウ1.1891351745.5
ヒトデマン1.3180827923.5
スターミー1.1864662145.5
バリヤード1.2407834294.5
ストライク1.1885120355.5
ルージュラ1.2107827355
エレブー1.1881896675.5
ブーバー1.1825745876
カイロス1.1873783755.5
ケンタロス1.2012678625
コイキング1.7276464361.5
ギャラドス1.1619366196.5
ラプラス1.1544175397
メタモン1.3025723793.5
イーブイ1.2749893494
シャワーズ1.1599350996.5
サンダース1.1866911945.5
ブースター1.1690270026
ポリゴン1.2113742715
オムナイト1.2834024954
オムスター1.1814575446
カブト1.2947518783.5
カブトプス1.1887120125.5
プテラ1.1832676665.5
カビゴン1.153693847
フリーザー1.1538632597
サンダー1.1501706997
ファイヤー1.1472844017
ミニリュウ1.2952800383.5
ハクリュー1.2087587115
カイリュー1.1411645787.5
ミュウツー1.1291510138
ミュウ1.1446481337


具体的な数値を計算してわかったこと
・種族値が強いポケモン(例:カイリューやミュウ等)ほど、種族CP係数が低く、L*が高い。L*の最大値は8であり、レベル8までなら強い周期性がありCPから判定が容易。
・種族値が低いポケモン(例:キャタピーやコイキング)ほど、種族CP係数が高く、L*が低い。L*の最小値はコイキングの1.5であり、コイキングはレベルが2になると強い周期性が崩れることになる。
・結局のところ、実用的なレベルで強い周期性は観測できなく、分度器等でポケモンのレベルを調べなければ個体値の良し悪しを判定できない(この前のアップデートで分度器がそこまで必要ではなくなりました)

おまけ
前回のアップデートでチームリーダーが個体の良し悪しや、特に強いステータスを教えてくれる機能が追加されました。ユーザーが欲している機能を公式側が取り込んでくれるのは非常に良いことだと思います。何番煎じかはわかりませんがこういう遊びができます。
20160902_4.png
スポンサーサイト

ポケモンGOの個体値厳選はCP高い子で十分!?

最近ハマってるポケモンGOです。

カイリューとかミニリュウを必死こいて集めて作ってると、どうしても強い子作りたくなりますよね。そこで厳選方法を調べてみたのですが、

ぶっちゃけめんどくさい!!(個人的意見)

というのものです。カイリューあたりはやる意味あるでしょうが、一度厳選を知ってしまうと、図鑑埋め用のポケモン(極端な話ズバット→ゴルバットとかでも)厳選したくなっちゃうのが人間の心境です。

そこで、厳密な選定をしなくても、おおよそ強い子が見極められる方法を考えてみました。結論だけ出すと、

結論:CPが高い子を選定(進化)させれば十分!

という単純なものでした。もちろん厳選には技の構成があり、その部分は考えていません。いま考えるのは、「HP、攻撃力、防御力」といった個体値の厳選です。ただし、このCPが高いというものにはある基準があります。それを調べてみます。

・CPの計算方法
これは拙作の記事にまとめてあります。詳しくはこちら↓
ポケモンGOのCP計算式のサーベイ
http://nekokan333.blog.fc2.com/blog-entry-426.html

・個体値の全パターンを列挙してみよう
調べてみると、個体値やポケモンのレベルについて以下の傾向がわかります(細かくは違うかもしれません)

・個体値はHP、攻撃力、防御力とも、0~15の整数で表される。全16^3パターン
・ゲットしたポケモンは、そのときのトレーナーレベルを上限とした整数レベルとなる。強化を含めると.5といった小数のレベルは存在するが、ゲット直後は1~トレーナーレベルの整数となり.5レベルは存在しない?。全トレーナーレベルパターン

つまり、16^3×トレーナーレベル分のパターンを列挙すればいいことになります。トレーナーレベルが1なら全4096パターン、20なら81920パターン、上限である40なら163840パターンですね。こういうのはプログラムが強いです。

Rを使って列挙してみます。

cpmulti<-function(level)
{
idx<-(level-1)/0.5+1
return(c(0.094, 0.135137432, 0.16639787, 0.192650919, 0.21573247, 0.236572661, 0.25572005, 0.273530381, 0.29024988, 0.306057377, 0.3210876, 0.335445036, 0.34921268, 0.362457751, 0.37523559, 0.387592406, 0.39956728, 0.411193551, 0.42250001, 0.432926419, 0.44310755, 0.453059958, 0.46279839, 0.472336083, 0.48168495, 0.4908558, 0.49985844, 0.508701765, 0.51739395, 0.525942511, 0.53435433, 0.542635767, 0.55079269, 0.558830576, 0.56675452, 0.574569153, 0.58227891, 0.589887917, 0.59740001, 0.604818814, 0.61215729, 0.619399365, 0.62656713, 0.633644533, 0.64065295, 0.647576426, 0.65443563, 0.661214806, 0.667934, 0.674577537, 0.68116492, 0.687680648, 0.69414365, 0.700538673, 0.70688421, 0.713164996, 0.71939909, 0.725571552, 0.7317, 0.734741009, 0.73776948, 0.740785574, 0.74378943, 0.746781211, 0.74976104, 0.752729087, 0.75568551, 0.758630378, 0.76156384, 0.764486065, 0.76739717, 0.770297266, 0.7731865, 0.776064962, 0.77893275, 0.781790055, 0.78463697, 0.787473578, 0.79030001)[idx])
}

pokemons.create<-function(sv.hp, sv.atk, sv.def, trainerLevel)
{
n<-16*16*16*trainerLevel
idx<-seq(0,n-1)
#個体値の設定
atk<-floor((idx/trainerLevel/16/16) %% 16)
def<-floor((idx/trainerLevel/16) %% 16)
ivhp<-floor((idx/trainerLevel) %% 16)
level<-idx %% trainerLevel + 1
#CP計算
mult<-cpmulti(level)
cp<-(sv.atk + atk) * sqrt(sv.def + def) * sqrt(sv.hp + ivhp) * mult^2 / 10
#HP計算
hp<-mult*(sv.hp+ivhp)
#評価値
eval<-atk + def + ivhp

df<-data.frame(index=idx, iv.atk=atk, iv.def=def, iv.hp=ivhp, level=level, cp=cp, hp=hp, eval=eval)

return(df)
}


pokemons.createでポケモンの種族値(HP、攻撃力、防御力)とトレーナーレベルを与えればサクッと全パターン作ってくれます。例えばフシギダネ(種族値 HP90、攻撃126、防御126)でトレーナーレベル23として列挙すると、次のようなデータができます(多すぎるので初めの30行のみ表示)
20160805_1.png

・CPと個体値の関係をプロットしてみる
これでCPと評価値(個体値の3パラメーターの合計とする)の関係を見てみます。横軸にCP、縦軸に評価値を取ってみます。
20160805_2.png

ここでプロットを見て「あ、右側に個体値高い子が集まってる」と気づいた方は鋭い。CP別に個体値の断面図を取ってみましょう。
CP200~400の断面
20160805_3.png
1つ前の図の、個体値が高い子も低い子も密集しているエリアですね。ちょっと個体値ごとの出現頻度がわからないのですが、ズバッと一様乱数と仮定しちゃいましょう(実際は違うと思います)。この場合、評価値の平均は22.5付近ですね。これは0~15の平均7.5×3なのでまあその通りです。

CP550~750の断面
20160805_4.png
評価値の平均が25付近にシフトしているのが確認できるでしょうか?まあそこまで差が出ないといえばそうなのですが、極端にCPが高い子ほど個体値が高いという傾向があります

この部分のRスクリプト

#フシギダネの全パターン
husigidane<-pokemons.create(90,126,126,23)
#とりあえずプロット
plot(husigidane$cp, husigidane$eval, xlab="CP", ylab="評価値(個体値の合計)", main="フシギダネ トレーナーレベル=23")
#CP200~400の断面ヒストグラム
vals<-husigidane[husigidane$cp>=200 & husigidane$cp<=400,]$eval
hist(vals,breaks="Scott",xlab="評価値",ylab="頻度",main="CP200~400の断面ヒストグラム")
abline(v=mean(vals),col="red")
#CP550~750の断面ヒストグラム
vals<-husigidane[husigidane$cp>=550 & husigidane$cp<=750,]$eval
hist(vals,breaks="Scott",xlab="評価値",ylab="頻度",main="CP550~750の断面ヒストグラム")
abline(v=mean(vals),col="red")


・結局CPで厳選するってどーなの?
1.極端にCPが高い子ほど個体値が良い可能性が増える
CPの計算式からもこれは明らかです。

2.最低限、CPがポケモンレベル=トレーナーレベル+かつ個体値が全て0のときのポケモンのCP値を上回っていれば、この判定をしないときよりも強い子が発見しやすくなる
3つ前の図の右の赤い三角の部分です。具体的には、フシギダネかつトレーナーレベルが23なら、Pokemon Rater(https://thesilphroad.com/research)より、
20160805_5.png
個体値ALL0のときCPは最低値となるので、550とわかります。この値にこだわらなくても、極端にCPが高いほど強い子の可能性が高いです!

3.ベストな方法ではない。しかし、ベターな方法である。
個体値をいちいち調べて最強の子を選ぶのが100点とするなら、CPだけで判断するのは60点ぐらい(これは人によって異なるかもしれませんが)の方法。ぶっちゃけそこまで使わない子ならこの方法でもいいんじゃない?


改めて、
めんどくさかったらCPが高い子を選定(進化)させれば十分!

ということがわかりました(それだけ)。あるいは、初めて出会った子とか特別な場所で出会った子とか、思い入れのある子を進化させるのも良いかと思います。プレイスタイルは人それぞれです。

ポケモンGOのCP計算式のサーベイ

最近ハマってます。楽しいよね。

あとかなり技術的な内容が多いので、厳選とかそこらに興味がある人向け。7/29時点で検索から入手できた記事を元にサーベイしています。

[1] CPの計算式(日本語記事)
http://did2memo.net/2016/07/27/pokemon-go-kotaichi/#silph-road

ここに出てくる個体値はいわゆる厳選の対象になる値(例えば同じミニリュウでも異なる個体値を持つ)。防御基礎や攻撃基礎などは、おそらく種族値のことを指しているのかと思われます。種族値のデータについては日本語記事があり、

[2] 種族値のデータ(日本語記事)
http://game-senmu.com/%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3go%E3%80%80%E3%83%9D%E3%82%B1%E3%83%A2%E3%83%B3%E3%81%AE%E7%A8%AE%E6%97%8F%E5%80%A4/

[1]の最初のCPの計算式の記事は、もともと英語の分析ソースを参考にしていて元ネタはこちら(英語記事)
[3]
https://www.reddit.com/r/pokemongodev/comments/4t7xb4/exact_cp_formula_from_stats_and_cpm_and_an_update

ポケモンのレベル(ステータス画面で扇状になっているもので分度器等で測ったりする)よる係数の扱いがよくわからなかったので、追加で調べてみました。[3]のECpMの値については、こちらに示されています。(英語記事)
[4]
https://www.reddit.com/r/pokemongodev/comments/4t1zty/how_cpmultiplier_and_additionalcpmultiplier_work/


ECpMについては具体的な計算式や補正項がよくわからないので、現状定数で与える形になるかと思います。その点では、こちらの記事のほうがわかりやすいと思います。
[5] CP Multiplier by Level(英語記事)
http://pokemongo.gamepress.gg/cp-multiplier

いじょです!あんま個体値とか厳選とかこだわらないで「レアポケモンゲットだぜ!」ってやるのが楽しいと思うよ!
プロフィール

こしあん

Author:こしあん
(:3[____]
【TwitterID : koshian2】
【ほしい物リスト】http://goo.gl/bDtvG2

Twitter
カウンター
天気予報

-天気予報コム- -FC2-
カテゴリ
月別アーカイブ
最新記事
最新トラックバック
検索フォーム
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。