3D 裝箱計算機,解決的是一個經典問題:在保持每件物品完整、且絕不超出容量的前提下,用最少數量的固定容量容器,裝下所有物品。本頁的裝箱計算機,是用一維純量模型來處理這個問題:每件物品都帶有單一一個正數大小,每個箱子都有相同的容量,所以這個工具適合處理重量、記憶體、長度,以及可以簡化成一個維度、而不是三個維度的工作量批次。它使用的演算法是「最大優先遞減」(First Fit Decreasing,FFD),一種確定性的啟發式方法:把物品由大到小排序,把每一件物品放進第一個已經開啟、且放得下的箱子,只有在目前所有箱子都放不下時,才會開啟一個新箱子。這個頁面會回報開啟的箱子數量、包含每個箱子已用與剩餘容量的完整分配清單、整體使用率,以及以大小為基礎的下限值 ceil(物品總大小 ÷ 箱子容量)。它並不會為三維的箱體幾何、方向、平衡、易碎程度、堆疊強度、危險品隔離,或車輛軸重限制建模,所以它提供的是規劃上的協助,而不是實體裝載方案。
大多數搜尋 3D 裝箱計算機的讀者,期望找到的是一個能把實體箱子安排進卡車或貨櫃內部的工具,那是另一個獨立的領域,有自己的安全規則與不同的求解器家族。Google OR-Tools 裝箱問題文件定義了這個頁面所依循的正式版本:每一件物品剛好指派給一個箱子,沒有任何箱子超出容量,目標是在固定箱子容量下,使用最少數量的箱子。裝箱計算機採用的是這個純量定義,而不是整數規劃求解器,這樣可以讓推演過程保持可檢視、可重現。

