2015-11-25 81 views
4

我正在使用Akka構建多智能體模擬,並且因此想要比實時更快地運行模擬。具體來說,我想配置Akka調度程序,以便調度程序不是通過某個基礎的固定時間步長推進,而是從一個預定事件前進到下一個(顯然可能涉及事件之間實質上不同的時間步長)。模擬時間和Akka調度程序

稍有不同,我希望調度程序表現得好像它是一種優先級隊列,其中優先級由事件的模擬時間戳給出。

這是否清楚?如果是這樣,我想使用演員系統的默認調度程序來做什麼?如果這是不可能的,那麼我將如何使用現有的Akka組件來滾動我自己的調度程序來完成此任務。

+0

它是否必須是調度程序?爲什麼不只是一個將消息分發給代理的遞歸函數? –

+0

@ RamonJ.RomeroyVigil抱歉,我沒有關注。你能提供一些你想要的更多描述嗎? – davidrpugh

+0

我會用一個例子來寫答案。如果這不是你要找的東西,我總是可以刪除... –

回答

1

我不認爲這是可能的akka​​調度。從documentation(重點煤礦):

有時候需要做的事情發生在未來出現,並 你在哪裏去看看呢?看不到比ActorSystem!在那裏,你 發現返回 akka.actor.Scheduler實例的調度方法,這種情況下是每ActorSystem獨特,是 內部用於調度的東西在時間在特定點 發生。

但是,你總是可以用遞歸函數完成同樣的事情。比方說,你的「實時」功能,看起來像:

def periodicFunction() : Unit = ??? //whatever you're doing to Agents 

//periodicFunction is called every 10 seconds 
actorSystem.scheduler().schedule(0 seconds, 10 seconds)(periodicFunction()) 

你的模擬代碼可能僅僅是:

@scala.annotation.tailrec 
def fasterThanRealTimeLoop(n : Int) = 
    if(n > 0) { 
    periodicFunction() 

    fasterThanRealTimeLoop(n-1) 
    } 

然後,你可以模擬運行20次與

fasterThanRealTimeLoop(20) 

此功能可以進一步被包裝以封裝兩種可能性:

val realtimeMode : Boolean = ??? //some configuration setting 

val periodicArgs : Either[FiniteDuration, Int] = 
    if(realtimeMode) Left(10 Seconds) else Right(20) 

periodicArgs.left.foreach { period => 
    actorSystem.scheduler().schedule(0 seconds, period)(periodicFunction()) 
} 

periodicArgs.right.foreach { count => 
    fasterThanRealTimeLoop(count) 
} 

根據配置設置,此代碼現在將調用正確類型的循環(定時或儘可能快)。

+0

@ RamonJ.RomeroyVigil謝謝。我不認爲這個遞歸函數調用會爲我想做的事情工作。我想,我想,Akka調度程序的行爲就像優先級隊列,隊列中的對象按照仿真時間排序。 – davidrpugh

+0

@davidrpugh不客氣。正如我在答覆中所說的那樣,我不認爲調度人員有這些訣竅。快樂的黑客攻擊。 –