Questions tagged «heuristics»

3
用于物品运输的3d包装算法
我收到了一个建立运输估计量的任务,该估计量建议在尽可能少的盒子上最好地容纳商品: 有一组已知的矩形框大小 盒子里有很多随意的矩形物品要包装 最好使用的盒子越少越好。因为运送两个盒子1x1x1比一个盒子1x2x1贵得多。这应该是这里的优先事项。 还应该对其进行优化,以尽可能使用较小的盒子作为第二优先级。(例如:如果在一个较大的框与两个较小的框之间进行选择,则应选择较大的框) 物品可以旋转以适合盒子,但是旋转必须至少限制为45°的增量(在我的研究中,似乎有些配置允许45度旋转才能更好地将矩形盒子容纳在更大的矩形盒子中) ,以90°旋转为标准。 盒子有重量限制,物品具有任意重量(例如:大小为1x1x1的物品可能比其他2x2x2物品重) 我进行了一些研究,找到了一些关于装箱和背包问题的抽象算法,并带有以下一些蛮力变化,类似于最佳拟合算法: 在“要包装的物品”列表上按递减的顺序对物品进行排序(从大到大) 对于此列表中的每个项目: 选择“二手箱”列表上的较小箱子,该箱子有足够的剩余体积和重量限制以适合该物品(我在这里使用“适合”表示适合尺寸和重量) 如果没有这样的盒子,请从已知的可能的盒子尺寸中创建一个新的盒子,该盒子是可以容纳物品尺寸和重量的最小尺寸,并将其添加到“二手盒子”列表中。 如果一个盒子适合该物品(使用下面的拟合功能),则将其添加到“此盒子的物品”列表中,并将其从“适合盒子的物品”列表中删除,在盒子内标记其相对3d位置。 从2.1开始重复,直到“要包装的物品”列表上没有适合的物品。 上面步骤2中使用的拟合检查功能: 检查包装箱的剩余容量是否适合项目的容量。如果不是,则返回false。 检查“盒子物品”重量加上当前物品重量的总和是否小于或等于盒子重量限制。如果不是,则返回false。 检查“框的项目”列表,以选择第一个具有最小Y分量并且具有足够空间用于该项目的宽度,深度和高度的框坐标,同时将其他项目视为不可用的空间。 如果该项目不适合其当前方向,请以6种可能的旋转方式之一进行旋转,为简单起见,不假设旋转45度。(旋转会导致尺寸已被测试的尺寸可以跳过。例如:将盒子旋转180°会得到与原始位置相同的尺寸,因为所有盒子和物品的相对面尺寸都相同,因此可以忽略。) 如果没有将商品以所有可能的方式旋转回其原始方向,请从步骤3重新尝试。 如果尝试了所有旋转但没有找到合适的旋转,则将当前坐标视为不可用的空间。 如果没有可用空间检查,则返回false。否则,请从步骤3再试一次。 我想知道在给定的限制条件下是否可以找到解决我问题的最佳方法。 这似乎在理论上可行,但我还没有在代码上尝试过。我想知道我是朝着正确的方向走,还是有更好,更高效的方法来做到这一点。 参考会很棒。 编辑: 我发现一些有趣的第三方API可以满足我的要求,但是必须断开连接,因此我将无法访问它们。 一些例子是: http://v2.3dbinpacking.com/demo/main http://www.packit4me.com/api 编辑2: 一个实际的要解决的问题的示例是: 我有4个尺寸为WxHxD的盒子:10x12x18、12x16x24、16x20x30、24x32x40 我有4个项目的订单,分别是大小为6x8x10、2x 22x14x30和1x 22x4x20的1个项目 如何使用尽可能少的盒子,尽可能小的盒子和尽可能少的可用空间将这些物品装入一个或多个大小的盒子中?

