我目前正在尝试解决以下问题,但我不确定应该使用哪种算法。它在质量鉴定领域。
我有一系列“重量”,* w_i *,可以总计总重量。测得的总重量有一个与之相关的误差,因此不准确。
我需要找到,总重量 T ,最接近的 k 可能的权重组合,总计可达总数,其中 k 是来自用户的输入。每个重量可以多次使用。
现在,这听起来像是有界整数的多背包问题,但
我可以使用背负问题的多次扫描来解决它,从重量误差 - >重量+误差,通过以足够小的增量步进,但是如果增量太大而不能错过某些重量组合,则可能可以使用。
重量的数量通常很小(4 - > 10重量),总重量与平均重量的比率通常约为2或3
有谁知道这里可能合适的算法名称?
答案 0 :(得分:1)
你的问题有效地类似于背包问题,这是一个NP完全问题。
对于非常有限数量的权重,你可以重复使用每个组合,然后进行排序,这样可以进行大量的操作;最多:(n + k - 1)! / ((n - 1)! · k!)
表示组合,n·log(n)
表示排序部分。
在合理的时间内解决这类问题最好通过现在的进化算法来完成。
如果从deap中获取以下示例,Python中的演化算法框架: ga_knapsack.py,您意识到通过修改自动丢弃超重解决方案的第58-59行(例如线性关系),它会在比蛮力更短的时间内为您提供接近最佳解决方案的解决方案。根据您的要求,最终已经为您排序了解决方案。
答案 1 :(得分:0)
作为第一次尝试,我会选择约束编程(但后来我几乎总是这样做,所以请用一点点盐来提出建议):
我只是意识到你还希望将表达式w_n op e_m参数化为op \ elem +, - (权重和错误术语的任意组合)并且在我的脑海中我不知道哪个约束求解器会允许你这样做。无论如何,你总是可以回到prolog。它可能不会飞,特别是如果你有很多重量,但它会很快给你解决方案。