【问题标题】:Suggestions for fragment proposal algorithm片段提议算法的建议
【发布时间】:2013-07-06 00:38:57
【问题描述】:

我目前正在尝试解决以下问题,但不确定我应该使用哪种算法。它属于大众识别领域。

我有一系列“权重”,*w_i*,它们可以总计为总重量。实测总重量存在误差,因此不准确。

我需要在给定总重量 T 的情况下找到最接近的 k 个可能的重量组合,这些组合可以总计为总重量,其中 k em> 是来自用户的输入。每个权重可以多次使用。

现在,这听起来有点像有界整数多重背包问题,然而

  • 有可能超过 重量,并且
  • 我还想要所有排名在错误方面的解决方案

我可能可以使用背包问题的多次扫描来解决它,从重量误差->重量+误差,通过以足够小的增量步进,但是如果增量太大而无法错过某些重量组合,则可能使用。

权重的数量通常很少(4 -> 10 个权重),总权重与平均权重之比通常在 2 或 3 左右

有谁知道可能适合这里的算法的名称吗?

【问题讨论】:

  • 如果只有4-10个权重,你可以暴力破解。
  • 速度是一个问题,因为需要针对不同的输入重复解决问题。此外,总重量与最小重量的比例可能相当高
  • 有多大的顾虑?我估计暴力破解 10 个或更少的元素应该花费不到一秒钟的时间。
  • 该方法需要应用于20->100个总重量,取决于测量,需要交互。
  • 你可以使用重量的分数,还是只使用完整的重量?

标签: algorithm


【解决方案1】:

您的问题实际上类似于背包问题,这是一个 NP 完全问题。

对于非常有限数量的权重,您可以通过重复来遍历每个组合,然后进行排序,从而为您提供相当多的操作;充其量:(n + k - 1)! / ((n - 1)! · k!) 用于组合,n·log(n) 用于排序部分。

现在最好通过进化算法在合理的时间内解决这类问题。

如果从 Python 中的进化算法框架 deap 中获取以下示例: ga_knapsack.py,您意识到通过修改第 58-59 行,自动丢弃超重解决方案以获得更平滑的东西(例如线性关系),它会在比蛮力更短的时间内为您提供接近最佳解决方案的解决方案。按照您的要求,最后已经为您整理好了解决方案。

【讨论】:

  • 这是个好主意,但缺少可能的解决方案是一个问题。我曾希望对背包算法进行某种形式的回溯修改是可能的,我可以解决一个超重的背包,然后向下遍历所有可能的重量组合。
  • 一个 NP 完全问题指定如果您不探索整个解决方案空间,您可能会错过解决方案。如果您总是需要最佳解决方案,那么暴力破解是强制性的。这个答案提出了一种蛮力算法。
  • 我的印象是,您仍然可以使用动态规划方法有效地选择 NP 完全问题的起点。我不确定这样的遍历是否可能 - 解决方案空间可能是“颠簸的”并且很难预测 - 我想,如果我要使用背包方法(正如我在原始问题中所述),那么问题是解决方案空间遍历 - 如果这样的事情是可能的。
  • 旅行商问题和背包问题等NP完全问题的问题在于,似乎有一个“坏”开始的解决方案很可能是一个最佳解决方案,在搜索整个之前没有人知道解空间。使用动态规划或启发式方法来丢弃解决方案空间的某些部分将有效地大大减少您的计算时间,并可能保证您丢弃尽可能少的好的解决方案(希望没有)。所以你是对的,解决方案空间颠簸的,你必须使用当前可用的处理能力来处理它。
  • 我已将此标记为最佳解决方案。我想我将不得不提出一些“好的”解决方案,使用遗传方法,并接受这些差距。
【解决方案2】:

作为第一次尝试,我会进行约束编程(但后来我几乎总是这样做,所以请接受这个建议):

  1. 假设 W=w_1, ..., w_i 表示权重,E=e_1,.., e_i 表示误差(您也可以使其不对称),以及 T。
  2. 查找所有集合 S(如果权重是唯一的,或者是一个列表)st sum w_1+e_1,..., w_k+e_k(其中 w_1, .., w_k \elem 和 e_1, ..., e_k \ elem E) \approx T 在你从 k 派生的某个 delta 内。或者只是将其设置为一个相当大的值,然后在解决约束时减小它。

我只是意识到您还想将表达式 w_n op e_m 参数化为 op \elem +, - (权重和误差项的任何组合)并且我不知道哪个约束求解器会允许你这样做。无论如何,您总是可以退回到 prolog。它可能不会飞,尤其是当你有很多重量时,但它会很快给你解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    • 2021-11-11
    • 2015-05-19
    • 1970-01-01
    • 2014-10-14
    • 2011-04-13
    • 2019-11-08
    相关资源
    最近更新 更多