我有多个与数据数量相等的嵌套循环。例如,找到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}");
}
}
}
考虑使用的系数,即您的
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