Bob的销售(对具有约束的对进行重新排序以最大程度地减少产品总和)


15

我前一阵子在Stack Overflow上问过这个问题:问题:Bob的sale。有人建议也将问题张贴在这里。

有人已经在这里提出了与此问题相关的问题- 给定基数的最小重量子森林 -但据我了解,这对我的问题没有帮助。StackOverflow上评分最高的答案也值得一看。

这是我的StackOverflow问题的逐字记录副本。该网站的格式可能不适当(哎呀,我只是在这里问这个问题而感到没有足够的知识),因此可以随时对其进行编辑:


注意:这是对现实生活中有关对SWF文件中的记录进行排序的问题的抽象措词。一个解决方案将帮助我改善开源应用程序。

鲍勃(Bob)有一家商店,并想进行销售。他的商店有许多产品,并且每种库存产品都有一定数量的单位数量。他还具有许多在架子上安装的价格标签(与产品数量一样多),并且价格已经打印在标签上。他可以在任何产品上贴上任何价格标签(该产品的全部库存价格统一为一件产品),但是某些产品还有其他限制-任何此类产品可能都不比某些其他产品便宜。

您必须找到如何安排价格标签的方法,以使鲍勃所有商品的总成本尽可能低。总成本是每种产品分配的价格标签的总和乘以该产品的库存数量。


鉴于:

  • N –产品数量和价格标签
  • 小号,0≤ <N -与指数产品的库存数量(整数)
  • P Ĵ,0≤ Ĵ <N -具有索引价格标签上的价格Ĵ(整数)
  • K –附加约束对的数量
  • ķ,B ķ,0≤ ķ <K -产品指数对附加的约束
    • 任何产品索引最多只能在B中出现一次。因此,由该邻接表形成的图实际上是一组有向树。

该程序必须找到:

  • 中号,0≤ <N -从产品索引映射到价格标签指数(P 中号是产品的价格

满足条件:

  1. P 中号ķ ≤P 中号ķ,对于0≤ ķ <K
  2. Σ(š ×P 中号)为0≤ <N是最小

请注意,如果不是针对第一个条件,则解决方案将是简单地按价格对标签进行排序,并按数量对产品进行排序,然后直接将二者进行匹配。

输入的典型值为N,K <10000。在现实生活中,只有几个不同的价格标签(1、2、3、4)。


这是为什么大多数简单的解决方案(包括拓扑排序)不起作用的一个示例:

$$

最佳解决方案是:

Price, $   1  2  3  4  5  6  7  8  9 10
Qty        9  8  7  6  1 10  5  4  3  2

$


Erm,底部示例的预格式化块变得杂乱无章,我不确定如何修复(StackOverflow的Markdown语法和<pre>标签在这里似乎不起作用)。
弗拉基米尔·潘捷列夫(Fladimir Panteleev)2011年

由于美元符号被视为TeX分隔符,因此无法识别预格式化块的标记(尽管我不知道为什么TeX标记会破坏预格式化块的标记)。因为似乎没有逃脱美元符号的“正确”方法,所以我以临时方式解决了它。
伊藤刚(Tsuyoshi Ito)

有什么问题 您想要一种(有效的)算法来寻找最佳解决方案吗?硬度?近似解?
Marcos Villagra

1
@伊藤,谢谢。@Marcos-抱歉,我正在寻找一种解决此问题的算法,希望速度足够快,以便可以在我的项目中实现它。对于近似解决方案有很多想法,因此首选精确解决方案。
弗拉基米尔·潘捷列夫2011年

1
对于它的价值,我认为相关问题(cstheory.exchange.com/q/4904/751)考虑了价格由k个1和N k个0组成的情况。
mhum 2011年

Answers:


6

我也在您关于堆栈溢出的原始问题上发布了此内容:


对于一般情况,问题是NP完全的。这可以通过减少3分区来显示(这是仍然很强的NP完整版装箱)。

w 1,...,w n为3分区实例的对象的权重,令b为料仓大小,而k = n / 3是允许填充的料仓数量。因此,如果可以对对象进行分区,则每个分区有3个对象,则存在3个分区。

对于减少量,我们将N = kb设置为,每个bin由相同价格的b个价格标签表示(想想p i每增加第b个标签就会增加)。让,1≤ ķ,是标签的对应于该价格第斌。对于每个w i,我们有一个数量为w i +1的乘积S j(以下称其为w i的根乘积),而另一个w i -1数量为1的乘积要比S j便宜 (称这些休假产品)。

对于t i =(2b +1),1≤ ķ,有3分区当且仅当Bob可以对出售2B&Sigma; 1≤ ķ

  • 如果存在3分区的解决方案,则可以在不违反限制的情况下,以相同的价格标记与分配给同一仓的对象w iw jw l对应的所有b个乘积。因此,该解决方案的成本为2b&Sigma; 1≤ ķ (因为产品的总量与价格图2b)。
  • 考虑鲍勃销售的最佳解决方案。首先要观察的是,在任何解决方案中,有3个以上的根产品具有相同的价格标签,对于每个“太多”的根产品,都有便宜的价格标签,其粘贴在少于3个根产品上。这比任何解决方案都更糟糕,因为每个价格标签仅存在3个根产品(如果存在)。
    现在,仍然存在一个Bob's Sale的解决方案,其中每个价格带有3个根标签,但其休假产品不会带有相同的价格标签(垃圾箱有点流了)。要说最昂贵的价格标签,标签的根产品W¯¯ 其中有一个更便宜的标签休假产品。这意味着3个根标签w iw jw l标有最昂贵价格的价格加起来不等于b。因此,标有该价格的产品的总成本至少为2b + 1
    因此,这种解决方案的成本为t k(2b + 1) +一些其他分配成本。因为对于一个存在3分区的最佳费用为2B&Sigma; 1≤ ķ 牛逼,我们必须表明,仅仅考虑的情况更糟糕。如果t k就是这种情况 > 2B&Sigma; 1≤ K-1 (注意,它的k-1个中的总和现在)。设置Ť =(2B + 1),1≤ ķ,是这种情况。即使不是最昂贵的价格标签也是“坏”标签,但也包含其他标签,这同样适用。

因此,这是破坏性的部分;-)但是,如果不同价格标签的数量是一个常数,则可以使用动态编程在多项式时间内对其进行求解。


