一個線上裝箱計算機會將每個物品指派到數個等容量箱子中的恰好一個,顯示箱子數量,並回報每個箱子的使用情況,全部只需要一個容量欄位和一串物品大小清單即可完成。裝箱計算機直接在您的瀏覽器中執行首次適配遞減 (First Fit Decreasing, FFD) 啟發式演算法,因此不會有任何檔案離開您的電腦,而且您可以重新貼上相同的清單來每次都得到相同的答案。大小是抽象的純量值——它們描述任何可以相加並與固定上限比較的一維資源,例如以公斤為單位的重量、以 GB 為單位的記憶體、以分鐘為單位的工作時間,或以公尺為單位的線性長度。由於該啟發式演算法具有確定性,使用相同容量和相同物品清單執行兩次會產生相同的指派結果,這正是這個工具在習題、授課以及可稽核的草稿中很有用,而不僅僅是一次性答案的原因。每次執行結束時都會出現一個結果面板,列出每個已開啟的箱子、其內含的物品、已使用與剩餘的容量、整體利用率,以及一個基於大小的下界,讓您能一眼判斷該分配計畫。

bin packing online calculator
線上裝箱計算機:FFD 在您的瀏覽器中規劃分配

首次適配遞減啟發式演算法如何決定每個物品該放入哪個箱子

FFD 是一個單遍的貪婪程序,在排程與作業研究中已使用數十年。Google OR-Tools 關於裝箱問題的說明文件描述了其底層的限制條件:每個物品必須被完整指派到恰好一個箱子、沒有任何箱子能超過容量,且目標是使用盡可能少的箱子。裝箱計算機並未精確地求出該最小值——裝箱問題在計算上是很困難的——但它會以三個穩定的步驟套用 FFD,這些步驟很容易在螢幕上進行稽核。

  1. 將物品依大小按非遞增順序排序。當兩個物品大小相同時,保留它們原本的輸入順序。
  2. 依序走訪排序後的清單。對於每個物品,從最早到最晚依序查看每個已開啟的箱子,然後將物品放入第一個剩餘容量足夠容納它的箱子。
  3. 如果沒有任何已開啟的箱子能容納該物品,則開啟一個新箱子,將物品放入其中,然後繼續。

「第一個能容納的已開啟箱子」這條規則正是讓分配計畫具有可重現性的關鍵:即使您調換兩個大小相同之物品的輸入順序,也會得到相同的計畫;而如果同事重新輸入相同的數字,他們也會看到完全相同的指派結果。FFD 不會回溯、不會合併箱子、不會切割物品,也為了追求更少的箱子數而去嘗試其他排序方式。這種權衡——以速度和可預測性換取最優性的保證——正是為什麼每個結果面板也會顯示一個下界。

在您的瀏覽器中執行裝箱規劃

介面刻意設計得很簡潔:一個容量值、一份物品清單、一組輸出。若要為課堂練習、批次草稿或作業研究展示取得一份完整的規劃,請依照下列步驟操作:

  1. 輸入所有箱子共用的容量。可使用任意正純量值;單位由您自行決定,只要下面所有物品都使用相同的單位即可。
  2. 每行列出一個物品。像 7 這樣的純數字會自動成為帶有標籤的物品,而自訂標籤加上大小則需使用一個逗號,例如 Server-A, 4
  3. 按下執行控制項。工具會驗證每個大小都大於零且不超過箱子容量,接著進行排序、放置並回報結果。
  4. 在結果面板中檢查每個已開啟的箱子:指派給它的物品、其大小的總和、剩餘容量,以及所有箱子的整體利用率。
  5. 將箱子數量與所顯示的下界進行比較,若數字看起來沒問題,即可將該規劃複製到工作表、裝載草稿或作業講義中。

清單上限為 1,000 個物品,而若出現負數或過大的物品,則會在開始放置前回傳明確的錯誤,因此執行失敗時絕不會產生一份半對半錯的規劃。自訂標籤必須恰好使用一個逗號作為分隔符,這讓匯入格式保持明確無歧義,並防止小數點被誤判為標籤。

如何解讀箱子數量、利用率與下界

輸出面板會回報四個數量,它們共同描述規劃的效率以及它在理論上能多接近最優解。箱子數量就是 FFD 必須開啟的箱子數。每個箱子的已使用容量是指派給該箱子之物品大小的總和,而每個箱子的剩餘容量則是其內部未使用的空間。整體利用率是將所有物品的總大小除以所有已開啟箱子的總容量,因此利用率 92% 的規劃遠比 60% 的規劃來得緊密。

