バトルドロヌンは完党にあなたのものです。 戊略の列挙によりゲヌムAIをトレヌニングしたす

「 戊略の分野で怜玢する 」ずいう蚘事を続けたす。 AIドラむバヌ 。」 戊闘ゲヌムのゞャンルのミニゲヌムを䜜成したした。このゲヌムでは、蚓緎を受けたAIが他の手曞きボットず戊い、詊行錯誀によっお勝利戊略を開発したす。
このゲヌムでは、2人の男がこのように戊っおいたす。



それらは座暙軞䞊にあり、ある皋床のヘルスリザヌブがあり、「クヌルダりン」パラメヌタヌもありたす。 クヌルダりン-これは、ファむタヌがこのアクションを実行したために逃すバヌの数です。 たずえば、アクション「go」はクヌルダりン2を匕き起こし、アクション「stab」はクヌルダりン4を匕き起こしたす。クヌルダりンがれロになったずきにのみ動䜜できたすれロに等しくない堎合は1単䜍枛少したす。

そのため、2人の戊闘機がいたす。 それぞれに座暙、ヘルス、クヌルダりンがありたす



各ファむタヌは、自分の順番で6぀のアクションのいずれかを実行できたす。

11で右に進みたすクヌルダりン2を呌び出したす
21で巊に移動したすクヌルダりン2を呌び出したす
3埅機クヌルダりン1を呌び出したす
4ナむフストラむククヌルダりン4を匕き起こす。敵たでの距離が1以䞋の堎合、20のダメヌゞを䞎える
5クロスボりショットクヌルダりン10を匕き起こす;最倧5セルのダメヌゞを䞎える;最倧12セルの4ダメヌゞを䞎える
6䞭毒クヌルダりン10を匕き起こしたす。最倧8セルの距離で2぀のダメヌゞず毒を䞎えたす。毒された敵は毎タヌン1銬力を倱いたす。䞭毒は戊闘終了たで続き、2回毒するこずはできたせん

入り口で、各戊闘機は次の情報を受け取りたす。x、hp、および状態は毒されおおり、自分ず盞手に぀いお毒されおいたせん。 さらに、敵のクヌルダりン倀が到着したす。 出力では、各戊略は1から6たでの数字を䞎えたす。

ニュヌラルネットワヌクが戊略を実装する堎合、6぀の数倀を生成したす。各数倀は、「私が望む限り、そのようなオプションを実装する」こずを意味したす。 たずえば、ニュヌラルネットワヌクが0 0 1 0 -1 0を生成した堎合、シヌケンスの3番目の芁玠の倀が最も倧きいため、アクション3を遞択するこずを意味したす。

1぀の戊闘は70ティック続きたすたたは、これが早く発生した堎合、ある戊闘機が別の戊闘機を殺すたで。 70小節は7ショットたたは35ステップです。

AIファむタヌの品質指暙を決定したす。 1回の戊闘でのニュヌラルネットワヌクのゲヌムの品質= -100-どれだけの䜓力を倱ったか+敵が䜓力をどれだけ倱ったかを想定しおいたす。 私のオプティマむザヌは負の倀のみを最倧化するため、100未満が必芁です。
q = -100-入力3-単䜍1.hp+入力4-単䜍2.hp;

この戊略のパラメヌタヌは、ニュヌラルネットワヌクの重みずシフトです-AIのテストは次のずおりです重みのセットがニュヌラルネットワヌクに読み蟌たれ、このニュヌラルネットワヌクはしばらくの間敵ず戊っおから、品質評䟡を受け取りたす。 オプティマむザヌは、結果の品質を分析し、新しい重みのセットを生成しおそらく最高の品質を提䟛したす、サむクルを繰り返したす。

このゲヌムの重芁な芁玠は、ニュヌラルネットワヌクの係数に察する品質メトリックの段階的な䟝存性です。



なぜそう ニュヌラルネットワヌクが次の出力ベクトルを生成したずしたしょう0 0 1 0 00。そしお、1぀のパラメヌタヌをわずかに倉曎したした。 そしお、次のような出力ベクトルを埗たした0 0 0.9 0 00。たたは0.1 -0.1 0.9 0 0 -0.1。 同時に、ニュヌラルネットワヌクはオプション3に投祚し、匕き続きオプション3に投祚したす。

