すべての人に良い一日を!
大学の上級コースでも、知的エージェントに関わるようになりました。 卒業証書のトピックでさえ、もともと戦場を模した環境での敵対行為に関与するエージェントの作成に関連付けられていました。 しかし、仕事のために、私は主題を変えなければなりませんでした。
私は長い間これをやりたいと思っていましたが、すべての時間がなくなっていました。 今、彼らはようやくエージェントのための環境を作り始めましたが、そのような規模ではありません。 だから誰かが興味を持っているなら、参加してください! リポジトリが開いています、下のリンク。
インテリジェントエージェント。
簡単に言えば、エージェントは環境に配置されたエンティティであり、センサーを使用して環境を認識し、アクチュエータを使用して環境に作用することができます。
ウィキペディアによると、最も単純なエージェントスキームは次のようになります。
そのようなエージェントには理由はなく、単純なif-thenルールのリストに従って排他的に動作します。 より複雑なエージェントには、アクションを分析して学習できるタイプがいくつかあります。 しかし、私はまだ彼らから遠いです。
Unity3d
Unity3dで、戦場(正方形)といくつかの戦車を持つプロジェクトを作成しました。 古き良きバトルシティゲームから戦車のテクスチャを取りました。 各戦車ができることは、フィールドを駆け抜けて撃つことです。
これは、プロジェクト全体の外観です。
各タンクには2つの制御スクリプトが添付されています。
-TankBehavior
-BasicTankControls(またはそのサブクラス)
TankBehaviorは、1つの戦車を完全に記述するメインスクリプトです。 このスクリプトは、移動、射撃、その他すべての方法を実装しています。 このスクリプトには、タンク制御を実装するBasicTankControlsへのリンクも含まれています。 基本的なスクリプトは次のようになります。
public class BasicTankControls : MonoBehaviour { public void Init(TankBehavior tank) { this.tank = tank; } public virtual void Act(List<TankData> tanksData) { // no operation } protected TankBehavior tank; }
これにより、TankBehaviorスクリプト内の制御スクリプトが初期化されます。
void Start () { ... controls = GetComponent<BasicTankControls>(); if(controls != null) { controls.Init(this); } ... }
このメソッドは物理ティックごとに呼び出されます。
void FixedUpdate() { if(controls != null) { GameObject[] tankObjects = GameObject.FindGameObjectsWithTag("Tank"); List<TankData> tanksData = new List<TankData>(); foreach (var item in tankObjects) { if (item.GetInstanceID() != this.GetInstanceID()) { tanksData.Add(item.GetComponent<TankBehavior>().GetData()); } } controls.Act(tanksData); } }
最初に、フィールド上のすべてのタンクに関するデータが収集されます。 したがって、エージェントセンサーによる環境に関する情報の収集がシミュレートされます。 次に、この情報は制御スクリプトに送信されます。制御スクリプトは、受信したデータに基づいて、環境に影響を与えます。
1つの戦車のデータは次のようになります。
public class TankData { public TankData(int instanceId, Vector2 position, float health, Direction direction) { this.InstanceID = instanceId; this.Position = position; this.Health = health; this.Direction = direction; } public readonly int InstanceID; public readonly Vector2 Position; public readonly float Health; public readonly Direction Direction; }
それは基本的にそれです。 ここでのタスクは、戦車の制御スクリプトを作成することだけです。 誰かがイベントの途中で突然介入したい場合に、人を管理するためのスクリプトを1つ書きました。
public class HumanControls : BasicTankControls { public override void Act(List<TankData> tanksData) { if(Input.GetButton("Up")) { tank.MoveForward(); } else if (Input.GetButton("Down")) { tank.MoveBackward(); } if (Input.GetButtonDown("Left")) { tank.RotateLeft(); } else if (Input.GetButtonDown("Right")) { tank.RotateRight(); } if (Input.GetButton("Fire")) { tank.Fire(); } } }
タンクの挙動
そもそも、単純な自律行動、たとえば、ランダムな方向への運転や射撃を計画しています。 次に、壁(取り壊されるかもしれません)とまさに本部を追加するというアイデアがあります。一部は保護する必要があり、他は破壊する必要があります。 多分、共同行動計画さえあるでしょう。
しかし、これらは非常に楽観的な計画です。 私自身もこれを書いたことがないので、勉強しなければなりません。 どんな助けやアドバイスも大歓迎です! :)
リポジトリへのリンク 。