中午去公司附近的自助餐,面對琳瑯滿目的菜色,腦海裡不自覺跑起了最佳化演算法:
// 偽代碼:自助餐決策引擎
function optimizeLunch(array $dishes, int $stomachCap, int $timeLimit): array {
// 1. 預處理:過濾過敏源、已吃膩的
$dishes = array_filter($dishes, fn($d) => !$d['allergic'] && $d['novelty'] > 0.3);
// 2. 評分模型:滿足度 = 味道*0.4 + 營養*0.3 + 新鮮度*0.2 + 稀有度*0.1
foreach ($dishes as &$d) {
$d['score'] = $d['taste']*0.4 + $d['nutrition']*0.3 + $d['freshness']*0.2 + $d['rarity']*0.1;
$d['efficiency'] = $d['score'] / $d['volume'];
}
// 3. 貪婪 + 回溯修正 (近似最佳)
usort($dishes, fn($a,$b) => $b['efficiency'] <=> $a['efficiency']);
$selected = [];
$usedVol = 0;
foreach ($dishes as $dish) {
if ($usedVol + $dish['volume'] <= $stomachCap) {
// 檢查依賴:若需配菜且未選,嘗試加入配菜
if ($dish['requires'] && !in_array($dish['requires'], array_column($selected, 'id'))) {
$side = findDish($dish['requires']);
if ($side && $usedVol + $dish['volume'] + $side['volume'] <= $stomachCap) {
$selected[] = $side;
$usedVol += $side['volume'];
}
}
$selected[] = $dish;
$usedVol += $dish['volume'];
}
}
// 4. 時間成本懲罰
$selected = array_filter($selected, fn($d) => $d['queueTime'] < $timeLimit * 0.3);
return $selected;
}
| 自助餐概念 | 軟體專案對應 | 管理啟示 |
|---|---|---|
| 胃容量 | 人力/預算/時間 | 資源有限,必須取捨 |
| 菜色多樣 | 功能需求/技術債/重構項目 | 不可能全做,需優先級排序 |
| 單位滿足度 | ROI (投資報酬率) | 聚焦高價值交付 |
| 不可分割 | 最小可行功能 (MMF) | 拆分至可獨立交付單元 |
| 動態補貨 | 需求變更/新技術出現 | 保持彈性架構,定期重新評估 |
| 社交干擾 | 利害關係人施壓/最新技術炒作 | 數據驅動決策,不盲目跟風 |
自助餐是資源受限下的即時最佳化演練;軟體專案則是持續迭代的長期最佳化。學會在自助餐前「建模、評分、取捨」,同樣的思維框架能幫你在專案規劃中做出更理性的決策——只是別忘了,身體才是本錢,別真把胃吃壞了。