AIプログラムの作り方

(7)作ったAIプログラムを改良する

次にAIプログラム「しまねっこ」を少し改良してみましょう。

[作成するプログラムの内容]

  • これから作るプログラムの内容は次のとおり

    ※赤字部分が今回の改良部分です。

    ① マップ情報を取得する

    ② 減点アイテムの座標を確認する

    ③ 始点:自分の位置、終点:ゴール、避ける:減点アイテムで最短経路を計算する

    【③の経路がある場合】

    ④ ③の結果に従って1マス移動する

     

     

    【③の経路がない場合】

    ④ 出発地:自分の位置、目的地:ゴールで最短経路を計算する

    ⑤ ④の結果に従って1マス移動する

[AIプログラム「しまねっこ」の名前を変更する]

  • 「しまねっこ」ファイルを立ち上げ、名前を「しまねっこ2」に変更

  • 念のため最初にファイルを保存(ブロックモードとRubyモードの両方でセーブを実行)

[減点アイテムの座標を確認する]

  • 「範囲内の地形・アイテム・中心座標」ブロックを用意

    の実行内容

    ⇒指定した範囲に、指定した要素が存在するかどうかを確認する。

    ⇒指定した要素がある場合は、その座標情報が取得できます。

  • 「式」ブロックを「中心座標」と「範囲」にはめ込む

  • 「中心座標」と「範囲」を指定

    ※この命令ブロックでは、「中心座標」「範囲」「地形・アイテム」を指定できます。

    ※それぞれの定義は次のとおりです。

    ▶中心座標:探索したい範囲の中心座標を入力します。

    ▶範  囲:探索したい範囲のセル数を入力します。

    ▶地形・アイテム:探索したい要素の値を入力します。

    ※指定しなかった場合は減点アイテムの情報を取得します。

    ※要素の値は「1.最初に覚えること」でご確認ください。

    ① マップ全体を把握したいので、マップの中心座標[7,7]を入力

    ② マップ全体を把握したいので、マップのマス数15を入力
    (マップを15×15マスで構成)

    ③ 今回は減点アイテムの情報を取得したいので入力は不要

  • 「範囲内の地形・アイテム・中心座標」の答えを変数「減点アイテム」にする

    ① 「セット「項目」宛先」ブロックに「範囲内の地形・アイテム」ブロックをはめ込む

    ② 変数の名前として「減点アイテム」を入力

  • 出来たブロックをテンプレートにはめ込む

[「2点間の最短経路」の通らない座標に「減点アイテム」を追加]

  • 通らない座標部分に「式」ブロックを追加し、「減点アイテム」を入力

  • [条件分岐を設定する]

    • 「◆もし ならば」ブロックを用意し、テンプレートにはめ込む

    • 条件「減点アイテムを通らないでゴールする経路がない場合」を設定する。

      ① 「演算」から「=」ブロックを用意し、「◆もし ならば」にはめ込む

      ② 「=」ブロックに「式」ブロックと「数値」ブロックをはめ込む

      ③ 「式」ブロックに「ルート.length」、「数値」ブロックに「1」を入力

      【ルート=lengthの意味】

      「( ).length」は、配列の数又は文字列の長さを求める命令コードです。

      「2点間の最短経路」では、経路情報が座標配列(例[[13,8][13,7][13,6]])で返されますが、求める経路がなかった場合は、始点の座標のみが返されます。(座標が1つだけ返されます。)

      条件「減点アイテムを通らないでゴールする経路がない場合」は返された座標が1つだけかどうかで判断することができます。

      よって、は、「変数「ルート」で得られた座標 = 1つ」という意味となり、ここでは「減点アイテムを通らないゴールまでの最短経路がない」という条件になります。

    • 「減点アイテムを通らないでゴールする経路がない」場合の行動を入力する

      ※ここでは条件「減点アイテムを通らない」をやめて、単純にゴールまでの最短経路を求めます。

      ※この行動は最初に作った「しまねっこ」の行動と同じです。

      ① 最短経路を求めるブロックを用意

      ② 用意したブロックをテンプレートにはめ込む

    • 以上で完成です。

    【移動先とした変数「ルート」について】

    今回のプログラムでは、違う内容の2つの最短経路ブロックに変数「ルート」という名前を付けています。

    では、最後の方で実行するの「ルート[1]」は、①と②どちらのルートでしょうか?

    答えは、の前で、最後に実行されたものになります。

    つまり

    • 「減点アイテムを通らない最短経路があった場合」は、①が最後に実行され、「ルート[1]」は①になります。(②は「◆もし ならば」の条件にあわないので実行されません。)
    • 「減点アイテムを通らない最短経路がない場合」は、「◆もし ならば」の条件にあうので②が実行されるため、「ルート[1]」は②になります。

    この変数のルールを利用することにより、移動先を毎回変更することなく条件に応じた移動先を指定することができます。

    ※忘れずに「ブロック」「Ruby」の2つのモードでセーブを実行してください!

    クリエイティブ・コモンズ・ライセンス

    このドキュメント は クリエイティブ・コモンズ 表示 4.0 国際 ライセンス の下に提供されています。