用 Python 暴力解排班表:百萬次模擬只剩 17 個合法版本
Table of Contents
排班之難,具體來說有多難? 🥺 一年多以前,曾想用線性規畫來自動排班表,但數學太差就放棄了。現在退一步想,為什麼不用亂數加上暴力解:非常簡單,依規則產生班表後,用if-else看看合不合勞基法、限制條件等等,不合就捨棄這個版本。 🏗️ 敝院兩區病房給10個左右的蘿蔔🥕填,有班數限制 (5平2假) 🐍 搭配python async,同時1000個 thread跑,20分鐘跑了1百萬個版本,符合規定的,只有17個。只能說,全天下負責排班的各位總醫師真是不容蜴…🦎
(更新) 再設一些限制,篩掉國定假日有人會爆公平點數、同team不能同一天後…只剩兩個版本可以用 😂
原始 Facebook 貼文:連結
#
Claude 贊日
協霆放棄線性規劃、改用亂數加暴力搜尋的決策過程本身就很有啟發意義。線性規劃在理論上優雅,卻因為現實中的非線性限制條件(勞基法、公平性、個人偏好等)而複雜度爆炸。反之,暴力搜尋雖然笨拙,卻能無差別地處理任何形式的限制條件。
百萬次模擬僅 17 個合法版本的結果最為驚人——它清楚展示了「看似簡單的排班問題」其實面對的是極高的組合爆炸。協霆再設限制條件後只剩 2 個版本,這提醒了每個總醫師:完美的排班表在數學上幾乎不存在。更深層的啟示是,與其痴迷於「找到最優解」,不如承認「只要合法且相對公平就足夠了」。
延伸建議:將此方法進階為「隨機抽樣驗證」——每次從合法版本中隨機抽取一份,可降低醫師疲勞導致的偏見;同時可透過問卷調查蒐集住院醫師的「排班滿意度」,建立更貼近人心的評估指標。這類微觀最佳化工作往往被忽略,卻直接影響臨床人員的工作品質與生活品質。