toMUGEN ( フォント環境:MS ゴシック 標準 サイズ10 )   AIの 超反応についての話 byADI ( Momentary Reaction 瞬間の反応 ) 17:38 2009/09/22 眠い 22:19 2010/04/19 書き直し始め 01:06 2010/04/20 書き直し終わり 09:26 2010/04/20 当初書きたいと思っていたことを思い出す 9:11 2010/04/30 フレ 11:06 2010/05/19 追記  「それらはなんら不思議でもない、   プログラム上の【処理】である。」  ※魅せ、などを前提とした話です。  ■超反応の概要  超反応。超越した反応。超人的な反応。  状態を示すと「視認からでは困難な反応速度」などを指す。  人が反応し対応をする場合、予測していても大抵ワンテンポ、   予測をしておかなければワンテンポ以上遅れてしまう。  それは視認から認識と認識から入力までに時間が掛かるためで、   そうした反応の限界速度はおよそ0.1秒と言われ、   入力に時間が掛かればより多くの時間が掛かってしまう。  ちなみに短距離走では0.1秒以下の反応をするとフライング扱いだ。  しかし動作を見て覚え、その動作から何をするのかを予測すれば   ほぼ同時に出すことも不可能ではないのだが、   同時に出ても予想、読みが当たっていたからである。  それを反応と呼べるかどうかはやや疑問になるが、   その読みがあまりにも正確である場合は超反応とも呼ばれる。  あくまで成功率が高ければだが。  ■AIにおける超反応  AIは人間と処理が全く異なる。  AIは与えられた情報を処理フレーム(*1)ごとに   条件が合致しているかどうかを確認して   合致していた場合に命令し、動作を行わせる形である。  人間は最短とされる反応でも6F(0.1秒)以上かかり、   普通の人は認識に6〜12F程度、入力には6F以上かかってしまう。  だがAIは認識に0F〜1F、入力は0Fであるため、   反応まで時間がわずか0Fから1Fという「超反応」ができるのだ。  しかも、処理は「決められた条件が一致した時」行われるため、   遅延処理の条件式を加えなければ超反応するのが基本なのだ。  もちろん条件が合致しなければ行動を起こさない為、   危険な動作を超反応でしないようにすることもできる。  と言うより、させてしまっていることも多い。 (*1フレーム:処理単位。処理の1周分のこと。略称〜フレ、〜F。   通常約1秒間に60周分し、秒60コマの映像を映し出すので、    それを人間は動いている・動かしていると錯覚する。 )  ■反応速度の極限・0F反応  0フレームで反応することができるのは   そのフレーム中で後のほうに処理を行うAI。  処理は「基本処理 →1P→2P→(3P→4P→)その他→ 次F」の順。  そのため1Pよりも後に処理をする2PのAIは、   1Pの処理の情報を確認しながら条件の確認と命令ができ、   結果同じフレーム中で反応を起こす0F反応が可能なのだ。  反対に言えば1Pは最も初めに処理を行う為、   同じフレーム中の相手の情報を得ることはできず、   条件の確認に使える相手の情報は1フレーム前のものまでである。  Helperでは他プレイヤーの情報を同じフレームで得ることはできるが、   それを処理に反映させることは困難かつ危険で、   早い話が安全にできないため、してはいけないと言ったほうがいい。  そのため1P側は1F反応が限界で2P側は0F反応ができてしまう、   そうした1Pと2Pとの差が最初からあるのだ。  ■超反応の威力と脅威 そして弊害 >参考動画(動画で紹介している超反応の状態) http://www.nicovideo.jp/watch/sm7206992 ;0,Time(0F)反応について http://www.nicovideo.jp/watch/sm10406813;途中の1P2P差について  超反応は発生無敵の技や発生の早い技において驚異的な威力を発揮する。  簡潔に言うと「相手の攻撃を待って無敵のある技で潰す」という   単純な動作だけで勝ててしまいかねない。人が相手でなければだが。  特に 発生1Fの攻撃 へ 1F目から無敵 等を使おうとさせると、   1Pでは反応が1F遅れるため回避することはできず、   2Pでは反応が0Fのため回避してしまうことができるなど、   1Pと2Pとの処理の差が決定的に出てくる。  もちろん発生1Fなんて技は通常のキャラだと投げ程度しかないが、   2P側は発生1Fの投げを確実に使えてしまうということなのである。  分かりやすい話が以下の三つを守って作れば   「遠距離から潰されないよう攻撃をする」   「近距離では2P側投げ以外の先攻攻撃をしない」   「相手が攻撃をしてきたら無敵などで回避するか潰すか」   大抵のAIに勝ててしまいかねない、勝つだけのAIができる。  だがそれは戦って楽しいか、戦いを見ていて楽しいかといえば疑問が残る。  まず強力な動作を有していても単純だと、   単純なことしかしないため超反応が楽しくとも飽きやすい。  その上キャラクターと技自体の性能や相性が顕著化し、   特定の相手に勝てるが特定の相手に負けることも多くなる。  理不尽なまでに一方的な展開は見ていて飽きるし、   一方的にやられたらよほどのゲーマーでなければ楽しくもない。  また単一の動作は対人(Anti-Player)として最悪で   弱点さえ分かってしまえば簡単に倒せてもしまいかねない。  そういった理由から最近は超反応を抑制している、   もしくは超反応を抑制させることのできるAIが多い。  ■超反応の抑制と遅延  超反応の抑制の目的は単純で一方的な展開を減らすことや、   超反応をすることによって起こりうる隙を減らすことで、   基本的には「相手の攻撃に対する反撃・回避」が対象とされる。  前者は自分の有利を放棄しあくまでも「魅せ」を目的としているが、   後者は自分の不利を減らし安定して戦うことを目的としている。  砕いて言えば、良いパターンを減らしつつ悪いパターンを減らすのだ。  方法として単純なものはTimeやEnemyNear,Time、超低確率のRandom、   複雑なものとしてはVarを用いてフレーム数を数えるということなど、   AI制作者によって工夫が凝らされていることもある。  もちろん、超反応そのものが悪いのではなく、   単純な超反応によって一方的な展開が発生したり、   無闇な行動で生まれた隙をつかれて負けるといった   目に見えた弊害が面白みを殺ぐのである。  ごく限られたタイミングで適度な確率であったり、   わざとつたない動作をさせつつそこへ紛れ込ませたり、   そうしたバランスを考慮した工夫があるのならば、   人間のような読みにも見せられ、超反応とすら認識しづらくできる。  そうすれば見ている側としても満を持しての反応に見えたりするのだ。  ■行動における潜在超反応  だが「攻撃に対する反撃・回避」以外にも超反応は起こる。  例えば基本動作全てに「相手が攻撃中でない」という条件がある場合、   相手が攻撃動作に入った時から基本動作を一切しなくなるという、   超反応の危機回避を行っていることになるのだ。  そうなると安全に防御や反撃へ転ずることもでき、極めて堅実になる。  早い話、P2StateTypeやEnemyNear,Movetype、Enemy,Vel Xなど   相手の情報を用いること自体が超反応を起こす要因なのであって、   「超反応をさせない」場合はそれらも抑制や遅延することになるのだ。  だが、そうした超反応は目に見えた弊害が少ないため、   問題視させることも少なく多少変であっても気にされにくい。  もちろん相手が空中になった瞬間対地上投げをしなくなり、   相手が地上になった瞬間対地上投げをするというような、   確実すぎる攻撃は弊害を生みやすいため注意する必要はある。  ■  ■  ■遅延の人間的視点からの例  Timeの数値はそのステート(動作)に入ってからの経過フレーム数で、   自分のTimeは[待ち]の数値、相手のTimeは[認識]の数値と言えるため、   どちらかではなくどちらも条件へ取り入れるほうが   「待ち状態から×相手の行動を確認してから」の両方に対応する形で、   「人間らしい」感じになるだろう。 一例  やや早め Time * EnemyNear,Time > 36 ( 1:36 2:18 3:12 4:9 6:6 より上 )  やや遅め Time * EnemyNear,Time >144  ( 1:144 2:72 3:48 4:36 6:24 8:18 9:16 12:12 より上 )  またRandomによって低確率にする場合は、   毎フレームの確率であることを覚えておかないといけない。  例えば( Random<500 )の条件は50%だが、毎フレーム50%であり、   2F目までに発生確率は75%、3Fまで87.5%、7Fも経てば99%である。  もっと低くしていくと  Random < 400 6F 95.33% 18F 99.99% 30F100.00%  Random < 100 6F 46.86% 18F 84.99% 30F 95.76%  Random < 50  6F 26.49% 18F 60.28% 30F 78.54%  Random < 10  6F 5.85% 18F 16.55% 30F 26.03%  Random < 1  6F 0.50% 18F 1.78% 30F 2.96%  と言った確率になり遅延処理としての役割を明確に果たせるのは   50以下くらいからであり、注意しておくべきである。  ■コマンド入力が無いことによる弊害と対処  また超反応とは異なるが、AIは設定しておかないと   人には不可能な状態から行動をすることもよくある。  それを問題視するかどうかも、微妙な点ではあるが。  例えば、ガードが操作さえできるならいついかなる時でもできる点で、   前へ歩きながら瞬時にガードしたり、前へジャンプした直後からガードしたり、   空中前ダッシュをした直後にガードをしたりしてしまうこともある。  これらを制限する方法としては、それらの動作始動時にVarをセットし、   それを減算していくことで0.数秒間はガードできないようにするなど。  またガードに限らず入力速度と性能に難を感じた場合、   TimeやVarなどによって間髪をいれない動作へ制限をかけることもある。 ■  ■余談 私のフレームの数え方について  私は最初を1F目から数え始めます。システムのTimeは0,Timeから数えます。  0Fと言うのは「無い」というイメージなので、   直後フレーム発生を0F発生とは呼ばず1F発生か発生まで0Fと呼びます。  もしくは0,Time(Time=0)発生とも。