Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 在每个罐的最大可能容量下,找出容纳最大数量葡萄酒的最小罐数_Excel_Algorithm_Math_Optimization - Fatal编程技术网

Excel 在每个罐的最大可能容量下,找出容纳最大数量葡萄酒的最小罐数

Excel 在每个罐的最大可能容量下,找出容纳最大数量葡萄酒的最小罐数,excel,algorithm,math,optimization,Excel,Algorithm,Math,Optimization,我的业务是葡萄酒转售业务,我一直在努力解决这个问题。我们有50-70种葡萄酒可随时储存,约500罐不同容量的葡萄酒。每罐只能装1种葡萄酒。我的工作是确定容纳最大类型葡萄酒的最小罐数,每种葡萄酒的灌装量应尽可能接近其最大容量,即如果同时存在两个60l和40l的罐,则100l葡萄酒不应储存在200l罐中 我一直在用excel手工完成这项工作,并希望尝试自动化这一过程,但使用宏和数组公式很快就会失控。我可以用C和Swift编写一个简单的程序,但是我一直在寻找一个通用的算法。我非常感谢你给我指点我可以从

我的业务是葡萄酒转售业务,我一直在努力解决这个问题。我们有50-70种葡萄酒可随时储存,约500罐不同容量的葡萄酒。每罐只能装1种葡萄酒。我的工作是确定容纳最大类型葡萄酒的最小罐数,每种葡萄酒的灌装量应尽可能接近其最大容量,即如果同时存在两个60l和40l的罐,则100l葡萄酒不应储存在200l罐中

我一直在用excel手工完成这项工作,并希望尝试自动化这一过程,但使用宏和数组公式很快就会失控。我可以用C和Swift编写一个简单的程序,但是我一直在寻找一个通用的算法。我非常感谢你给我指点我可以从哪里开始。完整的解决方案,我会送你一瓶;)

编辑:为了澄清,我确实知道我有多少种葡萄酒以及它们的总量,例如700升的比诺、2000升的梅洛等等。这些每周都在变化。然而,储罐有许多不同的容量(40、60、80、100、200升等),并且不定期更换,因为它们必须取出进行清洁和更换。简单地使用70个油箱来容纳70种类型是不可能的

此外,葡萄酒的总量永远不会与总罐容量相匹配,我需要使用最小罐数来容纳最大数量的葡萄酒。如果容量不足,剩余的葡萄酒数量必须尽可能少(它们很快就会变质)。如果有剩余,每种类型的剩余量必须与其数量成比例

问题的简化示例如下:

Wine: 
----------
Merlot 100 
Pinot 120 
Tocai 230 
Chardonay 400

Total: 850L

Tanks: 
----------
T1 10 
T2 20
T3 60 
T4 150 
T5 80 
T6 80 
T7 90 
T8 80 
T9 50 
T10 110 
T11 50 
T12 50

Total: 830L

这种贪婪的DP算法试图执行比例分割:例如,如果您有
700l皮诺、2000l梅洛和油箱容量
40、60、80、100、200
,这意味着总容量
480

700 / (700 + 2000) = 0.26
2000 / (700 + 2000) = 0.74

0.26 * 480 = 125
0.74 * 480 = 355
因此,我们将尝试储存比诺的
125l
和梅洛的
355l
,以使储存量与我们拥有的量成比例

显然,这是不完全可能的,因为你不能混合葡萄酒,但我们应该能够足够接近

为了储存比诺,最接近的方法是使用
1(40升)
3(80升)
,然后使用剩余的梅洛

这可以作为一个问题来实现:

计算比例,然后为您拥有的每种葡萄酒运行此操作(移除已选择的罐,您可以使用
d
数组找到,如果您需要,我可以详细说明)。环顾四周
d[计算出的比例]
找出每种葡萄酒类型可能达到的最接近的总和


这应该足够快,可以容纳几百辆坦克,我猜它们的容量不会超过几千辆。

您需要指定所有的输入。你没有提到你是否事先知道每种葡萄酒需要储存多少,但我想你也有一些关于这方面的信息?否则,用70个罐来储存70种不同类型的葡萄酒。啊,是的,我知道我有多少种葡萄酒,以及它们的总量,例如700升的比诺、2000升的梅洛等等。这些每星期都在变化。然而,储罐有许多不同的容量(40、60、80、100、200升等),并且不定期更换,因为它们必须取出进行清洁和更换。简单地用70个容器来容纳70种类型是不可能的。你应该编辑问题以容纳你所有的信息。在数学堆栈交换上提问。这是一个非常简单的线性优化问题,您可以使用Excel解算器或其他程序来解决它。可能比你想象的要简单。干杯您必须存储所有每种类型吗?例如,如果您有
皮诺700l、梅洛2000l
和储罐容量
40、60、80、100、200
,显然您无法储存所有的储罐。那你想怎么分呢?均匀、均衡、全比诺、全梅洛?你需要给我们一些东西,使一个选择明显优于另一个。谢谢,那太快了!我会尝试一下。如果您经常有与其他储罐组合具有相同体积的储罐(例如,如果您有50L、30L和20L储罐),那么在通过DP矩阵追溯时,通常会有多个可能的前置储罐。在这种情况下,你应该总是选择最大的——因为这样就可以选择只使用一些较小的罐的子集来酿造未来的葡萄酒。问题本身并不像我想的那么难,但解决起来非常缓慢。我试着用蛮力强迫的方法,寻找每一种酒的酒罐组合,然后每一种酒罐组合都会下一种酒。用vba编写的excel在使用20种类型和50辆坦克时会变得无响应。@你不需要暴力,你可以使用我发布的DP算法。
d[i] = true if we can make sum i and false otherwise
d[0] = true, false otherwise
sum_of_tanks = 0
for each tank i:
  sum_of_tanks += tank_capacities[i]
  for s = sum_of_tanks down to tank_capacities[i]
    d[s] = d[s] OR d[s - tank_capacities[i]]