Algorithm 预测长流程的完成时间有哪些好方法?

Algorithm 预测长流程的完成时间有哪些好方法?,algorithm,language-agnostic,time,prediction,file-copying,Algorithm,Language Agnostic,Time,Prediction,File Copying,tl;dr:我想预测文件拷贝完成情况。考虑到开始时间和当前进度,有哪些好方法? 首先,我知道这根本不是一个简单的问题,预测未来很难做好。在上下文中,我试图预测长文件副本的完成情况 当前方法: 目前,我正在使用我自己提出的一个相当幼稚的公式:(ETC代表预计完成时间) 这是基于这样的假设,即要复制的其余文件将以迄今为止的平均复制速度进行复制,这可能是一个现实的假设,也可能不是一个现实的假设(此处处理磁带存档) PRO:ETC将逐渐变化,并随着过程接近完成而变得越来越精确 缺点:它对意外事件的反应

tl;dr:我想预测文件拷贝完成情况。考虑到开始时间和当前进度,有哪些好方法?

首先,我知道这根本不是一个简单的问题,预测未来很难做好。在上下文中,我试图预测长文件副本的完成情况

当前方法:

目前,我正在使用我自己提出的一个相当幼稚的公式:(ETC代表预计完成时间)

这是基于这样的假设,即要复制的其余文件将以迄今为止的平均复制速度进行复制,这可能是一个现实的假设,也可能不是一个现实的假设(此处处理磁带存档)

  • PRO:ETC将逐渐变化,并随着过程接近完成而变得越来越精确
  • 缺点:它对意外事件的反应不好,例如文件副本卡住或快速加速
另一个想法:

我的下一个想法是记录最后n秒的进度(或者几分钟,因为这些档案需要几个小时),然后做一些类似的事情:

ETC = currTime + currAvg * (totalSize - sizeDone)
这与第一种方法相反,因为:

  • PRO:如果速度变化很快,ETC将快速更新以反映当前情况
  • CON:如果速度不一致,ETC可能会跳转很多次
最后

我想起了我在uni上过的控制工程课程,那里的目标基本上是试图建立一个对突然的变化做出快速反应的系统,但不是不稳定和疯狂的

话虽如此,我能想到的另一个选择是计算上述两项的平均值,或许可以加上某种权重:

  • 如果副本具有相当一致的长期平均速度,则对第一种方法的权重更高,即使它在局部有点跳跃
  • 如果复制速度不可预测,并且可能会长时间加速/减速,或者长时间完全停止,则对第二种方法的权重更高
我真正想要的是:

  • 我给出的两种方法的任何替代方法
  • 如果以及如何结合几种不同的方法来获得最终预测

如果您认为预测的准确性很重要,那么构建预测模型的方法如下:

  • 收集一些真实世界的测量数据
  • 将它们分成三个不相交的集合:训练、验证和测试
  • 提出一些预测模型(你已经有了两个加上一个组合),并使用训练集进行拟合
  • 在验证集上检查模型的预测性能,并选择性能最佳的模型
  • 使用测试集评估所选模型的样本外预测误差
  • 我冒昧地猜测,对于手头的问题,您当前模型的a和“过去n秒的平均值”将表现得相当好。线性组合的最佳权重可使用(中的一个线性)进行拟合

    研究统计学习方法的一个很好的资源是Hastie、Tibshirani和Friedman提供的。那本书我推荐得太高了

    最后,您的第二个想法(过去n秒的平均值)尝试测量瞬时速度。一种更可靠的方法可能是使用,其目的正是:

    其目的是使用随时间观察到的测量值,包括 噪声(随机变化)和其他不准确,并产生值 这往往更接近测量值的真实值 它们的相关计算值


    使用卡尔曼滤波器而不是固定的n秒滑动窗口的主要优点是它是自适应的:当测量值比稳定时跳得更多时,它会自动使用更长的平均窗口。

    我已经实施了两种不同的解决方案来解决此问题:

  • 开始时电流传输的ETC基于历史速度值。该值在每次传输后都会细化。在传输过程中,我计算了历史数据和当前传输数据之间的加权平均值,因此越靠近终端,传输的实际数据的权重就越大

  • 显示时间范围,而不是显示单个ETC。这个想法是从最后n秒或分钟计算ETC(就像你的第二个想法)。我跟踪最佳和最坏情况的平均值,并计算一系列可能的ETC。这在GUI中显示有点混乱,但在命令行应用程序中显示也可以


  • 嗯,糟糕的ETC实现被广泛滥用,这使得我们能够。有时,最好显示事实而不是估计,例如:

    • 已复制10个文件中的5个
    • 已复制200 MB中的10个
    或者展示事实和估计,并表明这只是一个估计。但我不会只展示一个估计


    每个用户都知道ETCs通常是没有意义的,然后很难区分有意义的ETC和无意义的ETC,特别是对于没有经验的用户。

    这里有两件事要考虑:

    • 精确估计
    • 如何将其呈现给用户
    1。关于估算

    除了统计方法外,在消除一些噪声或尖峰的同时对当前速度进行良好估计的一种简单方法是采用加权方法

    您已经尝试过滑动窗口,这里的想法是使用一个相当大的滑动窗口,但不是普通的平均值,而是将更多的权重赋予更多的re
    ETC = currTime + currAvg * (totalSize - sizeDone)
    
    Speed = (10 * x0 + 9 * x1 + 8 * x2 + ... + x9) / (10 * window-time) / 55
    
    real-completion = 0.4
    presented-completion = real-completion * factor(real-completion)