這個計算機回傳的內容
這個頁面接受一個容量值,以及最多 1,000 件物品,將它們依遞減順序排序,並把每一件物品放進第一個容量足夠的已開啟箱子。結果區塊會顯示四個診斷數字,加上完整的分配清單:
- 開啟的箱子數量。
- 每一件物品分配到哪個箱子,以及每個箱子已用與剩餘的容量。
- 整體使用率,定義為物品總大小除以已開啟箱子的總容量。
- 大小下限值,計算方式為 ceil(物品總大小 ÷ 箱子容量)。
每一個數值,都來自你輸入的物品,以及這個頁面執行的 FFD 推演過程。因為運算過程都留在你的瀏覽器中,所以不需要上傳,儲存下來的範例可以重現,而且大小相同的物品,順序會由穩定排序法保留下來。
純量模型適合用在哪些場合
許多真實世界的裝載決策,一旦固定好單位,就會簡化成單一資源的問題。下表列出了裝箱計算機能提供實用草案的情境,以及對應的單位慣例。
| 情境 | 每件物品的純量大小 | 箱子容量 |
|---|---|---|
| 卡車或棧板的重量分批 | 每批載重(公斤或磅) | 每個箱子的最大合法或安全重量 |
| 雲端或容器記憶體配置 | 記憶體請求量(MB 或 GB) | 每個執行個體的記憶體 |
| 工作量分割 | 每項工作的運算單位或執行時間 | 每台伺服器或每批次的容量 |
| 電纜、管線,或棒材的裁切規劃 | 每段所需長度 | 每卷的原料長度 |
| 作業研究教學 | 任意正整數或小數 | 與物品相同的單位 |
對於帶有明確鋸縫損耗的一維裁切清單,裁切清單最佳化工具把同樣確定性的 FFD 概念,延伸應用到原料長度上。至於三維箱體幾何,這兩個工具都不適用,這種情況下正確的下一步,是使用一個具備方向與安全規則的貨櫃裝載求解器。
執行裝箱計算機
- 在瀏覽器中開啟裝箱計算機;因為運算過程留在你的裝置上,所以不會有任何內容被上傳。
- 以你接下來要一直使用的單位,輸入每個箱子共用的容量,例如 10 公斤、512 MB,或 60 分鐘。
- 每行列出一件物品,可以只寫一個大小,例如 8,也可以寫「標籤, 大小」,例如 jobA, 7。標籤與大小之間用單一逗號分隔,大小必須是正數,且不能超過一個箱子的容量。
- 執行計算。這個工具會先把物品依大到小排序,再把每一件放進最早開啟、且放得下的箱子,當沒有箱子放得下時,就開啟一個新箱子。
- 檢視箱子數量、分配清單、每個箱子已用與剩餘的容量、整體使用率,以及大小下限值。
- 如果這份規劃有用,就把它複製下來,用在工作表、裝載草案,或作業研究練習上。如果使用率偏低,就重新排列輸入順序再跑一次,因為即使 FFD 本身是確定性的,它對輸入順序仍然很敏感。
實際範例:容量 10,搭配七件物品
為了讓 FFD 的推演過程更具體,用容量 10 執行這個工具,並依任意順序輸入以下七件物品:8、7、5、4、3、3、2。經過遞減排序後,清單變成 8、7、5、4、3、3、2,接下來的放置過程如下。
| 步驟 | 放入的物品 | 箱 1 內容 | 箱 2 內容 | 箱 3 內容 | 箱 4 內容 |
|---|---|---|---|---|---|
| 1 | 8 | 8 | — | — | — |
| 2 | 7 | 8(放不下 7) | 7 | — | — |
| 3 | 5 | 8 + 5 = 13 > 10(開啟新箱) | 7(放不下) | 5 | — |
| 4 | 4 | 8(放不下) | 7(放不下) | 5 + 4 = 9 | — |
| 5 | 3 | 8(放不下) | 7 + 3 = 10 | 9(放不下) | — |
| 6 | 3 | 8(放不下) | 10(已滿) | 9(放不下) | 3 |
| 7 | 2 | 8 + 2 = 10 | 已滿 | 9 | 3 |
最終方案是:箱 1 = {8, 2},已用 10、剩餘 0;箱 2 = {7, 3},已用 10、剩餘 0;箱 3 = {5, 4},已用 9、剩餘 1;箱 4 = {3},已用 3、剩餘 7。物品總大小為 8 + 7 + 5 + 4 + 3 + 3 + 2 = 32,下限值為 ceil(32 / 10) = ceil(3.2) = 4,整體使用率為 32 / (4 × 10) = 32 / 40 = 0.80,也就是 80%。在這個例子中,FFD 剛好達到下限值,但達到下限值本身,並不能證明這就是最優解,下一節會說明原因。
如何解讀下限值與使用率
下限值是一個底線,不是保證。它的計算方式是 ceil(物品總大小 ÷ 容量),所以任何有效的解法,使用的箱子數都不會少於這個值。當顯示出來的箱子數等於下限值時,代表這個方案,用的是僅憑總量就能想像得到的最少箱子數;但這並不代表每一種物品的可行組合,都恰好能塞進這個數量的箱子裡。個別物品,仍然有可能在總量看起來很理想的情況下,強迫多開一個箱子,這也是為什麼裝箱問題在計算上很困難,而像 FFD 這樣的啟發式方法,是實務上的預設做法。
使用率量測的是,你實際填滿了多少已開啟的容量,定義為物品總大小除以所有已開啟箱子的總容量。高使用率代表你開啟的箱子裡,未使用的空間很少;低使用率則代表這個啟發式方法,開啟了一些它填不滿的箱子。這兩個數字都是診斷用的:它們會告訴你,這個方案什麼時候看起來健康,以及什麼時候你應該重新排列輸入、嘗試不同的啟發式方法,或把問題轉移到相關的模型上,例如用於依價值優先選取的背包問題,或用於原料長度版面配置的裁切庫存模型。
你不應該跨越的限制
這個純量模型刻意做得很簡單,以下這些限制,是這份契約的一部分,而不是尚待完成的功能。
- 沒有三維幾何,所以箱體尺寸、方向、旋轉,以及堆疊都沒有被建模。
- 沒有平衡、重心、易碎程度、危險品隔離,或車輛軸重分配。
- 物品不可分割:每一件物品都會完整分配給剛好一個箱子,這個工具絕不會把一件物品拆到多個箱子中,也不會把箱子的容量合併使用。
- 物品的大小必須大於零,且不能超過一個箱子的容量;負數或過大的輸入,會回傳明確的錯誤訊息。
- 這份清單最多接受 1,000 件物品,容量有其上限,而且標籤中不能包含逗號,因為匯入格式使用單一逗號來分隔標籤與大小。
對於以上任何一項顧慮,都應該套用不同的模型。實體意義上的貨櫃裝載,是另一個有自己安全規則的獨立領域,而帶有優先順序的排程或分批,則會變成一個不同的作業研究問題,而不是對這個模型做調整就能解決的。
為真實決策驗證這份方案
請把裝箱計算機當成透明的規劃輔助工具來使用:草擬批次分組、研究重新排列輸入順序如何改變箱子數量,並演練作業研究練習。在任何攸關安全的決策之前——例如裝載車輛、分配真實的雲端容量,或安排生產排程——請用同一組物品,跑過一個經過驗證的專業領域求解器,並確認最終的分配結果。這個頁面會把啟發式方法與下限值都標示清楚,不會把其中任何一個,包裝成一份虛假的保證,所以你隨時都清楚自己看到的是哪一種答案。