背包問題與選題最佳化

實戰:預算分配

你是一家新創公司的 CTO,有 500 萬的技術預算。面對 10 個可能的技術投資項目,每個項目有不同的成本與預期回報,如何分配預算才能最大化總回報?

from ortools.sat.python import cp_model

# 項目資料
projects = [
    ("AI 客服", 150, 400),
    ("數據平台", 200, 350),
    ("App 開發", 180, 300),
    ("SEO 優化", 50, 180),
    ("績效系統", 120, 250),
    ("自動化測試", 80, 200),
    ("安全稽核", 60, 150),
    ("國際化", 100, 220),
    ("API 平台", 160, 280),
    ("BI 儀表板", 90, 190),
]

budget = 500  # 萬

model = cp_model.CpModel()

x = [model.NewBoolVar(f"x_{i}") for i in range(len(projects))]

# 預算限制
model.Add(sum(projects[i][1] * x[i] for i in range(len(projects))) <= budget)

# 相依性:如果選 AI 客服,必須也選數據平台
model.Add(x[0] <= x[1])

# 互斥:App 開發與 API 平台只能選一個
model.Add(x[2] + x[8] <= 1)

# 目標:最大化回報
model.Maximize(sum(projects[i][2] * x[i] for i in range(len(projects))))

solver = cp_model.CpSolver()
status = solver.Solve(model)

if status == cp_model.OPTIMAL:
    print(f"\n=== 預算分配結果 ===")
    print(f"最佳總回報: {int(solver.ObjectiveValue())} 萬")
    print(f"預算上限: {budget} 萬")
    
    total_cost = 0
    for i, (name, cost, ret) in enumerate(projects):
        if solver.Value(x[i]):
            total_cost += cost
            print(f"✅ {name}: 成本 {cost}萬, 回報 {ret}萬")
    print(f"\n總使用預算: {total_cost} 萬")
else:
    print("無法找到最佳解")

解鎖完整教學內容

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