algorithm - 是否有一种算法可以通过水箱水位的变化来检测水箱中的补充水
问题描述
我正在尝试编写一些代码来检测一段时间内水箱的补充。
所需的输出将是检测到的每次重新填充的开始/结束时间和体积。
我的输入是水箱液位数据点的连续流,即 24 小时内的 1,440 个数据点,每个数据点一分钟。
并且通常不会有两个连续的笔芯。每次加水后,将有一段时间的水消耗,然后才能进行另一次加水。
我的算法的当前设计是这样的:
- 按日期/时间对 1,440 个数据点进行排序,从最旧到最新开始。
- 将排序后的 1,440 个数据点加载到数组中。
- 从第一个数据点开始。姑且称之为S吧。
- 将 S 的水位与 S+1 进行比较。
- 如果 S+1 小于 S,则表示它处于“消费”模式。
- 重复 S+1 与 S+2 的比较,然后 S+2 与 S+3 以此类推,直到我到达 S+N 返回的水位高于 S+N-1 的点,这意味着“ refill”模式已启动。
- 将 S+N-1 保存为“底部”。
- 将 S+N 保存为“开始重新填充”。我们称它为R。
- 现在我需要找到“补充”停止的时间和地点。
- 所以我会将 R 与 R+1 进行比较,然后将 R+1 与 R+2 进行比较,依此类推,只要 R+N 高于 R+N-1 就重复(因为这意味着重新填充仍在进行中)并停止如果 R+N 小于或等于 R+N-1(因为这意味着重新填充已停止)。
- 将 R+N-1 保存为“顶部”。
- 减去“顶部”和“底部”,差值是重新填充到水箱中的体积。“底部”的日期/时间是该补充事件的开始,“顶部”的日期/时间是结束。
这工作得很好;但我意识到它无法管理数据中的噪音。无论出于何种原因,油箱的读数都会有一定程度的波动。
当在 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”。
关于如何改进我的算法以检查和消除数据中的此类噪音的任何建议?
解决方案
推荐阅读
- spring-batch - Spring Batch ORA-08177: 无法序列化此事务的访问
- angular - Jasmine 没有检测到输入的变化,可能是错误的测试错误的策略
- django - 使用 __gte 在 django 中进行日期过滤不会添加撇号
- kubernetes - Kubernetes 使用一个部署文件创建多个部署
- java - Jpql 没有通过两级提取获得空值
- here-api - HereMaps 定价中的“每月资产”是什么意思?
- python - 如何在 HTML 中获取文件的完整路径位置
- gradle - 从自定义插件动态加载 Gradle 插件
- javascript - PSPDFKIT instance.addEventListener('annotations.create') 缺少注释类型
- typescript - 强类型工作者