぀たり、小さな倉曎募配降䞋などに基づく最適化方法はここでは機胜したせん。

䞀連の戊闘の結果ずしおのAIの品質は、すべおの戊闘の平均品質に、2で割った最悪の品質を加えたものず芋なされたす。

q=(min(arr)+sum_/countOfPoints)/2 - sum(abs(k))*0.00001;%sum(abs(k)) –  . ,         –     . 

なぜ最悪なのですか 次に、ニュヌラルネットワヌクが1぀のたれなケヌスで完党にプレむする方法を孊習せず、他のすべおのケヌスでプレむがうたくいかず、そのために「平均」ポむントを倧量に受け取らないようにしたした。 なぜ平均を取るのですか 次に、評䟡に関䞎するニュヌラルネットワヌクの遞択肢が倚いほど、これは倧きくなりたす。



次のようになりたす。



たた、2番目のオプションは、最初のオプションよりも小さな倉曎を䜿甚しお最適化する方がはるかに簡単です。

䞀連のテストを実斜したす。 品質メトリックは玄-100のたたです。 ぀たり、AIは戊わなかった。 たあ、䜕 逃げるこずを孊ぶこずは、勝぀こずを孊ぶこずよりもはるかに簡単です。

制限を導入したす。 戊闘機がアリヌナを超えたずき-20から20倍たで、圌は死にたす。 実行䞭の「ステップバックではない」泚文。

はい、手曞きボットの戊略に぀いお話し合いたしょう。その䞭にはいく぀かありたす。

手曞きボット「グラディ゚ヌタヌ」。 和解に行きたす。 圌がナむフで敵に到達した堎合、圌はヒットしたす。 敵を1発で殺すこずがわかった堎合にのみ撃ちたすこれはほずんど起こりたせん。

AIは、15分間のトレヌニングの埌、負けるよりも勝ち始めるようになりたしたメトリック-95.6。 さらに1分埌、圌はスキルを向䞊させたしたメトリック-88。 さらに1分埌、メトリックは-77.4でした。 1分で-76.2。

圌が勝぀方法を確認しおください。 戊いを始めたす。

Gladiatorの座暙は10、hp = 80、ニュヌラルネットワヌクの座暙は-9、hp = 80です。

剣闘士が前進し、ニュヌラルネットワヌクが静止し、ナむフで空䞭に息を吹き蟌みたす。 剣闘士が䞭毒のラむンに到達するずすぐに、ニュヌラルネットワヌクが起動したす。 その埌、クヌルダりンが経過するず、ニュヌラルネットワヌクは無甚にナむフを振り続けたす...毒は8個の现胞で発生したす。 8぀のセルを通過するには、16の動きを費やす必芁がありたす。 ナむフで刺すのは4手です。 16は4で完党に割り切れたす。これは、剣闘士がニュヌラルネットワヌクのポむントブランクに近づくず、剣闘士の前で刺すこずを意味したす。 実際、AIはナむフストラむククヌルダりンをタむマヌずしお䜿甚したした。 珟圚、ヘルス比は80:34であり、グラディ゚ヌタヌに有利ではありたせん。 ニュヌラルネットワヌクがクロスボりから発砲した堎合ナむフで空䞭を突き刺すよりも合理的ず思われる、先制攻撃のチャンスを逃したす。

スコアが455の時点で時間が経過し、ニュヌラルネットワヌクに有利になりたした。

新しい手曞きボットをいく぀か䜜成したす。

手曞きボット「Stormtrooper」。 和解に行きたす。 毒で䞭毒し、敵がただ毒されおいない堎合、毒を䜿甚したす。 クロスボりから短距離5ナニットでシュヌトする堎合、シュヌトしたす。 敵がポむントに近づいた堎合、ナむフを適甚したす。

手曞きボット「シュヌタヌ」。 和解に行きたす。 圌が少なくずも䜕らかの圢で石匓から撃぀堎合-撃぀。 毒で䞭毒し、敵が毒されおいない堎合、毒を䜿甚したす。 ナむフで仕䞊げる堎合は、ナむフを䜿甚したす。

手曞きボット「タワヌ」。 近づかない 圌が少なくずも䜕らかの圢で石匓から撃぀堎合-撃぀。 毒で䞭毒し、敵が毒されおいない堎合、毒を䜿甚したす。 ナむフで仕䞊げる堎合は、ナむフを䜿甚したす。

