簡體   English   中英

這個模擬器的最佳架構是什么?

[英]What is the best architecture for this simulator?

我必須用Java制作模擬器,它將模擬在高速公路上騎車。 高速公路上應該有3條車道,每條車道都有恆定速度的車。 在這條高速公路上,有一個代理商,必須穿過而不會撞到任何其他車輛。 詳細描述可以在本文的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);

這很可怕也很難看。

所以我需要一些聰明人的幫助。 有人可以給我一個關於書籍,文章,模擬器/架構的鏈接嗎? 或者解釋一下我做錯了什么?

我不是程序員,這個項目是我的教師名為軟件工程的可選課程的一部分。

我的建議是將代理的界面設計成智能代理的正式概念 :從模擬的角度來看,它是一個黑盒子,它接收來自其環境的感知 (例如,傳感器數據),然后決定某個動作 (例如,向左或向右轉向汽車)。

基於此定義並假設一個簡單的離散逐步模擬 ,您的代理類可能如下所示:

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

其中AgentAction是表示代理可以在一個步驟中決定執行的操作的類型(在最簡單的情況下,這將是具有值STEER_LEFTSTEER_RIGHT等的枚舉---對於更復雜的問題,您可以定義使用AgentAction作為超類/接口的整個類層次結構。 模擬器的工作是解釋代理返回的AgentAction對象並相應地更改其環境的狀態(即, Highway對象)。

另一方面,參數HighwayPerception表示代理在當前時間步驟能夠感知的所有內容:例如,汽車的速度( getMySpeed() )或到下一輛汽車的距離( getNearestCarInLane(int laneNumber) ) 。 避免了將代理直接耦合到其環境 (即Highway ) - 這很重要,因為它將關注點分開 :代理只能感知其環境決定操作,而不是直接與之交互。 同樣,在給定當前環境狀態的情況下,模擬器的工作是為代理創建感知。

最后,這種設計還使控制代理更容易 必須設計HighwayPercept類,使其只能用於讀取代理應該能夠感知的數據 ,而不是直接影響周圍環境。 相比之下,原始設計中的代理可以訪問Highway對象,因此可以嘗試作弊 ,例如, see前方幾英里處的車輛並相應地規划其路線,或者僅改變其他車輛的位置。高速公路。 即使您不太關心安全性,也應該永遠不可能這樣做,因為這些事情也可能無意中發生並且可能很難調試。

根據您的要求,您的架構當然可能需要更加復雜 多代理仿真系統的文獻中可以很容易地獲得更多信息 (這是您的問題的概括,即可以模擬幾個代理在您的高速公路上行駛)。 這個領域正在進行大量研究,您可能需要查看多種代理模擬工具(例如Repast )。

我個人將封裝高速公路包含在模擬器中。 如果每個模擬器有超過1個高速公路,那么我會假設代理將在任何高速公路對象上,因此代理可以由模擬器擁有並與高速公路相關聯。 但模擬器應該是一個Facade模式,所以你需要做的就是創建模擬器,並且可以選擇傳遞一個配置,這樣你就不必處理它們了。 每個代理都應該有一個run()方法,模擬器中應該有一個線程在它包含的每個Agent上調用run(),或者你可以在Simulation中有一個手動步驟,為每個Agent調用run()一次(比如一步一步模擬器)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM