注意:这是关于在SWF文件中排序记录的现实问题的抽象重写.解决方案将帮助我改进开源应用程序.
鲍勃有一家商店,想要出售.他的商店里有很多产品,每种产品都有一定数量的单位库存.他还有许多货架价格标签(与产品数量一样多),价格已印在他们身上.他可以在任何产品上放置任何价格标签(该产品的整个库存的一件商品的单一价格),但是某些产品有额外的限制 - 任何此类产品可能不比某个其他产品便宜.
您必须找到如何安排价格标签,以便所有Bob的商品的总成本尽可能低.总成本是每个产品的分配价格标签的总和乘以库存中的产品数量.
鉴于:
该计划必须找到:
满足条件:
请注意,如果不是第一个条件,解决方案将只是按价格和产品按数量对标签进行排序,并直接匹配.
输入的典型值为N,K <10000.在现实生活中,只有几个不同的价格标签(1,2,3,4).
这是为什么大多数简单解决方案(包括拓扑排序)不起作用的一个例子:
您有10件商品,数量1到10,以及10个价格标签,价格为1到10美元.有一个条件:数量为10的物品不得低于数量为1的物品.
最佳解决方案是:
Price, $ 1 2 3 4 5 6 7 8 9 10
Qty 9 8 7 6 1 10 5 4 3 2
Run Code Online (Sandbox Code Playgroud)
总成本为249美元.如果将1,10对放在任何一个极端附近,总成本会更高.
小智 16
对于一般情况,问题是NP完全的.这可以通过减少3分区(这是一个仍然很强的NP完整版本的bin包装)来显示.
令w 1,...,w n为3分区实例的对象的权重,令b为bin大小,k = n/3为允许填充的bin的数量.因此,如果可以对对象进行分区,则每个bin只有3个对象,则存在3分区.
对于减少,我们设置N = kb并且每个箱由相同价格的b价格标签表示(考虑P i增加每个第b个标签).让吨我,1≤ 我 ≤ ķ,是对应于该标签的价格我第斌.对于每瓦特我我们有一个产物S Ĵ数量的瓦特我 + 1(让我们称之为本的根产品瓦特我)和另一瓦特我 - 1种产品的数量1,其被要求是除S便宜Ĵ(称这些留下产品).
对于吨我 =(2B + 1)我,1≤ 我 ≤ ķ,有3分区当且仅当鲍勃可以卖2BΣ 1≤ 我 ≤ ķ 吨我:
所以,这是破坏性的部分;-)但是,如果不同价格标签的数量是常数,您可以使用动态编程在多项式时间内解决它.
这个问题类似于CS文献中考虑的许多调度问题.请允许我重申它.
问题("具有优先级,权重和一般迟到罚分的非抢先式单机调度")
输入:
工作1,...,n
工作中的"树状"优先关系(Hasse图是森林)
权重w 1,...,w n
从{1,...,n}到Z +的非递减的迟后罚函数L(t)
输出:
通讯:工作<=>产品; 我预先j <=>我的价格低于j; 重量<=>数量; 值L(t)<=>吨个最低价格
当L是线性时,由于Horn [1],存在一种有效的多项式时间算法.这篇文章是支付墙的背后,但主要的想法是
对于所有j,找到仅包含j及其平均权重最大的后继的连接作业集.例如,如果n = 6并且优先约束是1 prec 2和2 prec 3和2 prec 4和4 prec 5,则考虑2的集合是{2},{2,3},{2,4 },{2,3,4},{2,4,5},{2,3,4,5}.我们实际上只需要最大平均权重,可以通过动态编程自下而上计算.
按照相关集合的平均权重顺序安排工作.
在CyberShadow的例子中,我们有n = 10和1 prec 10和w j = j和L(t)= t.在步骤1中计算的值是
工作1:5.5(平均1和10)
工作2:2
工作3:3
工作4:4
工作5:5
工作6:6
工作7:7
工作8:8
工作9:9
工作10:10
最佳顺序是9,8,7,6,1,10,5,4,3,2.
即使对于不同的L选择,该算法在实践中也可以很好地工作,因为最优性的证明使用局部改进.或者,也许CS Theory Stack Exchange上的某个人会有一个想法.
[1] WA Horn.具有树状优先级排序和线性延迟惩罚的单机作业排序.SIAM应用数学杂志,Vol.23,No.2(1972年9月),第189-202页.