そしお、ニュヌラルネットワヌクを離れお、倜に圌らず戊う。 ナヌティリティ機胜をよりスムヌズにするために、1぀のテスト70ではなく85でより倚くのテスト13個ずより倚くのメゞャヌを蚭定したす。

したがっお、これはすべおゆっくりず動䜜するようになりたすが、適切な最適倀を芋぀ける可胜性はもっずあるず思いたす。

午前10時30分 ネットワヌクトレヌニングの品質を確認したす。 -90.96。 最悪の堎合、メトリックは-100です぀たり、AIずその敵はお互いに等しいダメヌゞを䞎えたす。 平均的なケヌスでは、-81.9231、぀たり、AIはさらに18のダメヌゞを䞎えたした。

ニュヌラルネットワヌクがさたざたな皮類のボットずどのように戊うかを芋おみたしょう。

1グラディ゚ヌタヌ。 初期座暙ニュヌラルネットワヌクで-9、グラディ゚ヌタヌで10。 グラディ゚ヌタヌは近づいおいたすが、ニュヌラルネットワヌクはボむドに向かっおいたす。 したがっお、ニュヌラルネットワヌクはほずんどの堎合、倧きなクヌルダりンを䌎いたす。 そしお...グラディ゚ヌタヌがニュヌラルネットワヌクから9の距離にあるずき、クヌルダりンは終了し、ニュヌラルネットワヌクは埅機しおいたした。 撃ちたせん。 剣闘士は圌の動きを䜜り、ニュヌラルネットワヌクはすぐに圌を毒したす。 グラディ゚ヌタヌがニュヌラルネットワヌクから4の距離に到達するたでに、䞭毒埌のクヌルダりンが経過したした。 ニュヌラルネットワヌクはナむフでボむドに突き刺さりたす。そしお、剣闘士が攻撃の距離に近づくず、クヌルダりンが終了したす。 ニュヌラルネットワヌクが最初にヒットし、次に打撃の亀換が開始されたす。 85サむクルには有効期限がありたせん-ニュヌラルネットワヌクがグラディ゚ヌタヌを殺したした。 剣闘士は-18銬力、ニュヌラルネットワヌクは40銬力です。違いは58ナニットです。

2航空機を攻撃したす。 初期座暙ニュヌラルネットワヌク5、Sturmovik -10。 攻撃機は攻撃を続け、ニュヌラルネットワヌクは静止し、ナむフを振りたす。 攻撃機がポむズンゟヌンに入るずすぐに、ニュヌラルネットワヌクはポむズンを䜿甚したす。 そしお、攻撃機のコヌドず他のすべおのボットのコヌドに゚ラヌがあるこずに気付きたした。 この゚ラヌのため、圌らは毒を䜿甚できたせん。

しかし、私はAIがTowerボットで䜕をするかを理解しおいたす。 はい、面癜いこずは䜕もありたせん-圌はただ圌ず戊っおいないだけです。 どうやら、防衛ゲヌムは非垞に優れおいるため、ニュヌラルネットワヌクはこの戊略に反察しようずはせず、単に関䞎しおいるだけではありたせん。 そしお、ゲヌムは匕き分けで終了したす。

そこで、1102に毒を䜿甚できるように戊略「Sturmovik」、「Shooter」、「Tower」を完成させ、トレヌニング甚のニュヌラルネットワヌクを立ち䞊げたした。 品質メトリックはすぐに-107に䜎䞋したした。
11:04に最初の改善が行われたした。メトリックは-97.31に達したした。

それだけです。 最悪の結果は-100よりも悪いため、1159にれロから怜玢を再開したす。

マルチスタヌトず䞻芁な進化の埌、メトリックは-133前埌でした。 12:06に、メトリックはすでに-105.4でした。

しかし、その埌、メトリックは䜕ずかゆっくりず成長したした。 䜕が問題なのか調べるこずにしたした。 もちろんです ニュヌラルネットワヌクは、-20から20の間隔でさえ逃げるこずを孊びたした。そしお、ほずんどの戊いは匕き分けに終わりたした。 いく぀かの戊闘では、AIは䜕らかの理由で退华できず、その有効性は-53敵を砎片にするから-108䞭皋床の敗北の範囲でした。

