最小浪费打印作业分组算法?

时间:2011-04-10 01:14:11

标签: algorithm printing grouping

我在一家出版社工作,我正在设置一台“帮派”印刷机,换句话说,同时印刷多个作业。鉴于不同的打印作业可以有不同的数量,并且一次可能需要考虑1到20个作业,问题在于确定将哪些作业组合在一起以最大限度地减少浪费(来自过度打印的废物在较小的情况下 - 给定集合中的数量作业,即)。

鉴于以下稳定数据:

  1. 所有工作在空间大小方面都是相同的 - 不考虑纸上的位置。
  2. 有三个“通道”,意味着可以同时打印三个作业。
  3. 理想情况下,每条车道都有一份工作。部分问题是最小化每个作业的运行次数。
  4. 如有必要,可以在两条车道上开展一项工作,在第三条车道上开第二份工作。
  5. 来自给定工作组的“分组”浪费(假设它们的数量是x,y和z)将是最高数字减去两个较低数字。因此,如果x是较高的数字,则分组浪费将是(x-y)+(x-z)。否则说明,通过打印作业Y和Z(超过其数量)产生的废物达到X的数量。分组废物将是给定集合的限定符,这意味着它不能超过一定数量或作业将只需单独打印。
  6. 所以提出了这样的问题:如何根据1的限定条件确定哪些作业集合在一起,在任何给定数量的作业中,三个相似的数量或2)两个数量,其中一个大约是另一个的两倍,AND的目的是最大限度地减少各组的总分组浪费。

    (编辑)数量信息: 外语的典型工作量可以是150到350,英文打印时的工作量可以是500到1000。此数据可用于为算法设置某些方案。例如,假设您有5个工作:

    1000,500,500,450,250

    通过观察,我可以看到几个答案。显然(1000/500/500)效率不高,因为你的分组浪费为1000.(500/500/450)更好,因为你会浪费50,但随后你跑(1000)和( 250)单独。但你也可以在两条车道(500/250)上运行(1000/500),在两条车道上运行500,然后单独运行(450)。

    就通道最小化与浪费的权衡而言,我们可以说任何超过200的分组浪费都是过度的。

    (结束编辑)

    ......不用说,这是一个很大的问题。 (对我来说。)

    我是一名技术熟练的程序员,但我对算法并不熟悉,而且我对该领域的数学还没有充分研究。我是I / P写的一种蛮力程序,它只是尝试所有选项,忽略了任何似乎有过多分组浪费的选项树。但是,我不禁希望有一种更简单,更有效的方法。

    我已经查看了各种网站,试图找到更多关于算法的信息,并且一直在通过符号系统,但它进展缓慢。不幸的是,维基百科关于这个主题的文章非常依赖于交叉,并且很难找到“in”。我唯一能够找到的东西似乎就是我需要的粗略算法类型的定义:“独家距离聚类”,一维地说。

    我确实看过这个网站上普遍提到的算法,Bin Packing one,但是我无法确切地看到它如何解决我的问题。

3 个答案:

答案 0 :(得分:2)

这似乎与传统的运筹学“切割库存”问题类似。对于正式的数学处理尝试 http://en.wikipedia.org/wiki/Cutting_stock_problem

我使用延迟色谱柱生成技术编写了切割原料问题的解决方案,该技术来自Robert W. Haessler撰写的“启发程序选择和设计解决滚动修剪问题”(管理科学,2008年12月)。我毫无问题地测试了一百卷。了解如何从第一次迭代中获取残差,并使用它们为下一次迭代设计新方程非常有趣。看看你是否可以掌握这篇论文,因为作者讨论了更接近你问题的变体。

如果你采用一种可行的技术,我建议使用一个强大的线性代数求解器,而不是重新发明轮子。虽然单纯形法很容易为自己编写分数解法,但你在这里处理的更难 - 这是一个混合整数问题。对于使用例如的现代C混合整数求解器(MIP)。分支机构绑定,使用Java / python绑定我建议lp_solve

