線形代数ライブラリの速度比較
C++ Advent Calender 2014 13日目の記事です.
最初はマイペースに作成している自作ライブラリ内で使用しているメタプログラミングに関する技術の解説を行おうと考えていましたが、この分野は他に詳しい方々が詳細なスライドや記事を作成してくださっているのと、時間の都合等々で断念しました.代わりに、Advent Calender 3日目の5mingame2さんの紹介にもあったEigenやboost.ublasといった線形代数ライブラリのコンテナ毎の速度比較結果をまとめます.
はじめに
vectorやmatrixを利用した線形代数の処理を行いたい場合、内積や行列の積といった基本的な処理は自分で容易に記述することができますが、LU分解やSVD等の自分で実装するのは少し気が引ける処理を利用したい際に、どこかに良い線形代数ライブラリが無いかな~と探すことと思います.この時、C++が好きな人は何よりもまず処理速度が気になることでしょう.そこで、今後このようなライブラリを利用したいという人の参考になれば幸いだと思い、稚拙ながら本記事を執筆します.
今回、調査対象のライブラリはC++では恐らく最も有名なEigenとublasという2つのライブラリです.これらは、有名なExpression Templateと呼ばれるメタプログラミング技法を利用して実装されており、これは計算した値が必要になる場面まで(計算式の)評価を遅延することで、普通に逐次評価する際に生じる一時変数を可能な限り無くして高速化をはかっています.ただし、コードの書き方によっては逆に速度が低下してしまうこともあるので注意が必要です(参考記事:Boost.uBLAS の遅延評価について).また、両ライブラリ共にヘッダオンリーで手軽に利用できる点もオススメできる理由です.
実験設定
ベクトルを表すコンテナ型、および行列を表すコンテナ型に対して、ある処理タスクを開始して終了するまでの処理時間を計測します.
処理時間の計測に関しては、1度の計測だけでは偶然の影響で本来のパフォーマンスが測れない場合を考慮し、タスク毎に100回の計測を行ってその平均と標準偏差を求めました.
また、ベクトルや行列の疎密による変化も調べるため、全体における非ゼロ要素の割合が10%の場合(スパース)と90%の場合(非スパース)とに分けて測定を行いました.
実行環境を以下に示します.
- コンパイラ: Visual Studio 2015 Preview (v140), GCC(g++4.9.2)
- ライブラリ: boost 1.57.0, Eigen 3.2.3
Visual StudioはNDEBUGを指定してReleaseビルド、GCCは-DNDEBUG -O3を指定してコンパイルを実行.
ベクトル型の比較
計測を行うコンテナは以下の8種類です.相対的な理解をしやすくするために、ベースラインとしてstd::vectorと(影の薄い)std::valarrayの計測も行います.
- std::vector
- std::valarray
- Eigen::VectorXd
- Eigen::SparseVector
- ublas::vector
- ublas::mapped_vector :内部実装に利用しているSTLのhash mapの性能に依存
- ublas::compressed_vector :ランダムアクセスに強く、構築と追加・削除に弱い
- ublas::coordinate_vector :追加・削除に強く、ランダムアクセスに弱い
この中で、Eigen::VectorXdとublas::vectorは特に密ベクトルと呼ばれ、一般的な配列と同じ構造をしています.一方、Eigen::SparseVector、ublas::mapped_vector、ublas::compressed_vector、ublas::coordinate_vectorは疎ベクトルと呼ばれ、値が存在する要素(非ゼロ要素)のみを保持した構造となっています.このため、大規模で欠損値の多いデータセット(推薦分野での評価値行列、グラフの隣接行列など)に対してはメモリ消費を大幅に抑えることができます.
実行するタスクは次の3種類です.
行列型の比較
計測を行うコンテナは以下の6種類です.
- Eigen::MatrixXd;
- Eigen::SparseMatrix
; - ublas::matrix
; - ublas::mapped_matrix
; - ublas::compressed_matrix
; - ublas::coordinate_matrix
;
ベクトルの場合と同様に、Eigen::MatrixXdとublas::matrixが密行列、残りが疎行列となっています.
実行するタスクは次の3種類です.
- ランダムアクセス :任意の行・列へのアクセス(1万回)
- 積 :行列同士の積(100×100行列)
- LU分解 :与えられた行列を2つの三角行列に分解.逆行列や連立方程式の解を求める際に利用される手法の一種
ただし、LU分解に関してはublasの疎行列には対応していないようでした.また、Visual Studio環境ではEigenのコンパイルが上手くいかず断念しました.
実験結果
以下の表の見方としては、各セルの値は [非スパース] / [スパース] を表しており、左側の数値が処理時間の平均値、()内が100回の計測値の標準偏差を表しています.表1,3がVisual Studioでの結果、表2,4にGCCでの結果です.(ただし、GCCの計測は仮想マシン(Ubuntu)上で行っているため、Visual Studioとの単純な性能比較はあまり意味が無いことに留意)
[表1:result of vector (Visual Studio)]
ランダムアクセス (μs) | イテレーション (ns) | 内積 (ns) | |
---|---|---|---|
std::vector | 518.8(10.27) / 517.7(9.60) | 74.33(110.1) / 78.29(131.8) | 72.84(137.1) / 56.28(124.3) |
std::valarray | 505.4(18.39) / 508.2(12.65) | 32.41(90.18) / 33.15(94.30) | 33.37(114.9) / 36.41(103.7) |
Eigen::VectorXd | 506.4(10.92) / 506.9(7.66) | 28.54(80.06) / 29.7(87.85) | 26.18(84.49) / 28.4(93.5) |
Eigen::SparseVector | 1208(27.7) / 1070(11.39) | 29.93(87.0) / 26.48(89.79) | 36.35(114.8) / 36.34(114.8) |
ublas::vector | 506.5(12.02) / 507.5(6.21) | 59936(5049) / 59861(4759) | 32.10(98.3) / 34.86(108.6) |
ublas::mapped_vector | 1669(14.34) / 1127(16.84) | 874166(130327) / 191085(12161) | 888374(135080) / 194833(14858) |
ublas::compressed_vector | 507(9.16) / 506(5.78) | 53120(737.7) / 5999(216.0) | 72245(2093) / 9383(1205) |
ublas::coordinate_vector | 1446(18.99) / 1256(11.60) | 54020(9105) / 6122(912.2) | 73304(10612) / 9367(927.4) |
ランダムアクセス (μs) | イテレーション (ns) | 内積 (ns) | |
---|---|---|---|
std::vector | 158.0(45.79) / 155.2(41.64) | 94.43(26.94) / 93.47(26.20) | 282.4(133.5) / 238.0(119.8) |
std::valarray | 164.8(55.07) / 147.0(24.50) | 26.72(3.81) / 27.66(3.29) | 159.7(69.96) / 147.4(56.49) |
Eigen::VectorXd | 168.5(66.26) / 148.5(28.11) | 28.6(4.16) / 30.44(4.52) | 160.3(69.66) / 168.3(75.14) |
Eigen::SparseVector | 1180(378.7) / 856.0(167.0) | 33.46(2.76) / 30.08(2.42) | 160.2(69.31) / 147.4(55.19) |
ublas::vector | 161.4(58.08) / 148.4(31.79) | 26.99(5.78) / 27.16(2.20) | 159.8(70.19) / 144.9(49.50) |
ublas::mapped_vector | 1612(889.5) / 735.3(126.9) | 890425(252637) / 93699(19464) | 1872770(695327) / 700327(224015) |
ublas::compressed_vector | 1187(403.1) / 875.3(196.1) | 181.6(54.17) / 143.2(47.26) | 173815(69871) / 16222(7674) |
ublas::coordinate_vector | 1201(366.0) / 874.4(139.4) | 1055(9226) / 187.2(987.9) | 160998(70554) / 17240(13653) |
ベクトルの結果を見ると、Eigen::VectorXdとstd::valarrayが全体的に良く、std::vectorもそれに続く性能があり、ublas::vectorはイテレーションが必要な処理が遅いことが分かります.ubalsに関しては、疎ベクトルも含め最適化が上手く働いていないせい?か非常に遅い結果となりました(もし上述したコンパイラオプション以外にも何か最適化に影響するものを知っている方がいればご教授ください).また、内積の結果を見ると標準偏差が他のタスクに比べて大きく、同じタスクでも処理時間のバラつきが大きいことが見て取れます.
[表3:result of matrix (Visual Studio)]
ランダムアクセス (μs) | 積 (μs) | |
---|---|---|
Eigen::MatrixXd | 976.1(43.87) / 940.3(8.08) | 195.0(17.01) / 187.8(13.18) |
Eigen::SparseMatrix | 1479(70.52) / 1244(12.47) | 1634(44.96) / 144.7(8.88) |
ublas::matrix | 964.2(47.21) /930.1(12.97) | 994.1(23.09) / 978.8(18.10) |
ublas::mapped_matrix | 2303(110.7) / 1706(10.47) | 158780(867.0) / 63955(456.3) |
ublas::compressed_matrix | 964.2(47.49) / 927.7(7.55) | 46028(392.8) / 18441(202.6) |
ublas::coordinate_matrix | 2581(119.0) / 1982(8.77) | 157322(1168) / 87679(657.5) |
[表4:result of matrix (GCC)]
ランダムアクセス (μs) | 積 (μs) | LU分解 (μs) | |
---|---|---|---|
Eigen::MatrixXd | 452.3(127.3) / 443.7(72.73) | 198.7(17.19) / 196.8(9.77) | 151(10.86) / 150.5(5.86) |
Eigen::SparseMatrix | 841.6(19.21) / 675.5(9.89) | 1625(53.3) / 156.4(11.94) | 578.0(18.53) / 484.7(10.59) |
ublas::matrix | 441.4(19.02) / 458.5(148.1) | 862.9(33.57) / 854.9(37.72) | 216.6(8.11) / 212.8(4.83) |
ublas::mapped_matrix | 1642(126.9) / 1042(161.1) | 141289(1145) / 61621(553.4) | - |
ublas::compressed_matrix | 927.1(40.22) / 713.9(15.07) | 31976(680.0) / 15285(264.8) | - |
ublas::coordinate_matrix | 1750(40.09) / 1346(28.33) | 102352(1322) / 15285(264.8) | - |
行列の結果もベクトルの結果と同様にEigen::matrixが全体的に優れた結果となりました.Eigen::SparseMatrixに関しては、行列の積の結果を見るとスパースなデータに対しては密なEigen::MatrixXdを越える性能が見られました.
追記
@TAIYAKI926さんのコメントで「#define BOOST_UBLAS_NDEBUG」というublasの最適化オプションがあるようなので、これを適用したものに修正しました.また、Eigenのバージョンも3.2.3に更新して再度実験を行いました.
変更後の顕著な変化としましては、mapped_matrixのランダムアクセス(非スパース)がVisualStudioで2267800μs→2303μs、GCCで1459870μs→1642μsに大幅改善されました(スパースも同様に改善).
まとめ
- 基本的にEigenを使えば問題ない
- 疎ベクトル・疎行列に特化したコンテナは、密ベクトル・密行列に比べ、データが密な場合は速度が2倍程落ち、疎な場合は同等以上の速度である
- 影が薄いstd::valarrayが予想以上にデキる子だった
今回、実験に使用したコードはgithubで公開しています.
明日14日目はlapis_twさんです.よろしくお願いいたします.
ピカチュウ大会チュウ(ロリプル)参戦記録
たまたまTwitterのタイムラインで目にした、ポケモンの公式インターネット大会「ピカチュウ大会チュウ」に参加した。この大会の特徴は、
というかなり限定されたポケモンしか使えないルールで、普段使われないポケモンが用いられるため事前に対戦環境が分からない大会だった。この対戦環境が未知という点が個人的には興味を引き、シーズン1以来のガチ勢復帰を果たすこととなった。(.sigure// on Twitter: "シーズン1のレート成績 http://t.co/9jPHNFmMs1")
今回の大会では、メインロムとサブロムで2つパーティーを作成した。
メインロムの方は高火力・高耐久を意識したトリックルームと両壁のサポートで各個撃破していくパーティー、サブロムの方はプラズマボム(何より意表が突ける 【全国トリプル】プラズマボム滅び)+雨しおふきスイッチというトリプルバトルらしいコンボを決めていくパーティーとなった。
以降では、各ポケモンの調整や運用方法について説明していく。なお努力値振りに関しては、ダメージ計算機で仮想敵とのシミュレーションを行いつつ、自作ツールで可能な限り無駄がない配分になるよう調整した。
高火力・高耐久パーティー
戦績:26勝 4敗
最終レート:1774
ランキング:7位(6位タイ)
元論者の我が最初に構築したロリプル用パーティーですなwww(以下、ロジカル語法は割愛)
トリル無し状態では、高耐久により縛り関係を崩し(確定で倒されないようにする)、高火力の反撃で相手を各個撃破していく。トリル時は、下から高火力で無双していく。ただし、トリル貼るまではひるみに滅法弱い。(加えてプレーヤーのトリプルバトルのスキル不足により、序盤のミスで崩壊することがあった)
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
ピカチュウ | おくびょう | ひらいしん | でんきだま | 2660 | 3080 |
技名 | ほうでん | めざめるパワー | くさむすび | ねこだまし |
---|---|---|---|---|
タイプ | 電 | 氷 | 草 | 普 |
火力指数 | 11340 | 7560 | 3760 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 252 | 252 | ||||
実数値 | 70 | 47 | 38 | 63 | 44 | 95 |
どのパーティーにも必ずいる今大会のトップメタ。役割はズバリ初手で相手をひるませること。もしくは、事前に予測していたサイドン・ガバイト等の地面勢を上から倒すことを想定。放電は相手に避雷針がいる状態でも飛行や水を狩るために搭載。そして、トリルが貼れた場合にはすみやかに倒されて配置の中央を次に譲るという完全な捨て駒要員。(正直、これ以外の用途がry)
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
シュシュプ | れいせい | アロマベール | せいれいプレート | 5900 | 6000 |
技名 | ムーンフォース | サイコキネシス | トリックルーム | まもる |
---|---|---|---|---|
タイプ | 妖 | 超 | ||
火力指数 | 13167 | 6930 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 52 | 116 | 244 | 92 | ||
実数値 | 100 | 59 | 77 | 60 | 18 |
初手選出で、隙を見てトリルを貼った後は特殊アタッカーとして運用。耐久指数に関しては、ほぼピカチュウ2体分で中々硬い。フレンドガード込みで、補正なしゴーストのヘドロばくだん、補正ありニダンギルのアイアンヘッドを確定で耐える。火力指数に関しては、最低限のラインは満たしておりムーンフォースは補正なし珠ゲコガシラの悪の波動程度である。また特性が非常に優秀で、自身のトリルだけでなくサポート役のプリンの壁貼りも安定して行えた。
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
プリン | のんき | フレンドガード | たべのこし | 5782 | 5664 |
技名 | リフレクター | ひかりのかべ | いやしのはどう | まもる |
---|---|---|---|---|
タイプ | ||||
火力指数 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 252 | 252 | ||||
実数値 | 118 | 49 | 48 | 17 |
パーティーの守護神。初手で落とされないよう気をつけ、トリル後は順番に壁を張り、その後は味方の回復に専念する。シュシュプとの相性が非常に良く、初手で両サイドにペアで選出することが多かった。
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
パールル | れいせい | シェルアーマー | しんかいのキバ | 5661 | 4355 |
技名 | なみのり | ねっとう | れいとうビーム | まもる |
---|---|---|---|---|
タイプ | 水 | 水 | 氷 | |
火力指数 | 16968 | 20160 | 15120 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 224 | 244 | 36 | |||
実数値 | 87 | 65 | 84 | 50 | 21 |
ロリプルの破壊神A。火力指数に関しては十分であり、全体・単体攻撃を使い分けられる点が非常に強かった。耐久指数に関しては特殊面が結構脆いが、フレンドガード状態では補正ありダブランのエナジーボールも高乱数で耐える。
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
ドテッコツ | いじっぱり | こんじょう | かえんだま | 7931 | 5047 |
技名 | ドレインパンチ | マッハパンチ | なげつける | ワイドガード |
---|---|---|---|---|
タイプ | 闘 | 闘 | 悪 | |
火力指数(根性発動時) | 17640 | 9450 | 4725 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 36 | 252 | 156 | 64 | ||
実数値 | 103 | 105 | 77 | 49 | 32 |
第5世代の覇者であるブシンのJr。ドレパンにより、フレンドガードと壁がある状態では不沈艦と化す。先制技の威力も十分あり、ニダンギルには火炎球を投げつけて無力化できる。物理耐久指数が結構高く、素の状態でも補正なしストライクの燕返しは確定耐え、補正ありヒノヤコマのアクロバットは超低乱数で落ちる程度。フレンドガードや壁があると物理ではまず落ちない。ワイドガードは、味方のパールルの波乗りとの兼ね合いの面でも便利だが、まもるが欲しい場面も多々あった。
ポケモン | 性格 | 特性 | 持ち物 | 物理耐久指数 | 特殊耐久指数 |
---|---|---|---|---|---|
ゴンベ | ゆうかん | あついしぼう | シルフのスカーフ | 6090 | 9425 |
技名 | すてみタックル | からげんき | いわなだれ | まもる |
---|---|---|---|---|
タイプ | 普 | 普 | 岩 | |
火力指数 | 19872 | 23184 | 5152 |
H | A | B | C | D | S | |
---|---|---|---|---|---|---|
努力値 | 196 | 252 | 60 | |||
実数値 | 145 | 92 | 42 | 29 | 65 | 14 |
ロリプルの破壊神B。すてみタックルの火力指数は2万近くあり、状態異常時の空元気はそれを更に上回る。特殊耐久指数は非常に高く、特性も合わせて吹雪や熱風ではビクともしない(フレガと壁込みだと、ランプラーやムチュールでもHPを1割さえ削れない)。命の珠を持たせるべきか悩んだが、岩雪崩にそこまで火力は必要ないと判断してので、耐久を温存しつつ一致技の威力を高めることにした。モーションが非常にかわいい点もGOOD!
プラズマボム+雨しおふきパーティー
戦績:17勝 10敗 9爆散四散
最終レート:1600ちょい
トリプルバトルらしいパーティーを作ってみたいと思い、調べていると素敵な爆発パ(何より意表が突ける 【全国トリプル】プラズマボム滅び)に巡り合ってしまったため、これをリスペクトして構築。滅びパは対策されるだろうなーと思っていたので、代わりに雨スイッチにしてみた。運用してみた感想としては、コンボを決めるのってスゴく難しい!
大した構築ではないので簡単に紹介。
ポケモン | 性格 | 特性 | 持ち物 | 技1 | 技2 | 技3 | 技4 | 努力値振り |
---|---|---|---|---|---|---|---|---|
ピカチュウ | おくびょう | ひらいしん | でんきだま | 10万ボルト | めざめるパワー(氷) | ねこだまし | フェイント | CS252 |
チョンチー | ひかえめ | ちくでん | シュカのみ | ねっとう | れいとうビーム | プラズマシャワー | まもる | B252 C228 D8 S20 |
レアコイル | いじっぱり | がんじょう | じしゃく | だいばくはつ | リフレクター | ひかりのかべ | まもる | AS252 |
ヤミカラス | むじゃき | いたずらごころ | いのちのたま | ブレイブバード | あくのはどう | あまごい | まもる | S244 C196 A36 B20 D8 |
カメール | おくびょう | げきりゅう | こだわりスカーフ | しおふき | なみのり | ねっとう | れいとうビーム | C252 S212 H44 |
ドテッコツ | いじっぱり | てつのこぶし | こぶしプレート | ドレインパンチ | マッハパンチ | いわなだれ | ワイドガード | A252 B156 D64 H36 |
プラズマボムの成功回数が8/27(+素の爆発1回)とすこぶる悪かったのは、プレイヤーのトリプルバトルのスキル不足が大きかった。壁を貼ろうと欲をかいて爆発できずに倒されることも多々あった。あと、チョンチーは図太いHBで良かった気がする。ちなみに、プラズマシャワー状態でのレアコイルの大爆発の火力指数は25275。
院試 -KO- 完勝 PERFECT
タイトルは昔の迷作STGから。実際の所、残機ギリギリでの勝利でした。路頭に迷わなくてよかった。
そして突然だけど、院試期間中にプログラミングに飢えて一晩で作成した、ソートアルゴリズムの動作をコンソールウインドウで可視化しするソースを公開。もちろん各ソートの性能比較もできます。
バブルソート、選択ソート、挿入ソート、シェルソート、クイックソート(再帰呼び出し、スタック管理)、マージソート(配列、連結リスト)、ヒープソートを実装。
【使い方】
- リンク先の青色領域をクリックしてDLページへ。「viewable_sort_in_console.cpp」をクリックしてダウンロード。
- VisualC++などのC/C++IDEでファイルを開く。
- ソーステキスト内の一番上にある「オプション」内の項目の値(#define 項目名 値)を色々変更してみる。最初は何も触らずそのままでもOK。
- コンパイルを実行して動作を見る。
【コンソール画面の見方】
[ 非アニメーションモード ]
- 「処理時間、比較回数、交換回数、関数の呼び出し回数」を各ソート毎に表示。要素数を1万くらいにすると顕著な差が見られる。
[ アニメーションモード ]
Popular J-HOUSE Mix [0x06]
GWは毎日「自室警備」という予定で一杯な.sigure//です。
警備の副業でC++や研究室で使うということで勉強中のJavaのプログラミングをしつつ、さらに気分転換で作りかけのMIXを完成させました。
今回のMIXは、ハウス系統の有名どころを繋いだものです。ハウスはあまり詳しくないので好きな曲を選んだらこうなりました。
全体的に聴きやすく、BGMに最適な感じに仕上がったように思いますのでどうぞご視聴あれ。
- 01 Introduction / Studio Apartment
- 02 FIND MY WAY (MYDJBOOTH Edit.) / DAISHI DANCE Feat. blanc.
- 03 Heaven In The Sky (MAKAI Nowhere Mix) / Mary
- 04 Rise Over (Original Extended) / NATSUYO feat. Alexandra Prince
- 05 Planetarium. (Unreleased 20091228 Remix) / DAISHI DANCE
- 06 I WANT U 2 MOVE / Studio Apartment Feat. Mr.V
- 07 SAX@ARENA / DAISHI DANCE x SHINJI TAKEDA
- 08 Garden(CLASSIC HOUSE ANTHEM)-English ver.- / May J.×DAISHI DANCE
TECH / HARD DANCE MIX [0x05]
珍しく土日に暇ができたので、夏休みに前半だけ作って放置していたTECH DANCE MIXを完成させてみた。
このジャンルを知ってからまだ日が浅いため選曲が結構偏ってます。中盤のアクセントにHARD DANCEを加えてみて良い感じに流れの転換ができたものの、TECH DANCE オンリーな内容じゃなくなってタイトルをどうつけるか少し困ったり。(正直、この2つはみかんとオレンジ程度の違いだと思うんだが)
- 01 一回性二階席 〜STRAIGHT〜 (Original Mix) / DJ TECHNORCH
- 02 Tube (Original Mix) / George-S
- 03 DA GEAR (Original Mix) / George-S
- 04 NEVER END (Reloop Remix) / Yoji Biomehanika
- 05 Mach 2 (Shuse & Ryoji Takahashi Remix) / Organ Donors
- 06 Vicious Rumors (Nish Remix) /Groovetune
- 07 Nights Of Tribal Drums#6 (Remo-con RMX) / Groovetune
- 08 Shine on(Groovetune Remix) / Hsmt
ヤケモンは強いがヤーティが弱いのは何故なのか?
【まちかね祭】11/4、11/5はマチカネジムリーグと称してジムリーダー戦を行います!ジムリーダーに勝ったらうまい棒プレゼント!水電鋼龍飛超霊氷地面の9タイプ、ルールはシングル6-3です。11/6はトーナメント戦を行います!
非常に行きたいが…4,5は行けないなあ。我が偽装砂ヤーティは通用するのだろうか。久しぶりにフリーに潜った所、17戦13勝で敗因はガッサやグライ(+きせきラッキー)のポイヒコンビ。役割論理はガチでこいつらに弱いわ。せめて挑発が5ターンくらい持続してくれればうちのクロバットが更に輝くというのに。そして、クロバの追風と毒玉ヘラの組み合わせは決まったら強すぎる。
ちなみに、
【役割論理】は交替戦を意識してダメージレースを有利にすることを主眼にした戦法。相手の攻撃はなるべく半減以下で受け、こちらの攻撃は例え相手に半減で受けられても半分近く削れるように威力重視(こだわり系アイテムなど)で行う。不利な相手にはどうせ交代するのだから、こだわり系アイテムでも問題ないという考え。また、同様の思考から積み技などの補助技も非推奨。そして、交代先に攻撃するのだから素早ささえもどうでもいいという少し吹っ切れた戦法。
6-3ルールのポケモンは、先に1匹戦闘不能になった方が不利になるため、これをどう実現するかがポイントとなる。先述からの【役割論理】では、高火力で相手に大きな負荷を蓄積させ続けることでこれを実現しようとしており、名前は似ているが全く別の【役割理論】では”役割破壊”によりこれを実現しようとしている。
ここで言う”役割破壊”とは、例えばピカチュウを使っている時に、相手が電気を無向にするグライガー(地面・飛行)を交代で出してきた場面で、本来ならピカチュウはもう役立たずになるはずのところを、もしピカチュウが「めざめるパワー氷」を覚えていたらグライガーを一撃で倒せてしまう。こういう本来の相性関係を破るような事を”役割破壊”と呼ぶ。方法はこれ以外にも様々ある(先制技やこだわりスカーフでの行動順逆転など)。
以上のことをふまえて、役割論理の良い点と役割破壊を組み合わせれば強いんじゃね?ということで作ったのが今の「速い奴を加えた半ヤーティ」だったりする。スカーフバンギなどはその典型で、純粋なヤーティーと見せかけたパーティーとプレイングで相手にスカーフだと悟らせなければ、いい場面で会心の一撃が刺さって相手のサイクル崩壊を狙える。確かにうまくフェイクできれば実際強い…が、対策必須な悪質コンボ(まもみが無限系)には全くの無力である。パルシェンでも入れようかなもう。まあレーティングじゃないからそこまでは気にしない。
【追記】
フリーでは結構仕事をしてくれる俺の嫁のクロバットや、パーティー補完用の両刀襷ガブリアス、生まれながらのヤケモンであるヤドランの育成論はこちらを参照。