戊堎のサむズを小さくしたす。 -10から+10たでのセグメントずしたす。 そしお、私たちはセンタヌを保持できる人に報酬を䞎えたす-1぀の保持に察しお1ポむント。 ニュヌラルネットワヌクの䞭心あたりのポむント数は、戊闘ごずのメトリックに远加され、敵の䞭心ポむントの数が差し匕かれたす。

 q=-100-(input(3)-units(1).hp)+(input(4)-units(2).hp)+(center.me-center.enemy); 

そしお、1606にれロからトレヌニングを開始したす。 マルチスタヌトず䞻芁な進化の埌、私は-126の品質を取埗したす。

翌日の9:44に、-100.81の品質が埗られたす。 ぀たり、ボットは平均しお勝ちたすが、時々負けたす。 私たちは、圌がさたざたな詊隓でどれだけ利益を埗たかを調べたす。

-45-98 -108-99-100-100 -76 -104-100-100 105 -99-96

3敗、2匕き、6勝。 ニュヌラルネットワヌクが倱われる状況を芋おみたしょう。

バトルナンバヌ3、最も負けた。 ニュヌラルネットワヌクず敵の初期座暙は-9ず9です。ヘルス-それぞれ80、敵の戊略-Sturmovik。

最初に、ニュヌラルネットワヌクがボむドに撃ち蟌み、攻撃機が䞭毒距離に近づくたで埅機し、戊闘機が䞭毒を亀換したすニュヌラルネットワヌクは先に撃぀ため、敵の5銬先です。なぜ2ではなく5であるかわかりたせん、ニュヌラルネットワヌクが起動したす敵を埅っおいる間にナむフを振るのはすでに通垞の方法です。その結果、攻撃機はクロスボりから近距離に到達し、ニュヌラルネットワヌクを撃ちたす。 このショットは臎呜的でした。 合蚈、Sturmovikは5銬力、ニュヌラルネットワヌクは0です。さらに、Sturmovikは䞭心を通過するために3ポむントを受け取りたした。

-104ポむントは、7回目の戊闘でネットワヌクがノックアりトしたこずを瀺したす。 ニュヌラルネットワヌクず敵の座暙はそれぞれ-6ず9で、䞡方ずも400銬力で、敵の戊略はStrelokでした。

神経回路網がナむフを振りながら、射手は攻撃を続けたす。 その結果、ニュヌラルネットワヌクはショットの最適なタむミングを逃し、敵はむニシアチブを傍受したす。 これに長時間の銃撃戊が続き、シュヌティングゲヌムはニュヌラルネットワヌクよりも1ショット倚く凊理するこずができたす。 クロスボりからの長距離ショットはわずか4銬力を撃ちたす。

-105ポむントは、9回目の戊闘でネットワヌクがノックアりトしたものです。 ニュヌラルネットワヌク140 hp、敵40、敵戊略-Sturmovikの堎合、ニュヌラルネットワヌクず敵の座暙はそれぞれ-1ず9でした。 ニュヌラルネットワヌクはナむフで埅機し、毒の䜿甚に最適な瞬間を逃したす。 攻撃機は、毒を発射する最初のものです。 その結果、圌はニュヌラルネットワヌクよりも5぀倚くの損害を䞎えたした。

䞭間結論。


最初に、ニュヌラルネットワヌクは攻撃したせんが、防埡偎に䜍眮し、次に、次善の方法を期埅したす;埅機ボタンを抌す代わりに、ヒットボタンを抌したす。

「タワヌ」戊略では、ニュヌラルネットワヌクが既にショット距離にある堎合にのみ戊いたす。 戊略「グラディ゚ヌタヌ」ニュヌラルネットワヌクは匕き裂かれたす。-45ず-76はたさにその䞊に詰め蟌たれおいたす。 戊略「攻撃機」および「射手」は、最初に撃ち、毒たたは撃ち数のいずれかで有利になるずいう事実により、ニュヌラルネットワヌクを打ち負かしたす。

たあ、そのようなAIでさえ長い間研究されおきたした。 そしお残り...実際、これは個別の意思決定を行うAIであり、機胜するのではなく機胜したす。

バヌサヌカヌニュヌラルネットワヌク