8
需要执行批量操作时,是否应该放弃ORM框架?
这是一种常见情况: 您需要在使用ORM框架的应用程序中实现批量操作。 第一次通过之后,您已经注意到严重的性能问题。 这是我的问题: 在这种情况下,您是否应该支持包含原始SQL的解决方案? 还是有众所周知的设计模式可以帮助您缓解与ORM框架的批量操作通常相关的问题? 编辑: 我不是问您是否应该从整个应用程序中删除ORM框架。 我在问:您是否应该为该应用程序的这一小部分放弃ORM框架?
15 orm  heuristics 

1
灵活实施DIFF的启发式方法
我创建了一个DIFF实现,以比较工作中的文档修订。它基于O(ND)差分算法及其变体。 变得很重要的一件事是获取更改列表并将其解释为人类可读的文本。尽管当前算法非常有效,但它是如此之大,以至于难以扩展。 简短问题 我当时正在考虑尝试使用A *和一种启发式方法,该方法会增加“转弯”的惩罚。想法是消除不必要的“添加,删除,添加,删除,添加,删除”,以便更轻松地解析为人类可以阅读的内容。基本上,将我的最短路径问题变成最简单的路径问题。 当然,不要创建始终为“删除所有内容,添加所有内容 ”的输出 听起来合理吗? 在DIFF实现中使用启发式算法是否有优先权?什么是启发式? 问题: 如果删除了一个长句子,又删除了另一个长句子,但它们确实共享至少一个单词,请说“与”。不理会常见单词(不要同时添加和删除它)将创建最短路径。但是,这实际上只是使尝试混淆更改打印内容的人感到困惑。 当前DIFF的示例: 旧文本: 清洁:用力洗净并用车间空气吹干。 新文本: 清洁:用丙酮和无绒布擦拭。 变更单清单: 将“强力清洗并吹干”更改为“用丙酮擦拭” 将“商店空气”更改为“丙酮和无绒布” 注意:使用“更改”代替 “删除'购买空气',添加'丙酮'” 如您所见,第二个注释失去了所有上下文,并且在没有查看完整的旧文本和新文本集的情况下,您无法理解其含义。 关于标点符号的注意事项: 我将标点符号分隔为单独的“单词”,这样我就可以 添加“(” 代替 将“修复”更改为“((修复) 因为这令人讨厌。但是,这意味着如果两个文本中甚至有一个逗号(与前面示例中的单词“ with”相对),就会发生相同的情况。 可能的解决方案: 我认为我可以使用不同的路径查找算法,从而使我能够灵活地为可能对人更有意义的不同更改“路径”增加权重。也许,我什至可以使旅行到包含标点符号的节点的权重很小(不确定这将如何影响其他事情)。 然后,我可以得到前面的示例以列出以下内容: 变更单清单: 将“ Powerwash并用商店空气吹干”更改为“用丙酮和不起毛的布擦拭” 看到!更清晰! 我知道我会在性能上受到打击,并且可能必须对程序进行大刀阔斧的检修,但是获得所需的最终结果更为重要。 底线: 同样,在DIFF实现中使用启发式方法是否有优先次序,这是什么? 其他想法?合理的时间投入?还有其他想法吗?其他算法? 提前致谢! 编辑: 我试图澄清/巩固我的问题,并推广我的问题,以在我的算法中添加启发式方法,而不是使用A *。在这种情况下,基本上是相同的事情,但是我现在仍然认为更准确。 这篇文章很有见地。

2
如何对启发式算法进行单元测试?
假设我们有路线查找算法: def myHeuristicTSP(graph): /*implementation*/ return route 现在我们要对此进行单元测试: class TestMyHeuristicTSP: def testNullGraphRaiseValueError(self): self.assertRaises(ValueError, myHueristicTSP(None)) def testSimpleTwoNodeGraphReturnsRoute: self.assertEquals(expectedResult, myHeuristicTSP(input)) 问题是,对于非启发式TSP算法,我们可以给出各种图形,并检查它们是否始终返回绝对最短的路线。 但是因为启发式算法虽然仍然是确定性的,但它的可预测性较差,仅是为了了解该算法的工作原理并找到那些极端情况?
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.