使用具有来自平面数字数组的最大和的子数组填充数组

2024-06-25

我需要填充一个数组,其中可能包含不确定数量的子数组(托盘)——每个子数组的最大尺寸为 265 厘米。

我有一个整数(包)的平面数组,需要在托盘中进行最佳排列(例如 50 厘米、45 厘米、30 厘米...)。

如何动态创建一个系统来创建代表具有最佳空间优化的托盘的多维数组?

这是我的代码:

for ($i=0; $i < $mix_cc; $i++) { 
    foreach ($sh_array as $key => $row) { 
        $cm_remaining = $default_cc_height_fa - $sh_size;
        $sh_size = $sh_size + $row['size'];                   
        if ($row['size'] < $cm_remaining) {
            $mix_cc_array[$cc_number][$key] = $sh_array[$key];                   
        } else {
            $mix_cc_array[$cc_number + 1][$key] = $sh_array[$key];             
        }
        unset($sh_array[$key]);
    }
    $cc_number++;   
}

要优化托盘中的空间,您可以尝试以下首次适应递减 (FFD) 方法:

按大小降序对包数组进行排序。这样,您可以首先添加最大的包装,然后尝试将尽可能多的包装放入托盘中。

迭代排序后的包装数组,并尝试将每个包装放入当前托盘中。如果包装合适,将其添加到托盘上;如果包装不合适,请创建一个新托盘并将包装添加到其中。

以下是一些示例代码,演示了如何实现此方法:

$default_cc_height_fa = 265; // size of the pallet in cm
$sh_array = [50, 45, 30, 60, 70, 80]; // array of packs

// sort the array of packs in decreasing order of size
usort($sh_array, function($a, $b) {
    return $b - $a;
});

// initialize the array of pallets
$mix_cc_array = [];

// iterate through the array of packs
foreach ($sh_array as $pack) {
    // try to fit the pack into an existing pallet
    $packed = false;
    foreach ($mix_cc_array as &$pallet) {
        if ($pack <= $default_cc_height_fa - array_sum($pallet)) {
            $pallet[] = $pack;
            $packed = true;
            break;
        }
    }
    // if the pack does not fit into any existing pallet, create a new one
    if (!$packed) {
        $mix_cc_array[] = [$pack];
    }
}

print_r($mix_cc_array);

沙箱示例:https://onlinephp.io/c/45ca2 https://onlinephp.io/c/45ca2

这将为您提供一系列托盘,这些托盘使用首次适应递减 (FFD) 方法在空间利用率方面进行了最佳包装。如果此方法不适合您,您还可以查看下一个拟合递减 (NFD) 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用具有来自平面数字数组的最大和的子数组填充数组 的相关文章

随机推荐