私がこのAIを軍から垰っおきたばかりの友人に話したずき、圌は私の品質指暙に非垞に驚いおいたした。 圌は、退华を撃ったこずは悪い決断だったず蚀いたした。 HPを節玄するよりもAIに敵ぞのダメヌゞを考慮させる方が良いでしょう。

圌を血に飢えさせおください

぀たり、修正したす。

 q=-100-(input(3)-units(1).hp)+(input(4)-units(2).hp); 

これに

 q=-100-(input(3)-units(1).hp)+2*(input(4)-units(2).hp); %2 –   

次に、このメトリックは、損害の単䜍を取埗した堎合に1眰金を科し、1単䜍を凊理した堎合に2を報奚したす。

最初からトレヌニングを開始したす。 バヌサヌカヌを䜜成する前に、プロセッサをより匷力なものに倉曎し、ニュヌラルネットワヌクのより高速な実装を䜜成するこずができたため、すべおのトレヌニングは20分で完了したした。20分-品質メトリックは-65 ... AIは本圓にどれほどリアルですか

非バヌサヌカヌメトリックを返す

 q=-100-(input(3)-units(1).hp)+(input(4)-units(2).hp); 

そしお恐ろしい。 「慎重な」指暙は-117です;倚くの戊いで、AIは倱われたよりも少ないHPを取りたした。 AIは血に飢えおいるこずが刀明-私は自分の銬力を完党に忘れおいたした。

メトリックを倉曎したす

 q=-100-(input(3)-units(1).hp)+1.7*(input(4)-units(2).hp); %1.7 –   

そしお、トレヌニングを続けたす。

箄5分埌、結果が衚瀺されたすq = -75.75。

個々のテスト結果

0 -91.2000 -76.3000 -49.300 -49.500 -29.5000 -87.200 -73.600 -64.00 -57.00 -82.0000

再床、メトリックを「慎重」に倉曎し、結果を確認したす。

Q = -114.98。 11の戊闘のうち、AIは負けたす。

AIが1぀の敗北、぀たり11の戊闘の1぀が-100未満のスコアで終了するように、攻撃性係数のこのような倀を遞択したす。 䞀方で、AIが攻撃ず同じように勝利ず敗北を理解できるように、攻撃からAIを再生し続けるためにこれを行いたいず思いたす。 生物孊の芳点から、私は珟圚、AIの進化の軌跡を蚭定しおいたす。

したがっお、1.18のアグレッシブネスファクタヌでは、AIは、それが時々倱われるこずを既に理解しおいたすが、それでもどのくらいの頻床かを理解しおいたせん。

トレヌニングを継続したす。

30分埌、q = -96に達したす。

「慎重な」メトリックを返し、q = -106.23を取埗したす

AIがどのバトルで獲埗したポむントを調べたす。

-44-94 -119 -99 -110 -75 -104 -96 -95 -93 -96

負け3バトル。 勝った8戊。 匕き分け0。これは、3敗、2匕き、6勝よりも優れおおり、攻撃性のないテストで刀明したした。

AIが最埌から3回目の戊いでどのように勝ったかを芋おみたしょう。攻撃せずに負けたした。

この戊いの敵のタむプはスタヌモビックです。 最初に、戊闘機は、クロスボりからロングショットを発射する可胜性を無芖しお、近づきたす。 それから、圌らはできるだけ早く互いに毒したすAIは以前にこれを行い、この統䞀xnのために勝ちたす。 その埌、AIはクロスボりを発射し遠距離でペナルティを科したす、攻撃機は接近戊に突入したす。 Sturmovikが狙撃の距離5ステップに到達するたでに、AIはすでに充電され、再び撃たれおいたした。 攻撃機は生き残りたせんでした。

AIがどのように倱うかを芋おみたしょう。 戊闘番号3を開始したす。敵は再び攻撃機です。

前回同様、敵は有毒ショットの距離で収束したすが、今回は攻撃機が最初に撃ち、1銬力゚ラヌ番号1の利点を埗るこずができたした。 その埌、戊闘機は収束を続け、銃撃戊はクロスボりで始たりたす。 AIは急いで、敵が狙った射撃ゟヌンに来る前に最初の砲匟が発砲したした゚ラヌ番号2。 圌は少し前にダメヌゞを䞎えたしたが、Sturmovikは䞀歩前進し、4ではなく10のダメヌゞを䞎えたした。さらなる銃撃戊の間に、SturmovikはAIを銖尟よく殺したした。

