AIで荷物の箱分け候補を作る方法|重量・容積と実梱包を分ける

架空4点を箱へ分け、重量だけなら通る案の容積超過と、2箱の候補を検算。容積合計と形状の収容を区別します。

AIものさし編集部

AIで荷物の箱分けを考えるときは、「重量が上限以下」と「容積の合計が上限以下」を別々に確認します。その両方を満たしても、形状や緩衝材を考えた実際の箱詰めが成立するとは限りません。

この記事では、架空の荷物4点を箱へ分ける候補を作り、数量条件と実物確認を分けます。到達点は、各荷物を一度ずつ含む候補表と未確認条件です。配送会社の受付条件、実梱包、送料、AI生成、出荷は検証していません。

全荷物を送るのか、一部を選ぶのかを決める

今回の条件は、A・B・C・Dの4点をすべて扱い、1点を複数の箱へ分割しないことです。箱数を減らすために荷物を除外することは認めません。

GoogleのOR-ToolsのBin Packing公式例は、容量制約を守りながら全品を収容する箱数を少なくする問題を説明しています。一部の品を選んで価値を最大化するMultiple Knapsackとは目的が異なります。この記事はその区別を参考にした独自例で、重量に加えて容積合計の条件を置きます。公式ソルバーは実行していません。Google:The Bin Packing Problem(新しいタブで開く)

まず、送りたい荷物IDを固定します。候補表へ同じIDが二度出る、1点が消える、荷物を勝手に二分する案は、箱ごとの数値が小さくても条件違反です。

重量と容積の単位・上限を別欄にする

この架空例では、同じ種類の箱を使う計画とし、1箱あたりの内容物へ割り当てる計算上の上限を10kg・10Lとします。配送会社や実際の箱の仕様ではありません。箱・緩衝材の重量や空間は未計測で、ここには含めていません。

表は横にスクロールできます

荷物ID内容物の重量内容物の容積
A6kg8L
B4kg4L
C4kg2L
D2kg2L
合計16kg16L

すべての値は独自の架空値です。実務では、kgとg、Lと立方センチメートルが混ざっていないかをそろえます。容積の算出方法や測定対象も残し、商品の中身、個装後、緩衝材込みのどれを測った値かを確認します。

10kg・10Lは、両方守る条件です。重量が8kgなら余った2kgを容積へ振り替えられる、という意味ではありません。

重量だけなら通る案が、容積で落ちる

表は横にスクロールできます

箱分け案箱1:荷物と合計箱2:荷物と合計数量条件の判定
XA・B:10kg、12LC・D:6kg、4L箱1が容積超過
YA・C:10kg、10LB・D:6kg、6L両箱とも計算上の上限内
ZA・D:8kg、10LB・C:8kg、6L両箱とも計算上の上限内
WA:6kg、8LB・C・D:10kg、8L両箱とも計算上の上限内

案Xは両箱の重量が10kg以下ですが、AとBの容積合計が12Lで条件を超えます。「合計16Lだから2箱に入るはず」と全体だけで判定せず、各箱に割り当てた内訳を計算します。

案Y・Z・Wは、今回の重量・容積の合計条件を満たす候補です。どの案が梱包しやすいか、破損しにくいか、送料が安いかは、このデータから分かりません。箱数が同じという理由で、そうした観点まで同等としません。

2箱が最少なのは、限定した計算モデルの中

全重量16kgは1箱の10kgを超えるため、1箱では数量条件を満たせません。容積合計も16Lで1箱の10Lを超えます。したがって少なくとも2箱が必要です。

一方、案Yまたは案Zという2箱の候補が存在するので、今回の合計制約だけのモデルでは最少箱数は2です。下限の計算だけで実現可能としたのではなく、2箱の割当例も確認しています。

ただし、これは実梱包で2箱に収まるという証明ではありません。実物に必要な条件を追加すると、候補が消えたり箱数が増えたりする場合があります。

容積合計と、形状が収まることを分ける

単純な反例として、内寸10×20×50cmの直方体の箱は10Lです。一辺20cmの硬い立方体は8Lですが、90度単位で向きを変える直交配置では、箱の10cmの方向へ入りません。8Lが10L以下という比較だけでは、収容を確認できない例です。

この形状例は容積だけで判定できないことを示す別の架空例で、表のAの実形状を設定したものではありません。今回の荷物4点は寸法未確認のため、案Y・Z・Wを実梱包可能とは判定しません。

実物では、箱の内寸、各荷物の寸法、向きの制約、積み重ねの可否、緩衝材、同梱できない組合せを確認します。出荷重量なら箱や資材の重量も加えます。今回の例は、その測定や配送会社の条件確認を済ませた結果ではありません。

掲載例を小さな全列挙で検算する

次のPythonは、4点を2箱へ一度ずつ割り当てる16通りを調べます。箱ラベルの入替による重複を除くため、Aを箱0へ固定して結果を数えます。重量・容積合計だけを検査し、形状は扱いません。

from itertools import product

items = (("A", 6, 8), ("B", 4, 4), ("C", 4, 2), ("D", 2, 2))
valid = []
for assignment in product((0, 1), repeat=4):
    if assignment[0] != 0:
        continue
    bins = [[items[i] for i, box in enumerate(assignment) if box == b]
            for b in (0, 1)]
    totals = [(sum(x[1] for x in group), sum(x[2] for x in group))
              for group in bins]
    if all(weight <= 10 and volume <= 10 for weight, volume in totals):
        valid.append(tuple(tuple(x[0] for x in group) for group in bins))
assert set(valid) == {(("A",), ("B", "C", "D")),
                      (("A", "C"), ("B", "D")),
                      (("A", "D"), ("B", "C"))}
assert sum(x[1] for x in items) == 16
assert sum(x[2] for x in items) == 16
assert 6 + 4 <= 10 and 8 + 4 > 10
print(valid)

これは4点の固定例用で、汎用の配送計画ではありません。負数、欠損、荷物IDの重複、単位変換、箱の種類、形状、配送条件の入力検査を含みません。点数が増えれば候補数も増えるため、そのまま大規模な荷物へ広げる実装でもありません。

AIへは候補表と未確認条件を返させる

架空の荷物A~Dを、各荷物がちょうど1箱へ入るように分けてください。
荷物は分割・除外せず、1箱の内容物上限は重量10kg、容積合計10Lとします。
箱ごとに荷物ID、重量合計、容積合計、各条件の判定を示してください。
重量と容積の片方だけで合格にしないでください。
箱数の下限と、その箱数で成立する数量上の候補を分けて示してください。
寸法や資材が未確認なので、実梱包可能、送料最安、出荷可能とは書かないでください。
出力:候補表、計算式、モデルで確認した範囲、実物確認が必要な条件。
この依頼では配送手配や出荷を行いません。

この依頼文と候補は手製例で、AI生成の正答率を測った結果ではありません。AIの案を読むときは、先に全IDが一度ずつあるかを確認し、その後に各箱の合計を再計算します。数量条件を通った候補だけを実物確認へ回し、未確認の形状や配送条件を文章の勢いで埋めないでください。

参考資料

公式資料の確認日:2026年10月20日。荷物、箱の上限、寸法例、候補表は独自の架空例です。掲載Pythonと計算をローカルで検査しました。OR-Tools、外部API、AI生成、実寸法、梱包、送料、配送受付、出荷、画面表示は未検証です。

質問から自分に合うAIを探す