定义具有复杂性的子集和的特殊情况

时间:2014-10-09 02:54:19

标签: algorithm dynamic-programming knapsack-problem subset-sum

我有一个问题,我有很多问题。首先,我主要寻求帮助来描述和理解手头的问题。解决方案总是受欢迎的,但最重要的是,我可以使用比我更有经验的人的建议。现在,对于手头的问题:

我有一组订单,每个订单都需要一定数量的商品。我还有几个项目分组,每个项目都包含一些项目(称为组)。目标是找到可以使用尽可能少的组来完成的订单的子集,并且订单中包含的项目总数在n和N之间。

编辑:对订单中包含的项目数量(n和N)的约束是独立选择的。

至少对我来说,这是一个非常复杂的说法问题,所以我一直试图将其重新定义为背包问题(我怀疑这可能会减少到子集数)。为了帮助我理解这一点,我开始使用以下定义:

  • 首先,我们假设每个可能的项目都存在一个维度,并且有些东西长度为'在该维度中,它是具有或需要的特定类型项目的数量。

  • 由此,订单成为&n; n维对象'其中每个维度的值对应于其所需项目的数量。

  • 此外,一组可以被视为一个&n;维度框'每个维度中的空格与其提供的项目数相对应。

  • 对象值等于所有维度的长度总和。

  • 可以组合盒子。

鉴于上述情况,我已将问题重新解释为:

  • 可以容纳n和N之间值的项目组合的最小盒子组合是什么。

问题#1:这是表达问题的正确/有用的方法吗?我似乎错过了任何明显的事情吗?

正如我所看到的,由于我正在寻找两种组合,我需要将问题分成两部分。到目前为止,我认为像这样解决问题是一个很好的步骤:

  1. X可以装箱(或箱子组合)多少个物品?

  2. 检查所有(或最好是一小部分)盒子的可能组合,然后选择最佳的'

  3. 这使得它更容易管理,但我仍然在努力解决细节问题。

    问题#2: 解决要解决第一部分,我认为说对象的成本等于其总和是合适的。所有维度的长度,它的价值也是如此。这让我陷入了一个子集和问题,对吧?显然这是一个特例,但这个问题有名吗?

    问题#3: 解决了我一直在研究子集和解决方案,但我不明白如何应用它们这样的事情在多个方面。我认为它之前已经完成,但我不确定从哪里开始我的研究。有人可以描述工作中的原则还是指出我的研究方向?

    编辑:在查看了所有人的反馈并深入研究了这些术语后,我认为我已经找到了一个很好的算法来解决第1部分。因为我会有一个与使用原始有效容量启发式(PECH)'的项目数量相比,维度数量非常多。将是一个很好的选择。如果他们有使用这种算法的经验,我有兴趣听听有人的想法。

    问题#4:对于第二部分,性能是一个问题,我怀疑暴力行为是否现实。因此,我打算将所有盒子组合视为一个非常大的解决方案树。我们的想法是为M-1盒的所有组合计算第1部分,其中M是盒子的总数。以某种方式决定最好的'来自该集合的几个盒子组合,并对树上的子节点执行相同的操作。听起来这有助于我达到接近最佳状态吗?我如何选择最好的'盒子组合?

    感谢阅读!欢迎提出编辑和澄清建议。

0 个答案:

没有答案