多个嵌套循环取决于您的数据数量

问题描述 投票:0回答:1

我有多个与数据数量相等的嵌套循环。例如,找到A=1.2、B=2.3和C=3.5的3条长度的条切割组合。 因此,切割 20 英尺长的钢筋后,废料不应大于 1 英尺。 所以,我使用了 3 个嵌套循环,因为有 3 个小节剪切。如果我有 50 个小节剪切,那么我将使用 50 个嵌套循环。那么,有什么办法可以解决这个问题,这样就不需要编辑源代码了。也许双重递归?或任何其他算法。谢谢。

输出示例如下: 1B、5C、TL=19.8、浪费=0.20 4B、3C、TL=19.7,浪费=0.30

 for (int a = 0; a < 50; a++){
     for (int b = 0; b < 50; b++){
        for (int c = 0; c < 50; c++){
            double TL = a * BarCut[0] + b * BarCut[1] + c * BarCut[2];
            double waste = 20 - TL;
                //if (waste >= 0 && waste < 1 )
                    //Console.WriteLine($"{a}A, {b}B, {c}C, TL={TL}, waste = {waste:F2}");
        }
     }
 }
c# loops recursion nested
1个回答
0
投票

考虑使用的系数,即您的

a
b
c
,它们是数字的基数,它们可能达到多大,例如,在您的示例中为 50。为了更简单的解释,可以将其视为 16。然后值将从 000 变为 FFF(即 16^3 - 1)。虽然这不是最有效的,但最简单的实现方法是使用一个从 0 到 16^3 - 1 的计数器。在每次迭代中,程序将得到除以 16 后的余数,从而得到相应的系数,然后乘以相应的值并将其添加到结果中。然后,从该值中减去该系数,然后除以 16。

但是,您需要注意的一件事是,案例总数不会变得太大的整数,在这种情况下,您需要对此进行调整(例如,请注意,限制TL为20意味着,由于最小的

BarCut
值为1.2,所以我们只需要使用20/1.2的整数部分加1,即17,而不是50)。假设这不是问题,下面将展示如何在 3 个条长度和任意条长度的最大系数 50(实际上是 49)的示例中实现此概念。在一般情况下,输出可能应该在循环中,但我只是在一行代码中完成了它,以便与您使用的内容保持一致。

            double[] BarCut = {1.2, 2.3, 3.5};
            int numBarLengths = 3;
            int maxBarCutCoeff = 50;
            int maxIndex = (int) Math.Pow(maxBarCutCoeff, numBarLengths);
            for (int i = 0; i < maxIndex; i++)
            {
                int tempI = i;
                double TL = 0.0;
                int[] Coeff = {0, 0, 0};
                
                for (int j = 0; j < numBarLengths; j++)
                {
                    Coeff[j] = tempI % maxBarCutCoeff;
                    TL += Coeff[j] * BarCut[j];
                    tempI = (tempI - Coeff[j]) / maxBarCutCoeff;
                }
                
                double waste = 20 - TL;
                if (waste >= 0 && waste < 1)
                    Console.WriteLine($"{Coeff[0]}A, {Coeff[1]}B, {Coeff[2]}C, TL={TL}, waste = {waste:F2}");
            }

这生成了以下输出

16A, 0B, 0C, TL=19.2, waste = 0.80
14A, 1B, 0C, TL=19.1, waste = 0.90
9A, 4B, 0C, TL=20, waste = 0.00
7A, 5B, 0C, TL=19.9, waste = 0.10
5A, 6B, 0C, TL=19.8, waste = 0.20
3A, 7B, 0C, TL=19.7, waste = 0.30
1A, 8B, 0C, TL=19.6, waste = 0.40
13A, 0B, 1C, TL=19.1, waste = 0.90
8A, 3B, 1C, TL=20, waste = 0.00
6A, 4B, 1C, TL=19.9, waste = 0.10
4A, 5B, 1C, TL=19.8, waste = 0.20
2A, 6B, 1C, TL=19.7, waste = 0.30
0A, 7B, 1C, TL=19.6, waste = 0.40
7A, 2B, 2C, TL=20, waste = 0.00
5A, 3B, 2C, TL=19.9, waste = 0.10
3A, 4B, 2C, TL=19.8, waste = 0.20
1A, 5B, 2C, TL=19.7, waste = 0.30
6A, 1B, 3C, TL=20, waste = 0.00
4A, 2B, 3C, TL=19.9, waste = 0.10
2A, 3B, 3C, TL=19.8, waste = 0.20
0A, 4B, 3C, TL=19.7, waste = 0.30
5A, 0B, 4C, TL=20, waste = 0.00
3A, 1B, 4C, TL=19.9, waste = 0.10
1A, 2B, 4C, TL=19.8, waste = 0.20
2A, 0B, 5C, TL=19.9, waste = 0.10
0A, 1B, 5C, TL=19.8, waste = 0.20
© www.soinside.com 2019 - 2024. All rights reserved.