要执行N个任务(彼此独立)。每个任务都使用一个资源列表(已知的前期),这些资源的获取成本很高,可用于多个任务(每个任务都有不同的列表,但有重叠)。系统按顺序处理任务,并使用具有固定大小M的缓存作为资源。缓存仅保留最近使用的资源。
问题:如何优化任务的执行顺序,以便在给定缓存M的大小的情况下最大化资源的重用(即,我们最小化我们需要获取资源的次数)?什么是缓存的最佳大小,即最小M,以便我们最多创建一次所有资源?
问题的指数解决方案相当简单,所以我要么采用多项式解决方案,要么是一个很好的近似。
答案 0 :(得分:1)
为了清晰起见,稍微改写一下这个问题。出于问题的目的:
问题是一组独立的任务,可以按任何顺序依次执行。
任务需要按特定顺序使用的一系列资源。
缓存适合一组有序的M资源,并将其项目保留在最近使用的基础上。
我们的想法是按照使缓存尽可能稳定的顺序执行任务,因为打开文件指针等都很昂贵。
我正在做出额外的假设,即确定任务顺序所需的时间并不重要(因为它与打开文件指针相比速度快)或不相关(因为顺序随后缓存在某处)。
我希望这些建议似乎是合理的:
缓存填充的顺序非常重要。因为M = 2并且使用资源[A, B, A, A, C]
的任务将在一次交换后保留缓存持有[A, C]
,如果从[A, B]
开始,而另一个使用[C, B, A, B, C]
则将保留缓存{来自[B, C]
的{1}}有2个内部交换。
有些任务比其他任务贵,我们可以将它们分成两组:廉价任务是资源数量为M或更少的任务;昂贵的任务是那些使用更多资源的人,可能的顺序是缓存在完成之前已经多次改变。
对于每项任务,乍看之下注意使用的前M个资源是合理的;最后使用的M资源;当需要超过M个资源时,两者有多么不同。尽管它实际上还有一些东西比眼睛还要多。
如果您有任何昂贵的任务,并且可以在缓存更改的中间步骤中让它们进入休眠状态,则可以进一步优化。
直观地说,我们希望以下列任务的前M个资源与正在进行的任务的最后M个资源尽可能接近的方式对任务进行排序:
第3步理想地应该以这样的方式挑选任务,即他们正在执行与步骤4-5相同的工作,这导致我们暂时回到你的第二个问题,因为它产生了有趣的见解。
避免昂贵任务的最小缓存大小直观地等于单个任务中使用的最大资源数,即为了避免步骤3以及它可以让您进入的随机状态。
但是,避免多次创建资源的最佳高速缓存大小取决于初始状态(步骤1)和我们选择的置换(步骤3-4)。通常情况下,两者在最佳情况下是相同的,并且最佳高速缓存大小最多等于资源数量。这种病态案例的一个例子是:[B, C]
。
假设您满足最小缓存大小,我们可以使用强力来找到最佳排列并确定最佳缓存大小;总是跳过步骤3,因此零成本;对于每个候选排列,我们分配运行步骤1(= M)和步骤4-5(每个资源交换1 = 1)的成本,并计算总成本 - 如果我们已经找到更好的排列,则中断该过程。
如果我们不满足最小缓存大小,我们会修改程序,因为我们还需要考虑步骤3中涉及的成本(在运行任务时每个资源交换1个=交换发生的顺序计数,所以我们对初始和最终缓存状态一无所知。)
在那个阶段,我们应该能够以最小分数计算排列集合,并选择提供最低最佳缓存大小的排列。