6

高速道路での車の乗り方をシミュレートするシミュレーターを Java で作成する必要があります。高速道路には 3 車線が必要で、すべての車線に一定速度の車があります。このハイウェイには、他の車に衝突しないように通り抜けなければならないエージェントが 1 人います。詳細な説明は、この論文のセクション 2.5 と画像 5 にあります。

この画像は前述の論文からのもので、高速道路の外観を示しています。

ここに画像の説明を入力

私の目標は、エージェントのロジックではなく、シミュレーター (および GUI) のみを作成することです。今、私はこのシミュレーターのアーキテクチャーを設計したいと思っています。ここで助けが必要です。

私の考えでは、エージェントの API がどのように見えるかは次のとおりです。

public abstract class BaseAgent {
    public abstract void run()
    public abstract void onCrash();
}

高速道路上のエージェント (車) は、このクラスの子孫である必要があります。run()すべてのステップで、エージェントのロジックであるシミュレーター呼び出し関数。この関数では、エージェントは次のような関数を呼び出すことができます:

goLeft();
goRight();
getNearestCarInLane(int lane_no);
getMySpeed();

したがって、すべてのステップで、エージェントは現在の車線にとどまるか、左折するか右折するかを決定できます。エージェントができることは以上です。

これはエージェント API ですが、シミュレーターの残りの部分をどのように設計すればよいかわかりません。アーキテクチャをシミュレートする最初の試みは次のとおりです。

class Agent — descendant of BaseAgent, can ride on highway.
class Highway — stores position of all cars on highway.
class Simulator — creates instance of agent and highway; in every step, call agent’s `run()` and monitors any car crash.

これは良いアーキテクチャではありません。どのクラスにメソッドを配置する必要がgoLeft()ありgoRight()ますgetNearestCarInLane()か? これらのメソッドはBaseAgentクラス内にある必要がありますが、高速道路上のすべての車の位置を知る必要があるためです。だから最後に、私はこのようなものを持っていました:

Simulator s = new Simulator();
Highway h = new Highway();
Agent a = new Agent();

s.setAgent(a);
s.setHighway(h);
a.setHighway(h);
h.setAgent(a);

そして、それはひどく醜いです。

だから私はここで賢い人々からの助けが必要です。シミュレーター/アーキテクチャーに関する本や記事へのリンクを教えてもらえますか? または、私が間違っていることを説明してください。

私はプログラマーではありません。このプロジェクトは、ソフトウェア エンジニアリングという学部のオプション コースの一部です。

4

2 に答える 2

6

私の推奨は、インテリジェント エージェントの正式な概念を念頭に置いて、エージェントのインターフェイスを設計することです。シミュレーションの観点からは、環境 (センサー データなど) から知覚を受け取り、特定のアクションを決定するブラック ボックスです(たとえば、車を左または右に操舵します)。

この定義に基づいて、単純な離散ステップワイズ シミュレーションを想定すると、エージェント クラスは次のようになります。

public abstract class BaseAgent {
    public AgentAction act(HighwayPerception hwyPerception);
}

whereAgentActionは、エージェントが 1 つのステップで実行することを決定できるアクションを表す型になります (最も単純なケースでは、これは値STEER_LEFTSTEER_RIGHTなどの列挙になります。 --- より複雑な問題については、クラス全体を定義できます)。AgentActionスーパークラス/インターフェイスとしての階層)。AgentActionエージェントから返されたオブジェクトを解釈し、それに応じてその環境 (つまり、Highwayオブジェクト)の状態を変更するのは、シミュレーターの仕事です。

一方、パラメーターHighwayPerceptionは、現在の時間ステップでエージェントが認識できるすべてのものを表します。たとえば、車の速さ ( getMySpeed()) や次の車までの距離 ( getNearestCarInLane(int laneNumber)) などです。これにより、エージェントがその環境(つまりHighway) に直接結び付けられるのを回避できます --- これは重要です。なぜなら、それは懸念を分離するからです: エージェントは環境と直接対話するのではなく、環境を認識してアクションを決定するだけです。繰り返しになりますが、環境の現在の状態を考慮して、エージェントの知覚を作成するのはシミュレーターの仕事です。

最後に、この設計により、エージェントの制御も容易になります。HighwayPerceptクラスは、エージェントが認識できるはずのデータを読み取るためにのみ使用でき、周囲の環境に直接影響を与えないように設計する必要があります。対照的に、元の設計のエージェントはオブジェクト自体にアクセスできるため、たとえば、数マイル先の車をだまし、それに応じてルートを計画したり、高速道路上の他の車の位置を変更したりしようとする可能性があります。セキュリティをあまり気にしない場合でも、これは決して可能ではありません。そのようなことは意図せずに発生する可能性があり、デバッグが難しい場合があるためです。Highwaysee

もちろん、要件によっては、アーキテクチャをより洗練されたものにする必要がある場合もあります。さらなる情報は、マルチエージェント シミュレーション システムに関する文献から簡単に入手できるはずです(これは問題の一般化です。つまり、複数のエージェントをシミュレートして高速道路を走行させることができます)。この分野では多くの研究が行われており、見たいマルチエージェント シミュレーション用のツールがいくつかあります ( Repastなど)。

于 2011-10-11T20:32:40.633 に答える
0

個人的には、ハイウェイをカプセル化してシミュレーターに含めます。シミュレーターごとに複数の Highway がある場合、エージェントはいずれかの Highway オブジェクト上にあると想定されるため、エージェントはシミュレーターによって所有され、Highway に関連付けることができます。ただし、シミュレーターは Facade パターンである必要があるため、シミュレーターを作成し、必要に応じて構成を渡すだけで、それらに対処する必要がなくなります。各エージェントには run() メソッドが必要であり、含まれるすべてのエージェントで run() を呼び出すスレッドがシミュレーターに存在する必要があります。または、エージェントごとに 1 回 run() を呼び出す手動のステップをシミュレーションに含めることができます (ステップバイステップシミュレーター)。

于 2011-10-10T13:17:05.247 に答える