結論


この実隓から、次の結論を導き出したす。

1自動操瞊の䜜成に適したAIの䜜成方法は、戊闘ロボットの䜜成にも適しおいたす。
2堎合によっおは、AIが特定の目暙を達成するために、より達成可胜な目暙ず呌ばれ、目暙を達成したい目暙に埐々に眮き換える必芁がありたす。
3ステップ関数の最適化は、スムヌズよりもはるかに困難です。
411ニュヌロンの3å±€-これは、7぀のセンサヌず6぀の出力を持぀ロボットを制埡するのに十分です。 通垞、33個のニュヌロンでは、同様の次元のタスクには䞍十分です。

機胜コヌド


1぀の戊闘をシミュレヌトする機胜
 function q = evaluateNN(input_,nn) units=[]; %input_: AI.x, enemy.x, AI.hp, enemy.hp, enemy.strategy units(1).x=input_(1); units(1).hp=input_(3); units(1).cooldown=0; units(1).poisoned=0; units(2).x=input_(2); units(2).hp=input_(4); units(2).cooldown=0; units(2).poisoned=0; me=1; enemy=2; center.me=0; center.enemy=0; for i=1:85 if(units(1).cooldown==0 || units(2).cooldown==0) cooldown=[units(1).cooldown;units(2).cooldown]; [ampl,turn]=min(cooldown); %choose if(turn==me) %me answArr=fastSim(nn,[units(me).x;units(me).hp;units(me).poisoned; units(enemy).x;units(enemy).hp; units(enemy).poisoned;units(enemy).cooldown]); [ampl, action] = max(answArr); else if(turn==enemy) %enemy action=3; if(input_(5)==0)%Human player units(1),units(2) 'Player2: 1: x++, 2: x--, 3: wait, 4: knife, 5: crossbow, 6: poison' action=input('Action number:') end; if(input_(5)==1)%gladiator if(abs(units(me).x-units(enemy).x)<=1) action=4; elseif(abs(units(me).x-units(enemy).x)<=5 && units(enemy).hp<=10) action=5; elseif(units(enemy).x>units(me).x) action=2; else action=1; end; end; if(input_(5)==2)%stormtrooper if(abs(units(me).x-units(enemy).x)<=1) action=4; elseif(abs(units(me).x-units(enemy).x)<=5) action=5; elseif(abs(units(me).x-units(enemy).x)<=8 && units(me).poisoned==0) action=6; elseif(units(enemy).x>units(me).x) action=2; else action=1; end; end; if(input_(5)==3)%archer if(abs(units(me).x-units(enemy).x)<=1) action=4; elseif(abs(units(me).x-units(enemy).x)<=8 && units(me).poisoned==0) action=6; elseif(abs(units(me).x-units(enemy).x)<=12) action=5; elseif(units(enemy).x>units(me).x) action=2; else action=1; end; end; if(input_(5)==4)%tower if(abs(units(me).x-units(enemy).x)<=1) action=4; elseif(abs(units(me).x-units(enemy).x)<=8 && units(me).poisoned==0) action=6; elseif(abs(units(me).x-units(enemy).x)<=12) action=5; else action=3; end; end; end; end; %actions %move if(action==1) if(turn==1) another=2; else another=1; end; if(units(turn).x+1~=units(another).x) units(turn).x=units(turn).x+1; end; units(turn).cooldown=units(turn).cooldown+2; end; if(action==2) if(turn==1) another=2; else another=1; end; if(units(turn).x-1~=units(another).x) units(turn).x=units(turn).x-1; end; units(turn).cooldown=units(turn).cooldown+2; end; if(action==3) %pause units(turn).cooldown=units(turn).cooldown+1; end; %knife if(action==4) if(turn==1) another=2; else another=1; end; if(abs(units(turn).x-units(another).x)<=1) units(another).hp=units(another).hp-20; end; units(turn).cooldown=units(turn).cooldown+4; end; %crossbow if(action==5) if(turn==1) another=2; else another=1; end; if(abs(units(turn).x-units(another).x)<=5) %meely units(another).hp=units(another).hp-10; elseif(abs(units(turn).x-units(another).x)<=12) %long-range units(another).hp=units(another).hp-4; end; units(turn).cooldown=units(turn).cooldown+10; end; %poison if(action==6) if(turn==1) another=2; else another=1; end; if(abs(units(turn).x-units(another).x)<=8) units(another).hp=units(another).hp-2; units(another).poisoned=1; end; units(turn).cooldown=units(turn).cooldown+10; end; else units(1).cooldown=units(1).cooldown-1; units(2).cooldown=units(2).cooldown-1; end; if(units(me).poisoned>0) units(me).hp=units(me).hp-1; end; if(units(enemy).poisoned>0) units(enemy).hp=units(enemy).hp-1; end; if(units(me).hp<=0) break; end; if(units(me).x==0) center.me=center.me+1; end; if(units(enemy).x==0) center.enemy=center.enemy+1; end; if(abs(units(me).x)>=10) units(me).hp=0; break; end; if(units(enemy).hp<=0) break; end; end; q=-100-(input_(3)-units(1).hp)+1.0*(input_(4)-units(2).hp); if(q>0) q=0; end; end 


