我想要一些帮助来找到问题的良好算法,但是我什至无法弄清楚如何抽象这个问题,所以我将把这个问题作为我想要的例子来写。
说我有一个2种类型的项目( A 和 B )的列表,它们都有一个值。列表看起来像这样:
我的问题是,我想针对以下规则制作尽可能多的商品组:
算法的输出应为:
找到2个群组:
问题的参数可能有所不同:
我几乎可以肯定这种算法的存在,这让我想到了背包问题,但实际上我什至不知道要搜索什么。
更新:以下是我为解决此问题而制作的算法,可帮助您更好地了解我的需求。
算法1
此算法仅提取必需项,以达到每种类型的必需项数并达到最小和。
此算法取决于列表的顺序,并返回单个组:
速度非常快,但没有给我想要的结果。
算法2
此算法计算原始列表的所有可能排序,并在所有可能的情况下执行算法1。
然后,它从结果中取出最大的组数,并返回具有该组数的第一种可能性。
输出是我期望的:
找到2个群组:
问题在于它具有指数级的复杂性,它在5个项目(120种可能性)中速度很快,而在10个项目(3628800种可能性)中速度慢。
我需要的是一种从算法2获得结果的算法,但是速度更快,我需要一种启发式方法,但是...如何?
答案 0 :(得分:1)
可以通过数学约束求解器轻松解决:
我们使用以下术语:
然后,必须具有以下等式才能得到有效的解决方案:
然后我们简单地最大化
T = i = 0到n的2的总和^ G_i-1
这将为每个空组添加一个0,为每个非空组添加一个更大的值。