好吧,这可能是一个棘手的问题。它实际上是与我的实际应用相关的另一个类似问题的类比,但为了清楚起见,我已将其简化为这个假设问题。这是:
我目前的解决方案并不考虑后一种情况,听起来他们会涉及一些复杂的工作来解决它们。
请注意,这适用于客户端Web应用程序,因此制作解决方案apply to Javascript会有所帮助!
答案 0 :(得分:2)
如果有可能,我建议将其作为混合整数程序。如果您可以在此编码约束,则可以使用求解器来满足约束。 有关此类方法的更多信息,请参阅此页面:
http://en.wikipedia.org/wiki/Linear_programming
如果你能以某种方式将它与Javascript连接起来,那么它可能被证明是一种优雅的解决方案。
答案 1 :(得分:1)
我不太善于解决算法问题。但这是我的尝试:
相关联答案 2 :(得分:1)
起初,我试图将此视为排序问题。但我认为最好将其视为优化问题。让我试着将问题正式化。给出:
问题是要找到一个 i 的排列,这样成本函数:
J = sum(i = 1,n,w a i * sum(j = 1,i-1,l a j 子> 子>))
被最小化并且约束:
sum(j = 1,i-1,l a j )< = m i ,1< = i< ñ
满意。
但是,我不确定这是一个正确的表述。没有任何限制,最佳解决方案并不总是按重量分类的棒。例如,设l = {1,4},w = {1,3}。如果a = {1,2},则J是1 * 0 + 3 * 1 = 3,并且如果a = {2,1}(按重量排序),则J是3 * 0 + 1 * 4 = 4。显然,未排序的解决方案可以最大限度地降低成本函数,但我不确定这是否是您想要的。另外,我还不知道如何解决这个问题。您可以在短期内尝试某种启发式搜索。我正在编写这个重新制定,以便其他人可以提供解决方案,同时我更多地考虑解决方案。如果它是正确的,当然。
需要注意的另一点是,您无需找到完整的解决方案即可查看是否存在解决方案。您可以忽略没有位置限制的杆,并尝试仅使用受约束的杆来解决问题。如果有一个解决方案,那么问题确实有一个解决方案(一个明显的次优解决方案是对无约束杆进行排序,并将它们附加到减少问题的解决方案上)。
说完这一切后,我认为下面的算法可以解决问题。我将在视觉上描述它以使其更容易理解。根据您的问题描述,我们的想法是将杆从左到右放置在线段上(原点是线段的最左侧点)。
关于算法的一些注释:
它没有解决我之前说过的问题。它试图仅根据它们的重量对杆进行分类。
我认为有一些失去的机会可以做得更好,因为我们将一些杆向原点滑动以使它们全部适合(在步骤3中),并且有时从这些“挤入”的地方拾取重杆,并使它们更靠近原点(步骤4)。这释放了一些空间,但我们不会将被推开的杆滑回到受约束位置的极限。有可能这样做,但是当我的大脑工作得更好时,我将不得不修改算法。
这不是一个非常有效的算法。我觉得它可以在O(n ^ 2)中完成,但更好的是需要创造性的数据结构。你需要能够找到比O(n)更快的长度小于给定L的最重的杆来做得更好。
答案 3 :(得分:1)
我99%肯定这可以作为一个整数背包问题加上一个额外的约束,我认为可以通过首先考虑具有起始距离条件的杆来解决这个问题。
以下是背包问题解释的链接:http://www.g12.cs.mu.oz.au/wiki/doku.php?id=simple_knapsack