动态编程:最小浪费和最小批量

时间:2018-11-04 18:16:41

标签: php dynamic-programming knapsack-problem greedy minimum-spanning-tree

我正在一个项目中,我需要以一种优化的格式来创建数据,以免使框架变慢。
问题是:
假设您已从我的电子商务商店订购了产品的 12个单位。对于该产品,我有 5个不同的捆绑包,可以提供如此大量的商品。
假设捆绑商品中以 序列号作为键 和捆绑中可用的 max个单位作为值 的捆绑商品阵列如下:

$arr = array(
array('sr_no1'=>5),
array('sr_no2'=>7),
array('sr_no3'=>2),
array('sr_no4'=>9),
array('sr_no5'=>12)
);

现在,我的贪婪方法有两个主要条件,即放弃客户要求的数量。

  1. 应该有最小的浪费,例如如果您订购11个单位,那么您将给出9 + 2-11 = 0的浪费,而不是从12-11 = 1的浪费中得到
  2. 应该从最小手数/捆数中选择
  3. 值,例如,如果订购12个单位,则有5 + 7-12 = 0浪费和12-12 = 0浪费,因此我们将选择array('sr_no5'=> 12)赠送所需数量。

最近3天,我一直在努力寻找解决方案。

  

考虑订购12个或11个或6个数量的测试用例   或35或30,等等。

因此,我需要的是我们将选择分配数量的数组,例如array('sr_no5'=> 12),用于分配12个数量的有序单位和arrays array('sr_no3'=> 2) ,array('sr_no4'=> 9)用于分配11个数量的单位。

在尝试找出解决方案时,我尝试了背包,贪婪和最小生成树。
请找到最优化的解决方案,因为我们不想使服务器超时。

  

注意:以上所有值,例如订购的数量/单位否。的   包每个包中的最大可用单位是变量,可以   更改任何编号。的情况。

2 个答案:

答案 0 :(得分:0)

不确定算法,但可以通过为每个束分配一个二进制值0或1来查看所有可能的结果。11000等于5 + 7 + 0 + 0 + 0(12),00010等于0 + 0 + 0 + 9 + 0等

然后基于该伪二进制值和所提供的总数构建一个主数组。

然后按匹配项(或最接近的匹配项)过滤,查看哪个结果的数量最少为1。 这很粗糙,但是可以用。

答案 1 :(得分:-1)

它看起来像3部分算法:

  1. 获取具有所有可能的束组合的数组
  2. 过滤可能的解决方案:所有提供了比所需数量更多或更多的项目的解决方案
  3. 按偏好排序(PHP: Sorting Arrays):
    1. 首先是那些浪费最少的人
    2. 首先浪费那些捆的数量
    3. 首先浪费小捆的那些

您可以优化代码统一部分 1 2 ,在创建阵列时过滤可能的解决方案。可能有许多可能的编程模式,甚至库也可以实现此目的。根据影响每种情况的捆绑包的数量,进行如此多的优化将过于熟练。

相关问题