基于和得到混合结果的算法

时间:2015-04-13 06:52:15

标签: php mysql algorithm

我有一个产品表,一个有特色,一个有产品和特性之间的联系。

表"产品的结构":

+----+------+--------------+---------+---------+-----------+
| id | name | max_quantity | morning | evening | afternoon |
+----+------+--------------+---------+---------+-----------+

和"特征":

+----+----------------+
| id | characteristic |
+----+----------------+
|  1 | size           |
|  2 | weight         |
|  3 | length         |
+----+----------------+

产品和特性之间的联系"连接":

+----+------------+-------------------+
| id | product_id | characteristic_id |
+----+------------+-------------------+

我需要得到一个产品组合列表,其总和大小< 100,重量之和&lt; 50和长度之和&gt; 30(100,50,30是变量,我只是作为例子发布)。每个产品都可以有多个最大值&#34; max_quantity&#34; (来自产品表),所以不是独特的产品。

我有两种方法:1。一个mysql查询,它将返回我描述的所有内容; 2.获取大量结果并稍后在PHP中处理它们(使用数组操作)。我无法找到合适的解决方案。如果你能帮我找到一个解决方案就会很棒。

作为奖励,我希望获得30%的产品与该领域的比例&#34;早晨&#34; = 1,30%的产品有田地&#34;晚上&#34; = 1,40%的产品有田地&#34;下午&#34; = 1.

1 个答案:

答案 0 :(得分:0)

要获得符合要求的结果,您可以执行以下操作:

计算每种产品的size per lenghtweight per length比率(如果lenght为零,则将其设置为无穷大)。然后首先分配加权最大值最低的产品。如果您没有达到长度限制的产品列表而没有减去您的重量或尺寸限制,那么就没有合适的解决方案!

这意味着您应该按以下方式订购产品:

MAX(currentSize/currentWeight*(size/length),(weight/length))

其中currentSize是列表中当前所有产品的总大小,currentWeight是列表中当前所有产品的总重量。将产品添加到结果列表后,每次重新计算,然后添加该列表的第一个产品,直到达到长度限制。

如果您想满足您的奖金限制,您可以将产品表分成三个单独的表并依次选择每个产品的产品(从下午表开始,从下午表中选择第10个)每次从每个表中添加3个产品以接近30/30/40分布时。