限制更新频率的想法

时间:2011-07-27 13:53:18

标签: clojure controls artificial-intelligence

这是我的情况,我有一个外部程序,每隔30个左右向我发送一次数据。该数据合并到ref。

此时我有,

(def state (ref {})

单独的未来将数据包读取并合并到此参考。

现在我有了我的状态机,即做决定并发回控制命令。基本上每个州都有以下结构,



(while (some-thing-happening)
   (calc-stuff)
   (send-correction))

这是我的问题,如果我每秒收到100个数据包,则发送200个命令/秒是没有意义的。所以我想提出一个能够限制更新率的方案。我无法入睡一段时间因为更新率不确定。你会如何构建这个?

2 个答案:

答案 0 :(得分:1)

首先,您需要一种措施来防止在没有数据到达时工作。你可以通过

来实现这一目标
  1. 数据包到达时接收回调,从而推进状态机。如果您的IO API有回调,请使用它。
  2. 阻止some-thing-happening直到数据包到达。如果API允许,并且没有回调,请使用它。
  3. 将传入的数据包写入BlockingQueue并从状态机中读取。这模拟 2。
  4. 其次,您可能希望将您的州建模为代理:

    (def state (agent {}))
    

    这样,你可以说

    (defn update-state [state data]
      ; e.g.
      (merge state data))
    
    ;; in the state machine
    (send state correct data)
    

    在单独的帖子中更新你的状态。


    您甚至可以直接从您阅读它们的地方向代理发送程序包,并在update-state中实现状态机。

答案 1 :(得分:0)

更改参考号时调用状态机功能。这样,您可以以与数据更改相同的速率发送命令。

或者,使用另一个ref作为标志并在更新数据时将其设置为true,将标志作为条件添加到while循环。并在更新后将其重置为false。