多維度背包問題

現實中的資源分配很少只有一個維度。例如:

  • 貨車配送:同時受限於體積與重量
  • 雲端資源分配:同時受限於 CPU、記憶體、頻寬
  • 專案管理:同時受限於時間、人力、預算

CP-SAT 多維度排箱

from ortools.sat.python import cp_model

# 物品:每個物品有 (體積, 重量, 價值)
items = [
    (10, 5, 100),   # 物品 0
    (15, 8, 150),   # 物品 1
    (8, 3, 80),     # 物品 2
    (20, 12, 200),  # 物品 3
    (12, 7, 120),   # 物品 4
    (6, 4, 60),     # 物品 5
    (18, 10, 180),  # 物品 6
    (14, 9, 140),   # 物品 7
]

# 箱子容量
max_volume = 30
max_weight = 15

num_items = len(items)

model = cp_model.CpModel()

# 變數:x[i] = 1 表示物品 i 被選中
x = [model.NewBoolVar(f"x_{i}") for i in range(num_items)]

# 限制:總體積不超過
model.Add(sum(items[i][0] * x[i] for i in range(num_items)) <= max_volume)

# 限制:總重量不超過
model.Add(sum(items[i][1] * x[i] for i in range(num_items)) <= max_weight)

# 目標:最大化總價值
model.Maximize(sum(items[i][2] * x[i] for i in range(num_items)))

# 求解
solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL:
    print(f"\n=== 多維度背包結果 ===")
    print(f"最佳價值: {int(solver.ObjectiveValue())}")
    
    selected = [i for i in range(num_items) if solver.Value(x[i])]
    total_vol = sum(items[i][0] for i in selected)
    total_wt = sum(items[i][1] for i in selected)
    
    print(f"選中物品: {selected}")
    print(f"總體積: {total_vol}/{max_volume}")
    print(f"總重量: {total_wt}/{max_weight}")
else:
    print("無解")

解鎖完整教學內容

本章為付費內容。加入專案即可解鎖超過 5000 字的深度解析,包含 10 個以上神級 Prompt 與真實 Source Code 範例!