FA-94926 / Warehouse slotting and bin packing / Open access
Tote packing: smallest items loaded first · case 01
Small items fill totes first and bulky items each open a new tote, inflating tote count.
ROOT CAUSE
The packing sequence sorts by volume ascending rather than descending.
VERIFIED REPAIR
Sort items by volume descending, then weight descending, then id.
Unsuccessful approach: Sorting by weight alone ignores volume, the constraining dimension for most totes.
Case contract
items [[id, volume, kg, fragile]]. Sort by volume desc, kg desc, id. Place each in the first open tote (creation order) where volume and weight stay within limits (inclusive) and no fragile item shares a tote with an item over 10 kg (either direction). Items exceeding a tote alone go to oversize. Return [list of tote id lists, sorted oversize ids].
Why this case matters
Packing picked units into conveyor totes is bounded by volume, weight, and damage rules.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (it[1], it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if vol > tote_vol or wt > tote_wt:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 3', [[['i0', 50, 8, True], ['i1', 5, 3, False], ['i2', 10, 8, False]], 60, 25], [[['i0', 'i2'], ['i1']], []]], ['generated mix 7', [[['i0', 10, 3, False], ['i1', 50, 15, True], ['i2', 30, 8, False], ['i3', 50, 1, True], ['i4', 25, 1, False], ['i5', 20, 8, True]], 50, 20], [[['i1'], ['i3'], ['i2', 'i5'], ['i4', 'i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]], ['generated mix 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['i0']], []]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]], ['generated mix 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['generated mix 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 48', [[['i0', 30, 3, False], ['i1', 5, 3, False], ['i2', 5, 10, False], ['i3', 60, 10, True]], 60, 20], [[['i3'], ['i0', 'i2', 'i1']], []]], ['generated mix 56', [[['i0', 10, 3, True], ['i1', 30, 8, False], ['i2', 5, 3, True], ['i3', 50, 15, True], ['i4', 40, 15, False], ['i5', 20, 11, True], ['i6', 60, 15, False]], 60, 20], [[['i6'], ['i3'], ['i4'], ['i1', 'i5'], ['i0', 'i2']], []]]], [['generated mix 24', [[['i0', 10, 3, True], ['i1', 50, 8, False], ['i2', 40, 10, True], ['i3', 10, 1, False]], 50, 20], [[['i1'], ['i2', 'i0'], ['i3']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 59', [[['i0', 25, 3, False], ['i1', 50, 11, False]], 50, 25], [[['i1'], ['i0']], []]], ['generated mix 67', [[['i0', 40, 11, False], ['i1', 5, 15, False], ['i2', 10, 3, False], ['i3', 20, 11, False], ['i4', 25, 10, False], ['i5', 50, 1, False], ['i6', 10, 8, False]], 60, 25], [[['i5', 'i6'], ['i0', 'i3'], ['i4', 'i2'], ['i1']], []]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exact fill | [[['b', 'a']], []] | [[['a', 'b']], []] | Failed |
| generated mix 1 | [[['i3', 'i4'], ['i1'], ['i2'], ['i0']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Failed |
| fragile vs heavy | [[['f'], ['h']], []] | [[['h'], ['f']], []] | Failed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['c', 'b'], ['a']], []] | [[['a', 'c'], ['b']], []] | Failed |
| heavy after fragile | [[['h'], ['f']], []] | [[['f'], ['h']], []] | Failed |
| weight limit splits | [[['b'], ['a']], []] | [[['a'], ['b']], []] | Failed |
| generated mix 9 | [[['i3'], ['i1'], ['i2']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Failed |
SHA-256 / 3632f3e40428a575f78f2ccf193ea4f6debcb00f3de056a52ea40afd82d604be
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (-it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if vol > tote_vol or wt > tote_wt:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 3', [[['i0', 50, 8, True], ['i1', 5, 3, False], ['i2', 10, 8, False]], 60, 25], [[['i0', 'i2'], ['i1']], []]], ['generated mix 7', [[['i0', 10, 3, False], ['i1', 50, 15, True], ['i2', 30, 8, False], ['i3', 50, 1, True], ['i4', 25, 1, False], ['i5', 20, 8, True]], 50, 20], [[['i1'], ['i3'], ['i2', 'i5'], ['i4', 'i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]], ['generated mix 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['i0']], []]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]], ['generated mix 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['generated mix 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 48', [[['i0', 30, 3, False], ['i1', 5, 3, False], ['i2', 5, 10, False], ['i3', 60, 10, True]], 60, 20], [[['i3'], ['i0', 'i2', 'i1']], []]], ['generated mix 56', [[['i0', 10, 3, True], ['i1', 30, 8, False], ['i2', 5, 3, True], ['i3', 50, 15, True], ['i4', 40, 15, False], ['i5', 20, 11, True], ['i6', 60, 15, False]], 60, 20], [[['i6'], ['i3'], ['i4'], ['i1', 'i5'], ['i0', 'i2']], []]]], [['generated mix 24', [[['i0', 10, 3, True], ['i1', 50, 8, False], ['i2', 40, 10, True], ['i3', 10, 1, False]], 50, 20], [[['i1'], ['i2', 'i0'], ['i3']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 59', [[['i0', 25, 3, False], ['i1', 50, 11, False]], 50, 25], [[['i1'], ['i0']], []]], ['generated mix 67', [[['i0', 40, 11, False], ['i1', 5, 15, False], ['i2', 10, 3, False], ['i3', 20, 11, False], ['i4', 25, 10, False], ['i5', 50, 1, False], ['i6', 10, 8, False]], 60, 25], [[['i5', 'i6'], ['i0', 'i3'], ['i4', 'i2'], ['i1']], []]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| generated mix 1 | [[['i0'], ['i3', 'i4'], ['i2'], ['i1']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Failed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| heavy after fragile | [[['h'], ['f']], []] | [[['f'], ['h']], []] | Failed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 9 | [[['i3'], ['i2'], ['i1']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Failed |
SHA-256 / 40a3f3a7cef721e663b3d8043e7dbf2eb6169ffab9a98bd79a9a83017f704769
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(items, tote_vol, tote_wt):
order = sorted(items, key=lambda it: (-it[1], -it[2], it[0]))
totes = []
oversize = []
for iid, vol, wt, fragile in order:
if vol > tote_vol or wt > tote_wt:
oversize.append(iid)
continue
placed = False
for t in totes:
if t['v'] + vol > tote_vol or t['w'] + wt > tote_wt:
continue
if fragile and t['heavy']:
continue
if wt > 10 and t['fragile']:
continue
t['ids'].append(iid)
t['v'] += vol
t['w'] += wt
t['heavy'] = t['heavy'] or wt > 10
t['fragile'] = t['fragile'] or fragile
placed = True
break
if not placed:
totes.append({'ids': [iid], 'v': vol, 'w': wt, 'heavy': wt > 10, 'fragile': fragile})
return [[t['ids'] for t in totes], sorted(oversize)]
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['generated mix 1', [[['i0', 60, 10, False], ['i1', 25, 1, False], ['i2', 60, 3, False], ['i3', 5, 10, True], ['i4', 10, 10, True]], 60, 20], [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 9', [[['i0', 60, 8, False], ['i1', 30, 10, False], ['i2', 50, 11, True], ['i3', 10, 15, True]], 50, 20], [[['i2'], ['i1'], ['i3']], ['i0']]]], [['generated mix 3', [[['i0', 50, 8, True], ['i1', 5, 3, False], ['i2', 10, 8, False]], 60, 25], [[['i0', 'i2'], ['i1']], []]], ['generated mix 7', [[['i0', 10, 3, False], ['i1', 50, 15, True], ['i2', 30, 8, False], ['i3', 50, 1, True], ['i4', 25, 1, False], ['i5', 20, 8, True]], 50, 20], [[['i1'], ['i3'], ['i2', 'i5'], ['i4', 'i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 11', [[['i0', 20, 3, False], ['i1', 60, 1, False]], 60, 25], [[['i1'], ['i0']], []]], ['generated mix 19', [[['i0', 30, 3, False], ['i1', 5, 11, True], ['i2', 50, 15, False], ['i3', 40, 11, False], ['i4', 60, 15, False], ['i5', 10, 15, False], ['i6', 25, 10, False], ['i7', 60, 8, True]], 50, 20], [[['i2'], ['i3'], ['i0', 'i5'], ['i6'], ['i1']], ['i4', 'i7']]], ['generated mix 27', [[['i0', 20, 10, False], ['i1', 25, 1, False], ['i2', 5, 11, True], ['i3', 20, 8, False], ['i4', 5, 10, False]], 60, 20], [[['i1', 'i0'], ['i3', 'i2'], ['i4']], []]]], [['generated mix 10', [[['i0', 5, 15, False], ['i1', 40, 11, True], ['i2', 25, 3, False], ['i3', 30, 1, False], ['i4', 20, 15, False], ['i5', 20, 10, False], ['i6', 30, 11, False]], 60, 20], [[['i1'], ['i6', 'i3'], ['i2', 'i4'], ['i5'], ['i0']], []]], ['generated mix 12', [[['i0', 10, 8, False], ['i1', 50, 11, True], ['i2', 5, 3, True], ['i3', 25, 3, True], ['i4', 60, 10, False]], 60, 20], [[['i4'], ['i1', 'i0'], ['i3', 'i2']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 22', [[['i0', 25, 1, False], ['i1', 30, 11, True], ['i2', 50, 1, False]], 50, 25], [[['i2'], ['i1'], ['i0']], []]], ['generated mix 30', [[['i0', 50, 15, True], ['i1', 30, 8, True], ['i2', 30, 10, False], ['i3', 5, 15, True], ['i4', 40, 10, True], ['i5', 40, 11, False], ['i6', 40, 1, True]], 50, 20], [[['i0'], ['i5'], ['i4'], ['i6'], ['i2'], ['i1'], ['i3']], []]], ['generated mix 38', [[['i0', 40, 10, False], ['i1', 60, 3, True], ['i2', 25, 10, True], ['i3', 10, 8, False], ['i4', 60, 11, True], ['i5', 40, 1, False]], 50, 20], [[['i0', 'i3'], ['i5'], ['i2']], ['i1', 'i4']]]], [['generated mix 17', [[['i0', 25, 1, True], ['i1', 60, 10, False], ['i2', 5, 1, True], ['i3', 10, 1, False], ['i4', 50, 8, False], ['i5', 40, 8, False]], 60, 25], [[['i1'], ['i4', 'i3'], ['i5', 'i2'], ['i0']], []]], ['oversize weight', [[['x', 10, 30, False], ['y', 10, 1, False]], 50, 20], [[['y']], ['x']]], ['first fit not best fit', [[['a', 40, 1, False], ['b', 30, 1, False], ['c', 10, 1, False]], 50, 20], [[['a', 'c'], ['b']], []]], ['fragile vs heavy', [[['h', 30, 12, False], ['f', 10, 1, True]], 50, 20], [[['h'], ['f']], []]], ['generated mix 32', [[['i0', 10, 8, False], ['i1', 50, 8, False]], 50, 20], [[['i1'], ['i0']], []]], ['generated mix 40', [[['i0', 10, 10, True], ['i1', 30, 1, False], ['i2', 30, 1, False], ['i3', 20, 10, False]], 60, 25], [[['i1', 'i2'], ['i3', 'i0']], []]], ['generated mix 48', [[['i0', 30, 3, False], ['i1', 5, 3, False], ['i2', 5, 10, False], ['i3', 60, 10, True]], 60, 20], [[['i3'], ['i0', 'i2', 'i1']], []]], ['generated mix 56', [[['i0', 10, 3, True], ['i1', 30, 8, False], ['i2', 5, 3, True], ['i3', 50, 15, True], ['i4', 40, 15, False], ['i5', 20, 11, True], ['i6', 60, 15, False]], 60, 20], [[['i6'], ['i3'], ['i4'], ['i1', 'i5'], ['i0', 'i2']], []]]], [['generated mix 24', [[['i0', 10, 3, True], ['i1', 50, 8, False], ['i2', 40, 10, True], ['i3', 10, 1, False]], 50, 20], [[['i1'], ['i2', 'i0'], ['i3']], []]], ['exact fill', [[['a', 30, 5, False], ['b', 20, 5, False]], 50, 20], [[['a', 'b']], []]], ['heavy after fragile', [[['f', 30, 1, True], ['h', 10, 12, False]], 50, 20], [[['f'], ['h']], []]], ['weight limit splits', [[['a', 10, 15, False], ['b', 10, 6, False]], 50, 20], [[['a'], ['b']], []]], ['generated mix 43', [[['i0', 5, 8, False], ['i1', 10, 3, False], ['i2', 40, 15, False], ['i3', 40, 15, False], ['i4', 20, 1, False], ['i5', 50, 11, False], ['i6', 20, 3, False]], 50, 20], [[['i5'], ['i2', 'i1'], ['i3'], ['i6', 'i4', 'i0']], []]], ['generated mix 51', [[['i0', 25, 11, False], ['i1', 40, 3, False], ['i2', 5, 15, True], ['i3', 60, 10, False], ['i4', 40, 15, False], ['i5', 40, 15, False], ['i6', 30, 15, False], ['i7', 50, 15, True]], 60, 20], [[['i3'], ['i7'], ['i4'], ['i5'], ['i1', 'i2'], ['i6'], ['i0']], []]], ['generated mix 59', [[['i0', 25, 3, False], ['i1', 50, 11, False]], 50, 25], [[['i1'], ['i0']], []]], ['generated mix 67', [[['i0', 40, 11, False], ['i1', 5, 15, False], ['i2', 10, 3, False], ['i3', 20, 11, False], ['i4', 25, 10, False], ['i5', 50, 1, False], ['i6', 10, 8, False]], 60, 25], [[['i5', 'i6'], ['i0', 'i3'], ['i4', 'i2'], ['i1']], []]]]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| exact fill | [[['a', 'b']], []] | [[['a', 'b']], []] | Passed |
| generated mix 1 | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | [[['i0'], ['i2'], ['i1', 'i4'], ['i3']], []] | Passed |
| fragile vs heavy | [[['h'], ['f']], []] | [[['h'], ['f']], []] | Passed |
| oversize weight | [[['y']], ['x']] | [[['y']], ['x']] | Passed |
| first fit not best fit | [[['a', 'c'], ['b']], []] | [[['a', 'c'], ['b']], []] | Passed |
| heavy after fragile | [[['f'], ['h']], []] | [[['f'], ['h']], []] | Passed |
| weight limit splits | [[['a'], ['b']], []] | [[['a'], ['b']], []] | Passed |
| generated mix 9 | [[['i2'], ['i1'], ['i3']], ['i0']] | [[['i2'], ['i1'], ['i3']], ['i0']] | Passed |
SHA-256 / 351b396de1fa45ebcf9463dd9e386e20b3caed11d72b2de434a3aabdeef74b6a
Verification & scope
Stipulated first-fit rule; 10 kg heavy threshold is a toy contract constant. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:52:08.962045+00:00.
Case digest / fd930cb35f63815b09093eff8c3a748d984dcbbac980a16f2823f5980de77b99