跳轉到內容

Disim 高速公路模擬器/建立基礎設施控制器

來自華夏公益教科書,開放世界開放書籍

簡單示例

[編輯 | 編輯原始碼]

Disim 允許建立完全任意的基礎設施控制,而無需修改其內部程式碼。為了說明這一點,讓我們從一個簡單的示例開始:假設網路上存在一個匝道計量器,我們希望當同一高速公路上感測器測量的交通密度過低時,增加相應匝道的入口率。指令碼看起來像這樣

-- Actuator
ramp_meter = nil
-- Sensors
density_sensor = {}
-- Variables
K = 0.1
optimal_density = 60
tprev = 1
last_change = 0
dt_red = 5
dt_green = 3

function init(self)
  ramp_meter = self:getRoadActuator("rampmeter")
  density_sensor[0] = self:getRoadSensor("densitysensor1")
  density_sensor[1] = self:getRoadSensor("densitysensor2")
end

function update(self, t, dt)
  -- Setting the ramp meter light
  last_change = last_change + dt
  if (ramp_meter:getColor() == RED and last_change > dt_red) then
    last_change = 0
    ramp_meter:green()
  elseif (ramp_meter:getColor() == GREEN and last_change > dt_green) then
    last_change = 0
    ramp_meter:red()
  end

  -- Aggregation of data happens every minute
  if (t - tprev < 60) then
    return
  end
  tprev = t

  density = density_sensor[0]:getValue() + density_sensor[1]:getValue()
  dt_red = dt_red + (density - optimal_density)*K
  if (dt_red < 0) then dt_red = 0; end
end

function destroy(self)
  -- Nothing to do here
end

什麼是指令碼語言?

[編輯 | 編輯原始碼]

此指令碼是使用 LUA (http://www.lua.org/manual/5.1/manual.html) 編寫的:Lua 是一種擴充套件程式語言,旨在支援具有資料描述功能的一般過程程式設計。它還為面向物件程式設計、函數語言程式設計和資料驅動程式設計提供了良好的支援。Lua 旨在用作任何需要指令碼語言的程式的強大、輕量級指令碼語言。Lua 作為庫實現,用乾淨的 C(即 ANSI C 和 C++ 的通用子集)編寫。

Disim 允許任何人使用 LUA 作為指令碼語言來建立和重新定義基礎設施行為。在 LUA 中建立您的基礎設施控制器有幾個優點:不需要編譯,可以獲得簡化的 API,並且您受益於所有 LUA 功能(表格、匿名函式、字典,...)。正如我們從上面的示例中觀察到的,每個指令碼都應該提供以下 3 個函式

function init(self)

此函式以單個變數作為輸入。此變數是當前高速公路網路上的 LuaInfrastructure 指標。此函式不返回值,但儲存網路上我們計劃使用的不同感測器和執行器的某些指標可能很有用。

function update(self, t, dt)

此函式以三個變數作為輸入

  • self:與輸入函式一樣,這是一個指向受控基礎設施的指標。
  • t:這是自模擬開始以來的絕對時間。
  • dt:這是自上次呼叫該函式以來的時間步長(以秒為單位)。

此函式不返回值。

function destroy(self)

此函式以單個變數作為輸入。此變數是指向當前基礎設施的指標。在此函式中,您應該清理由 init 初始化的任何變數。

如上所示,所有提供的函式都以指向當前受控基礎設施的指標作為引數。此指標描述了 LUA 中的一個物件:LuaInfrastructure。要檢視您可以對該物件執行的操作,請檢視 此處 可用的 Disim LUA API。

下一步是什麼?

[編輯 | 編輯原始碼]

下一部分中,我們將看到如何將到目前為止我們所看到的所有內容結合起來,從一條虛擬高速公路上收集資料。

華夏公益教科書