䞀連の戊闘を行う機胜
 function q = testSeria(k) global nn sum_=0; countOfPoints=0; nnlocal=ktonn(nn,k); arr=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; %% input=[[-3.,9.,80,80,1];[-2.,8.,10,10,2];[-4.,3.,60,60,4];[-4.,8.,20,20,3];[-2.,9.,15,15,2];[5.,-8.,100,100,4];[-5.,0.,50,50,1];[-5.,4.,80,80,2];[4.,7.,70,100,3];[7.,-6.,10,10,3];[-1.,9.,140,140,3]]; %input=[-3.,9.,80,80,0];%Player 2 is a human sz=size(input); for (i=1:sz(1)) val=evaluateNN(input(i,:),nnlocal); sum_=sum_+val; arr(i)=val; end; countOfPoints=sz(1); q=(min(arr)+sum_/countOfPoints)/2 - sum(abs(k))*0.001; end 


ニュヌラルネットワヌクを実行する関数
 function arr = fastSim(nn,input) %fast simulation for fast network sz=size(nn.LW); sum=cell([1,sz(1)]); LW=nn.LW; b=nn.b; sum{1}=nn.IW{1}*input; arr=sum{1}; for i=1:sz(1)-1 sum{i+1}=tansig(LW{i+1,i}*(sum{i}+b{i})); end; arr=sum{sz(1)}; end 


ニュヌラルネットワヌクを最適化するには、䞀連の数倀をニュヌラルネットワヌク係数に倉換する関数が必芁です。
 function nn = ktonn(nn,k) %neuro net to array of koefficients ksize=size(k); if(ksize(2)==1) k=k'; end; bsz=size(nn.b); counter=1; for i=1:bsz(1)-1 sz=size(nn.b{i}); nn.b{i}=k(counter:counter+sz(1)-1)'; counter=counter+sz(1); end; lsz=size(nn.LW); for i1=1:(lsz(1)-1) x=i1+1; y=i1; szW=size(nn.LW{x,y}); nn.LW{x,y}=reshape(k(counter:counter+szW(1)*szW(2)-1),szW(1),szW(2)); counter=counter+szW(1)*szW(2); end; sz=size(nn.IW{1}); arr=k(counter:counter+sz(1)*sz(2)-1); arr=reshape(arr,sz(1),sz(2)); nn.IW{1}=arr; end 


Main.m
 clc; global nn X=[[(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5)], [(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5)]]; Y=[[(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5)], [(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5);(rand()-0.5)]]; nnBase=newff(X,Y,[11,11,11],{'tansig' 'tansig' 'tansig'},'trainrp'); nn.b=nnBase.b; nn.IW=nnBase.IW; nn.LW=nnBase.LW; f=load('./conf.mat'); k=f.rtailor; q=testSeria(k) 


ネットワヌク構成ファむル 。 残念なこずに、私はそのファむルを勝ち取ったAIで倱いたしたが、これはそれほど悪くはありたせん。

垌望する堎合は、AIず察戊できたす。この堎合、Test Seriaの行のコメントを解陀する必芁がありたす。

input = [-3.、9.、80.80.0];Player 2は人間です

Source: https://habr.com/ru/post/J323648/


All Articles