首页 > 解决方案 > 是否有一种算法可以通过水箱水位的变化来检测水箱中的补充水

问题描述

我正在尝试编写一些代码来检测一段时间内水箱的补充。

所需的输出将是检测到的每次重新填充的开始/结束时间和体积。

我的输入是水箱液位数据点的连续流,即 24 小时内的 1,440 个数据点,每个数据点一分钟。

并且通常不会有两个连续的笔芯。每次加水后,将有一段时间的水消耗,然后才能进行另一次加水。

我的算法的当前设计是这样的:

  1. 按日期/时间对 1,440 个数据点进行排序,从最旧到最新开始。
  2. 将排序后的 1,440 个数据点加载到数组中。
  3. 从第一个数据点开始。姑且称之为S吧。
  4. 将 S 的水位与 S+1 进行比较。
  5. 如果 S+1 小于 S,则表示它处于“消费”模式。
  6. 重复 S+1 与 S+2 的比较,然后 S+2 与 S+3 以此类推,直到我到达 S+N 返回的水位高于 S+N-1 的点,这意味着“ refill”模式已启动。
  7. 将 S+N-1 保存为“底部”。
  8. 将 S+N 保存为“开始重新填充”。我们称它为R。
  9. 现在我需要找到“补充”停止的时间和地点。
  10. 所以我会将 R 与 R+1 进行比较,然后将 R+1 与 R+2 进行比较,依此类推,只要 R+N 高于 R+N-1 就重复(因为这意味着重新填充仍在进行中)并停止如果 R+N 小于或等于 R+N-1(因为这意味着重新填充已停止)。
  11. 将 R+N-1 保存为“顶部”。
  12. 减去“顶部”和“底部”,差值是重新填充到水箱中的体积。“底部”的日期/时间是该补充事件的开始,“顶部”的日期/时间是结束。

这工作得很好;但我意识到它无法管理数据中的噪音。无论出于何种原因,油箱的读数都会有一定程度的波动。

当在 R 和 R+N-1 之间进行实际重新填充时,不能 100% 保证 R(重新填充开始)和 R+N-1(重新填充结束)之间的所有数据点(我们称之为 D)总是高于它的前一个。下图:

[1,2,3,4,5,6,7,8,9,10,11, 12,11,13 ,14,15,16, 17,16,16,18 ,19,20]

如果我在上述数据集上使用我的算法,它会将“12”误认为是我的补充结束,因为下一个数据点是低于 12 的“11”。

关于如何改进我的算法以检查和消除数据中的此类噪音的任何建议?

标签: algorithm

解决方案


推荐阅读