【问题标题】:Algorithm for picking data so that their sum is a specified number, but prefer older data挑选数据的算法,以便它们的总和是指定的数字,但更喜欢旧数据
【发布时间】:2015-09-10 19:10:06
【问题描述】:

我正在尝试实现具有以下要求的功能,但很难提出算法。

我的数据包含一个正整数值和一个日期。数据的数量从 100 ~ 10,000 不等。

-------------------------
 id | value |    date
-------------------------
 1  | 10    | 2015-01-01
 2  | 10    | 2015-01-02
 3  | 20    | 2015-01-02
  ....................
960 | 30    | 2015-09-10
961 | 15    | 2015-09-10

还有一个指定的目标值,即 5,000。

我想找到一个数据的组合,使它们的值之和等于目标,并且它们包含尽可能多的旧数据。 (目标数必须匹配,不先用最旧数据有组合也可以)

谁能告诉我如何实现它?

【问题讨论】:

  • 很难判断数据的年龄是否比与目标总和的接近匹配更重要。对于第一次尝试,我会按年龄(或首先按年龄,然后按大小,以便较大的项目首先出现)对数据进行排序,然后以贪婪的方式获取该序列中的元素;如果不合适,请跳过一个项目。
  • 请注意,这是 Subset-Sum(NP-Complete)的一种变体,但有“首选旧数据”的限制
  • @Codor > 这就是我首先提出的,但两种方式都有其缺陷。仅按年龄可能不会导致实际组合。先选择大值可能会导致从未(或需要很长时间)选择较小的值。
  • 让我们这样问 - 哪个更好:5 件物品的确切数量,或 1 件的数量,4 件相同的物品和五分之一,比 oe 更旧?
  • @shapiro.yaacov > 目标编号必须匹配。我更新了问题。

标签: algorithm


【解决方案1】:

一种基于子集和伪多项式解决方案的方法可能是:

首先,对条目进行排序,使最旧的在最后,最新的在第一。然后,根据公式生成DP矩阵:

D(i,0) = true
D(0,x) = false         x!= 0
D(i,x) = D(i-1,x) OR D(i-1, x-value[i])

这个矩阵的大小是(n+1) * (target+1)

接下来,如果可能的话,通过贪婪地选择(从最后一个到第一个)来生成一个解决方案:

t = target
i = n
sol = [] //empty list
while (t != 0):
    if D(i-1,t-value[i] == true):
        sol.append(i) //item i in the solution
        t = t - value[i]
    i = i-1 //either case

这保证:

  1. sol 的值与目标相加
  2. 任何可行解决方案中的最旧值将位于sol

【讨论】:

    【解决方案2】:

    显然问题可以解释为knapsack problem。注意这个问题是NP-hard。它可以通过dynamic programming 求解到最优,并承认FPTAS

    可以通过以下方式对问题进行建模。项目利润和重量是项目的价值(这意味着问题可以简化为https://en.wikipedia.org/wiki/Subset_sum_problem)。让C 表示指定的目标值。按值对项目进行分组;对于值v,让我们只保留floor(C/v) 最旧的项目,其中floor 表示向下舍入。在背包求解器生成一个解之后,将值v(对于每个值v)的解中最多floor(C/v)项替换为之前选择的最旧的项。

    【讨论】:

    • 这并不完全正确。背包更喜欢小于最大容量的更高价值组合,而这里似乎 - 他想要的正是最大容量。一个反例是[(10,1.1.15), (10,1.2.15), (30,1.3.15)],目标值 = 30
    • 嗯,我明白了。背包问题可能有一个不消耗总容量的最优解,但问题要求尽可能消耗总容量;这可以以某种方式解决吗?
    猜你喜欢
    • 2020-05-30
    • 1970-01-01
    • 2014-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2018-05-19
    • 2021-10-01
    相关资源
    最近更新 更多