当我写这篇文章时,我发现this NEOS guide page很有用。在线求解器看起来已经不复存在了(对我而言,它返回perl代码而不是执行它)。还有一些背景信息。

编辑 - 一些注意事项:我将总结您的问题与切割库存之间的差异: 1)切割原料具有不可分割的输入长度。您可以通过多次运行问题来模拟您的可分解问题,将作业分解为1.0,{0.5,0.5}时间原始长度。 2)你的'打印长度'映射到节长度 3)选择大库存长度

答案 1 :(得分:1)

我打算尝试攻击“理想”案例,在这种情况下,任何工作都不会在工作线之间分开或单独打印。

设n为作业数,向上舍入到最接近的3的倍数。可以创建虚拟零长度作业,使作业数为3的倍数。

如果n = 3,这是微不足道的,因为只有一种可能的解决方案。因此假设n> 3。

具有最高数量的工作(或者如果存在多个工作之一)必然是最长工作组中的最高工作组或最高工作组(或者如果存在并列关系则是联合最长工作组之一)。等数量的工作是可以互换的,所以如果有平局,只需选择一个并将其称为最高工作。

因此,如果n = 6,则您有两个工作组,其中最长或相等的工作组具有固定的最高或联合最高数量的工作。所以唯一的问题是如何在小组之间安排其他5个工作。计算分组浪费的公式可以表示为2Σh i - Σx j 其中h i s是最高的数量。每个组和x j s是其他数量。因此,从一种可能的解决方案转移到另一种可能的解决方案将涉及将其中一个h与x中的一个进行交换。 (如果你将h中的一个与h中的另一个交换,或者将x中的一个交换为x中的另一个,那么它将没有任何区别,所以你不会转移到另一个解决方案。)因为h 2 是固定的,x 1 和x 2 对我们来说没用,我们实际上想要最小化的是w(h 1 ,x 3 ,x 4 )= 2h 1 - (x 3 + x 4 )。如果h 1 < = x 3 < = x 4 ,这是一个最佳分组,因为没有交换可以改善这种情况。 (为了看到这一点,让d = x 3 - h 1 并注意w(x 3 ,h 1 ,x 4 ) - w(h 1 ,x 3 ,x 4 )= 3d是非-negative,并且通过对称,相同的参数适用于与x 4 交换。因此处理案例n = 6。

对于n = 9,我们有8个可以移动的工作,但同样,移动最短的两个也没用。所以这次的公式是w(h 1 ,h 2 ,x 3 ,x 4 ,x < sub> 5 ,x 6 )= 2h 1 + 2h 2 - (x 3 + x 4 + x 5 + x 6 ),但这次我们有h 2 的约束条件小于公式中的第二小x(否则它不能是任何组中的最高或联合最高)。如前所述,h 1 和h 2 不能相互交换,所以要么用适当的x交换其中一个(不违反约束),或者你交换它们,每个都有一个不同的x。取h 1 &lt; = x 3 &lt; = x 4 &lt; = h 2 &lt; = x 5 &lt; = x 6 。同样,单次掉期也无济于事,双重交换也无济于事,因为它的影响必然是两次单次掉期影响的总和。同样,这是一个最佳解决方案。

看起来这个论点适用于任何n。在这种情况下,当你有一个“理想情况”(在我的答案的顶部定义)时找到一个最佳解决方案将很简单:按数量对作业进行排序,然后将已排序的列表分成连续的3个组如果这个解决方案证明不合适,你知道你没有一个理想的案例。

我会考虑非理想情况,如果我想出任何答案,请更新这个答案。

答案 2 :(得分:0)

如果我理解了这个问题(我不确定),解决方案就像在所有三个通道中打印作业1一样简单,然后在所有三个通道中打印作业2,然后在所有三个通道中打印作业3。 / p>

最糟糕的情况是每份工作打印两张额外的纸张。

我可以想到这不是最优的情况(例如,三个工作,每个工作四页,而不是四页),但开发比Bin Packing解决方案(这是NP-complete;随着时间的推移,三个车道中的每一个都代表了箱子。)