【发布时间】:2009-09-24 00:19:52
【问题描述】:
我构建了一个应用程序,用于模拟公司每月可以在不同“模式”下生产的产品数量。此模拟用于帮助找到运行一个月的最佳模式系列,以最好地满足该月的预计销售预测。该应用程序一直运行良好,直到最近该工厂被修改为在其他模式下运行。现在可以在 16 种模式下运行。对于有 22 个工作日的一个月,这会产生 9,364,199,760 种可能的组合。这比过去仅产生 1,560,780 种可能组合的 8 种模式有所增加。运行此应用程序的 PC 较旧,无法处理在引发内存不足异常之前的计算次数。事实上,整个应用程序不能支持超过 15 种模式,因为它使用整数来跟踪模式的数量,并且超过了整数的上限。抛开这个问题,我需要尽我所能降低应用程序的内存利用率并优化它以尽可能高效地运行,即使它无法实现 16 种模式的既定目标。我正在考虑将数据写入磁盘而不是将列表存储在内存中,但在我承担这个开销之前,我想了解人们对该方法的看法,看看那里是否有任何优化空间。
编辑 根据少数人的建议,考虑一些更学术的东西,然后仅仅计算每个可能的答案,下面列出了如何选择最佳运行(模式组合)的简要说明。 目前,计算机确定工厂在该月的工作日数内可以运行的所有可能方式。例如,最多 2 个工作日的 3 种模式将导致 (1,1)、(1,2)、(1,3)、(2,2) 的组合(其中数字代表选择的模式), (2,3), (3,3) 对于每种模式,产品以不同的生产率生产,例如在模式 1 中,产品 x 可能以每小时 50 单位的速度生产,而产品 y 以每小时 30 单位的速度生产,而产品z 每小时生产 0 个单位。然后将每个组合乘以工作时间和生产率。选择产生与该月每种产品的预测值最接近的数字的运行。但是,由于工厂在某些月份没有达到产品的预测值,因此该算法会提高下个月产品的优先级,以确保该产品在年底达到预测值。由于仓库空间紧张,产品也不要过度生产很重要。
谢谢
private List<List<int>> _modeIterations = new List<List<int>>();
private void CalculateCombinations(int modes, int workDays, string combinationValues)
{
List<int> _tempList = new List<int>();
if (modes == 1)
{
combinationValues += Convert.ToString(workDays);
string[] _combinations = combinationValues.Split(',');
foreach (string _number in _combinations)
{
_tempList.Add(Convert.ToInt32(_number));
}
_modeIterations.Add(_tempList);
}
else
{
for (int i = workDays + 1; --i >= 0; )
{
CalculateCombinations(modes - 1, workDays - i, combinationValues + i + ",");
}
}
}
【问题讨论】:
-
你为什么要一次生成它们?你不能生成其中的一些,处理它们然后扔掉吗?然后生成其他的,处理这些等等。我还想知道需要什么样的算法来生成数百万个组合才能通过蛮力找出最好的组合。肯定有一些更聪明的方法来解决这段代码帮助你解决的任何问题?
-
我不明白这个问题:您是说您的工厂有 22 个工作日,并且在每个工作日它可以以不同的模式运行(具有不同的输出)。您想找到尽可能接近本月预计总产出的模式组合吗?您可以每天切换模式,还是每周仅切换一次,或其他任何方式?
-
另外,你是怎么得出数字 1,560,780 和 9,364,199,760 的?
-
当只有几百万需要考虑的时候,让 PC 插上一两分钟的时间来蛮力通过它似乎并没有那么糟糕,你是对的,这不再实用。也许我可以每个月分手,这样一次只查看几百万个组合,这是一个很好的建议。至于计算它的新算法,如果我能做到这一点,我就不会是现在的我:)。
-
每天只有一种模式。 (模式 + 天数 - 1)! / ((天)!(modes-1)!
标签: c# .net optimization