寻找一种干净,有效的方法来匹配已知模式的一组数据

时间:2009-04-09 21:59:29

标签: php mysql pattern-matching

使用php5.2和MySQL 4.1.22

我遇到过一些事情,起初看起来很简单,但后来又回避了一个简单,干净的解决方案。

我们预先定义了产品的“包装”。包装1中可以包含产品A,B和C.包装2中可包含A,C,D和G等。包装的尺寸范围为3至5种产品。

现在,客户可以挑选任何可用的10种产品并制作“定制”包装。由于我们已经拥有某些预定义的软件包,因此我们希望尽可能使用较小的现有软件包构建自定义软件包(以方便运输)。

因此,例如,客户选择创建产品A,B,C,D,E和F的“自定义包”。我们已经有一个包含A,B和C的预定义包,称为Foo。因此,订单将是Foo,D,E和F.

捕获的是具有最少量的单个物品,然后是最少量的包裹。例如:

自定义套餐:A,B,C,D,E,F,G,H,I,J。

预定义包(1):A,B,C,D,E

预定义包(2):A,B,C

预定义包(3):D,E,F

如果我只采取最大的比赛,那么我有1(5pc)包和5个单独的项目。包(2)和(3)都不能用剩余的项目构建。

如果我看得更深,我发现通过不构建包(1)我可以改为构建包(2)和包(3)。这意味着我有2个包和4个单独的项目(在这个商务规则中更好的选择)。

当我使用MySQL时,我受限于只有一层子选择可用(据我所知)。所以这种类需要在php中执行。我已经看过使用array_intersect()来确定匹配,但是我发现每种方式都会在处理方面呈指数级增长,因为预定义包的数量呈线性增长。

我是由其他几个编码朋友再次运行这个,虽然看起来应该有一个简单的答案我们都发现它并不像看起来那么简单。所以,我以为我会把它贴在这里作为一个漂亮的面条担架。非常感谢你的时间!

3 个答案:

答案 0 :(得分:4)

问题通常是“硬”问题(就计算复杂性而言)。事实上,它在我的脑后响起了一些铃声,它可能会减少到Knapsack problem之类的经典算法问题之一,但我无法在其上附上一个正确的名称。

然而,由于这么小的问题空间(他们只能挑选10种产品),它应该相当快速地暴力破坏。当有人提交自定义构建时,只需以所有可能性递归攻击它,并查看哪一个是最好的。

即,选择他们选择的组件,并首先尝试从中删除“Package 1”的组件。如果可能的话,拿掉剩余的组件并尝试从中获取“Package 2”的组件等。跟踪你到目前为止找到的最佳解决方案。

如果它仍然不够快(但我认为它可能会取决于您拥有多少预先构建的软件包),您可以应用一些dynamic programming方法来加快速度。


已编辑添加:

根据可能性的数量以及实际运行的时间长短,您可能需要编写上述代码,然后继续为每种可能的组合预先计算所有解决方案。然后,当有人提交自定义构建时,您只需要获取答案,而不是每次都从头开始计算答案。

即使你不想全部预先计算它们,我建议每次有人进行自定义构建时存储结果,然后将来如果其他人做同样的自定义构建你不需要重新计算解决方案。

答案 1 :(得分:0)

我建议你让客户帮忙。在产品选择屏幕中,显示可用的包装套件,并让它们进行组合(定价合适,以便各个连杆的总和足以涵盖特殊处理)。

答案 2 :(得分:0)

请原谅我让你的问题变得更复杂一些。 : - )

虽然您可能希望预先计算可能的解决方案,或让消费者实际从预定义的包中自行选择:如果预定义的包不再有库存怎么办?

如果目前没有解决方案来完成订单怎么办?您是否会发送部分订单,如果是这样的话:即使您知道稍后您可以选择预定义的包裹,您是否会包含单个商品?

你真的确定预定义的包不会分配一些“首选项”吗?在订购“ABCD”和预定义包“ABC”和“BCD”时,要选择哪个预定义包?例如,如果您知道预定义的包“ABC”经常缺货,那么可能会使“BCD”成为首选。

所以:也许你需要使用一些建模,你可以轻松地改变一些硬编码规则,而不是试图找到一个自动化的解决方案。这当然可以是PHP本身。