下界是任何裝箱方式在相同輸入下所能達到的最小箱子數量,計算方式為物品總大小除以容量後再取天花板值。若您的物品總和為 47、容量為 10,則下界為 ceil(47 / 10) = 5,因此無論是 FFD 或其他任何方式,都無法少於五個箱子。當 FFD 等於下界時,該規劃與理論最小值一致,但僅憑這一點並不能證明最優性,因為個別物品的組合本身也會限制其可行性;當 FFD 超過下界時,您會知道該啟發式演算法留有改善空間,但除非使用真正的最佳化工具,否則無法得知究竟差了多少。

若要手動追蹤一個小型實例,假設容量為 10,物品為 8、6、5、5、4、3。FFD 排序後為 8、6、5、5、4、3。箱子 1 放入 8,接著 6 無法放入,因為 8 + 6 = 14 超過 10,因此開啟箱子 2 並放入 6。下一個 5 無法放入箱子 1(僅剩 2)也無法放入箱子 2(僅剩 4),因此開啟箱子 3 並放入 5,再下一個 5 填滿箱子 3(5 + 5 = 10)。4 無法放入箱子 1(僅剩 2),但可放入箱子 2(6 + 4 = 10)。3 會讓箱子 1 超載(8 + 3 = 11),箱子 2 已滿,箱子 3 已滿,因此開啟箱子 4 並放入 3。這樣得到四個箱子,總大小為 31,下界為 ceil(31 / 10) = 4,因此 FFD 在這份清單上恰好符合下界。

線上計算機適合與不適合的使用情境

這個啟發式演算法回答了一個刻意設計得很明確的問題:給定每個物品的一維大小和一個固定容量,在 FFD 之下哪個箱子應該裝哪個物品?這個問題涵蓋了廣泛的真實規劃任務,下表整理了這個工具適合與不適合的情境。

情境裝箱計算機是否合適原因
將工作量切割成具有相同時間預算的批次每個工作都是以單一純量值(分鐘)與固定的批次預算進行比較。
為固定容器草擬記憶體配置的群組每個配置都是針對單一固定上限的純量大小,且不涉及方向性的考量。
作業研究作業要求輸出 FFD 結果該演算法即為作業所指定的確定性 FFD 啟發式演算法。
將實際的箱子裝入實際的卡車此模型忽略了尺寸、方向、平衡、堆疊強度、軸重限制以及安全法規。
在 3D 容器內堆疊棧板體積、底面積、旋轉以及堆疊規則都不屬於單一純量模型的範疇。
求解 0/1 背包問題(選擇子集,而非裝入所有物品)此工具會將每個物品指派到恰好一個箱子;它不會為了最大化價值而省略物品。

裝箱計算機同樣不會將物品切割分配到不同箱子、不會跨箱子合併容量、不會為後續物品預留空間,也不會為任何物品附加價值或優先順序。那些是不同的問題——裁料問題、背包問題、多重背包問題、排程問題——有不同的目標和不同的演算法,因此當需求改變時,請換用對應的求解工具。

可重現的執行以利規劃與練習

對於需要在紙面上為規劃辯護的人來說,確定性是這個啟發式演算法最有用的單一特性。兩位工程師在不同時間、不同機器上使用相同的容量和相同的物品清單執行,將會看到相同的逐箱指派結果、相同的剩餘容量欄位以及相同的利用率。這使得該規劃可以安全地貼入變更單、授課簡報或稽核紀錄中。在開發過程中使用了八個經過人工檢查的案例,涵蓋完全成對、重複出現的值、分數,以及物品排序會改變答案的配置,而這個工具會對每個回傳的箱子同時驗證物品守恆與容量符合性。

對於物流、製造、雲端容量、危險物品裝載或任何安全關鍵的擺放作業,請將 FFD 規劃視為草稿,並使用該領域的求解工具重新驗證最終的指派結果。Lehigh 大學關於裁料問題的分析是一個有用的提醒:一維模型位於一系列限制更嚴格的變體的最底層,每個變體都有其專屬的軟體和安全規則。這個線上計算機為您提供一份快速且透明的 FFD 規劃;其餘的驗證工作則由您負責。