7

这是对Gero的回答。这个想法是修改他的构造以显示出强大的NP硬度。

Ť一世=2b+1个一世,选择了 Ť一世=一世。现在,您必须修改参数为有奖的解决方案P=2b1个一世ķŤ一世 表示存在3个分区。

采取任意架子顺序。通过以下方式进行核算:分配w一世-1个根产品与其叶产品的数量单位。那么每个产品都有数量2。根据约束的定义,这不会转移到更高的价格。转移之后,价格将准确P。如果换档将一定数量的商品转移到较低的奖励,则原始奖励严格大于P

因此,只有所有叶产品都具有与其根产品相同的奖品,才有可能获得要求的奖品,这意味着存在3个分区。

引用SWAT 2010论文的结果,该论点表明,即使对数字和ķ 不同的价格标签,运行时间为 FķñØ1个会违反“标准复杂性假设”。这暗示了动态编程的运行时间为ñØķ 看起来还不错。


也交叉发布到原始堆栈溢出问题。


我不能接受两个答案,所以我只需要感谢您的见解:)
Vladimir Panteleev 2011年

0

这听起来像一个博弈论问题。在这种情况下,一个非常简单的暴力解决方案是:

让我们假设约束表示形式的一些不变量

S-> AkSBk | AkBkS | SAkBk

解决方案是先添加约束,然后再添加元素。例如:假设n = 10,并且有2个约束,即A1B1和A2B2。然后,根节点有3个子节点(级别2)。这3个节点中的每个节点将有7个3级子节点,每个21个节点在4级有6个子节点,依此类推。本质上,您正在运行所有可能的组合。

                A1B1 --- 1级 
               / | \
              / | \
             / | \
            / | \
    A1A2B2A1 A1B1A2B2 A2B2A1B1-2级

并种树。尽管从一开始它看起来似乎是一个可怕的解决方案,但我觉得您可以通过使用一些启发式方法和修剪来放弃追逐非常昂贵的树叶...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.