片段提议算法的建议

时间:2013-07-04 13:18:39

标签: algorithm

我目前正在尝试解决以下问题,但我不确定应该使用哪种算法。它在质量鉴定领域。

我有一系列“重量”,* w_i *,可以总计总重量。测得的总重量有一个与之相关的误差,因此不准确。

我需要找到,总重量 T ,最接近的 k 可能的权重组合,总计可达总数,其中 k 是来自用户的输入。每个重量可以多次使用。

现在,这听起来像是有界整数的多背包问题,但

  • 可以超过重量,
  • 我还想要所有排名的解决方案的错误

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

重量的数量通常很小(4 - > 10重量),总重量与平均重量的比率通常约为2或3

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

2 个答案:

答案 0 :(得分:1)

你的问题有效地类似于背包问题,这是一个NP完全问题。

对于非常有限数量的权重,你可以重复使用每个组合,然后进行排序,这样可以进行大量的操作;最多:(n + k - 1)! / ((n - 1)! · k!)表示组合,n·log(n)表示排序部分。

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

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

答案 1 :(得分:0)

作为第一次尝试,我会选择约束编程(但后来我几乎总是这样做,所以请用一点点盐来提出建议):

  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)\大约在你从k得到的delta中。或者只是将其设置为一个相当大的值,并在解决约束时减少它。
  3. 我只是意识到你还希望将表达式w_n op e_m参数化为op \ elem +, - (权重和错误术语的任意组合)并且在我的脑海中我不知道哪个约束求解器会允许你这样做。无论如何,你总是可以回到prolog。它可能不会飞,特别是如果你有很多重量,但它会很快给你解决方案。