
卡繆寫的《異鄉人》,主角在熾熱的海邊犯下錯事
天氣漸漸變熱,雖然偶爾來的一場雨可以讓人涼快不少,但大家也沒改變未來的幾個月裡會越來越頻繁開冷氣的預期。大家都不喜歡大熱天,脾氣會暴躁,有聽過老一輩的說夏天裡的紛爭與治安問題比較多,就像存在主義作家卡繆寫的《局外人》,主角在熾熱的海邊下扣動了扳機。
為了避免大家在大熱天裡躁動,建築師會盡量營造一個涼爽舒適的環境。雖然我不是讀建築的,但在和撰寫論文中的建築系同學討論到他的研究內容時,得知有些研究會用許多條件機率來表達各種條件下(如建築材料、天氣),人們可能會有的行為反應。

卡繆《異鄉人》的主角在熾熱的海邊
本篇Vocus文章即是想用"Algorithms for Decision Making"這本書的第二章所講述的貝氏網路模型,來應用在炎熱環境下建築中的人們的行為研究上。文章分成三個部分,首先是介紹Google Colab裡面可以怎麼執行Julia,然後我們會按書本中的貝氏網路範例來執行,最後用建築環境研究為例子來講述可以應用的實際場景。
本篇文章的Julia程式都放在Google Colab。
在Google Colab裡撰寫與執行Julia

Algorithms for Decision Making
Google Colab默認的執行程式是Python,所以大家可以不用布置本機的開發環境、直接在Google Colab的網頁上就可以編寫Python,尤其適合小段程式的編寫或是範例共享,比方說課本中的小例子。但是在Google Colab裡要寫Julia,則需要先下載Julia並安裝IJulia,相關程式碼如下:
# Download Julia
!wget https://julialang-s3.julialang.org/bin/linux/x64/1.9/julia-1.9.3-linux-x86_64.tar.gz
# Extract the tarball
!tar -xvzf julia-1.9.3-linux-x86_64.tar.gz
# Move Julia to /usr/local
!mv julia-1.9.3 /usr/local/julia
# Create a symlink to make Julia available system-wide
!ln -s /usr/local/julia/bin/julia /usr/local/bin/julia
# Test the installation
!julia --version
# Install IJulia
!julia -e 'using Pkg; Pkg.add("IJulia"); using IJulia; println("IJulia installation complete.")'
這塊程式碼可以當作在Google Colab裡編寫Julia前的開頭preamble,後面就可以復現"Algorithms for Decision Making"第二章的內容,但是也不能直接在cell裡面編寫,要在cell的開頭標明這段程式是對Julia的一些scripts進行處理。主要有以下幾個常用的程式碼負責標示該cell的程式碼是Julia的:
!rm my_script.jl:清除my_script.jl這個Julia的程式腳本%%writefile my_script.jl:寫my_script.jl%%writefile -a my_script.jl:在my_script.jl裡新增程式碼!julia my_script.jl:執行my_script.jl!cat my_script.jl:查看my_script.jl
具體程式碼可參考前面提到的Google Colab範例腳本。雖然說需要經過這些額外的動作、與不太方便的執行手續,才能讓Julia的腳本在Google Colab裡順利運行,但我想如果程式已經編寫完整、不太需要debug、也篇幅不大的情況下,用Google Colab來執行Julia程式仍不失為一個不錯的途徑。尤其他不用搭建本機的環境、任何連上網路的電腦都能查看並編輯,還方便分享,我想範例的東西我還是會在Google Colab上做。
在介紹Google Colab如何執行Julia程式之後,下個部分會進入到本文的重點,即為機率圖模型中的貝氏網路。
貝氏網路Bayesian Networks

貝葉斯 Bayes
貝葉斯這個名字相信大家都不陌生,我記得在高中數學的統計部分、條件機率就有提到他的名字。貝氏網路也是建立在條件機率的基礎上,讓我們能夠計算各個變數組合起來下的機率。
很多時候我們觀察一個變數是在給定其他條件下得出的機率,像是我們一定是在某種天氣狀況下選擇要進草屋乘涼、還是進磚房休息,不會有不屬於任何一種天氣類型的情況,所以我們觀察人們選擇進哪種建材的房屋一定是在某個天氣條件下得出結果,這是一種條件機率,而貝氏網路的chain rule可以幫助我們計算各種變數組合出整體情況(不給定條件)的機率,公式如下:

至於貝氏網路的圖結構可以幫助我們理解條件機率之間的關係,"Algorithms for Decision Making"書中有提到一個衛星的例子,這個圖網路如下:

這個例子在說有一個衛星有一個故障的排查系統,電力系統E的失效可能是因為電池B的失效或太陽能板S的失效,並且電力系統E的失效會導致軌道D偏離或通訊C失效,而B和S的失效則是依賴於自身的穩定性。也就是說,E依賴於B和S,D和C則分別依賴於E,這種依賴的關係我們可以寫成條件機率,但是我們要如何計算各種情況發生的機率,即這五個變數在各種狀態下的整體機率?知道各種情況發生的機率有助於我們首先要改進哪些系統來增進穩定性。
這時候就要用到chain rule,假如正常運作標為0、失效標為1,我們可以看整個衛星系統的這五個變數(五種設備)都正常的機率,其chain rule公式如下:

對照貝氏網路的圖結構,我們可以看到把各個條件機率相乘後即得到不給定其他條件下的整體機率,在衛星的例子中,能夠衡量我們到底多有把握這個衛星的系統是穩定的。
這個例子也是書中有附Julia程式碼的部分,復現結果已經放在Google Colab。
以建築環境的研究為例

以我最近新得知的城市巴勒摩的天氣為例
我們可以把貝氏網路應用在許多研究上,最近有個建築系的同學便用了給定時間段和空間的條件機率來計算人們的熱適應行為,實際上就是有三個節點的貝氏網路。我們也可以用類似的圖結構來做一個實際應用的例子,同樣也是三個節點,分別是天氣W、建材M與行為A,可以想成是三種想研究的因素,而這三種因素又分別有三種狀態:天氣W分別有雨天(w=1)、陰天(w=2)、晴天(w=3);建材M分別有草屋(m=1)、木屋(m=2)、磚房(m=3);熱適應行為分別有開窗(a=1)、開電風扇(a=2)、捲袖子(a=3)三種行為,我們可以在Julia裡面輸入這些變數與可能的狀態:
# This is a case study for the BayesianNetwork
# W: weather
# M: material
# A: action
W = Variable(:w, 3) # 雨天(w=1)、陰天(w=2)、晴天(w=3)
M = Variable(:m, 3) # 草屋(m=1)、木屋(m=2)、磚房(m=3)
A = Variable(:a, 3) # 開窗(a=1)、開電風扇(a=2)、捲袖子(a=3)
接下來我們要在這三個變數的基礎上建立貝氏網路,首先建立factor table,相當於把在各種條件下觀察到的結果記錄下來,而後建立圖網路的邊,即因素之間影響的關係。在我們的建築環境研究案例中,天氣的機率我是按最近新認識的城市——巴勒摩Palermu的平均一年有75天是雨天來算,算成降雨機率是0.2,至於另外沒下雨的幾天則再分成因天和晴天,機率則自己分別給定為0.3和0.5。巴勒摩是義大利西西里島上的一個城市,是南歐、非洲與西亞諸多地方來往、人潮匯集的地方。
至於在給定天氣下人們會跑進哪種建材房子的機率,是分成草屋、木屋、磚房。這裡的機率我有點按照直覺來設定,雨天的時候大家喜歡在磚房躲雨、陰天和晴天的時候喜歡在草屋與大自然接觸。至於最後人們會採取怎樣的熱適應行為,因為有3個變數3種情況,所以有3×3×3=27種情況的機率要設定,這交給ChatGPT來隨機給定。
最後,在設定好factor table之後,我們還要設定圖的「邊」,這裡設定天氣不受另外兩個因素的影響,而天氣會影響人們比較想待在什麼樣的房子,最後,天氣和建材都會影響人們的熱適應行為。如果天氣W1標為1、建材M標為2、行為A標為3,那麼圖有從1指向2的邊、從2指向3的邊、從1指向3的邊。具體factor table和邊的程式碼如下:
vars = [W, M, A]
factors = [
Factor([W],FactorTable((w=1,) =>0.2,(w=2,) =>0.3,(w=3,) =>0.5)),
Factor([M, W], FactorTable(
(m=1,w=1) => 0.05,(m=1,w=2) =>0.40,(m=1,w=3) =>0.45,
(m=2,w=1) => 0.20,(m=2,w=2) =>0.30,(m=2,w=3) =>0.30,
(m=3,w=1) => 0.75,(m=3,w=2) =>0.30,(m=3,w=3) =>0.25)),
Factor([A, M, W], FactorTable(
(a=1, m=1, w=1) => 0.20,
(a=1, m=1, w=2) => 0.35,
(a=1, m=1, w=3) => 0.15,
(a=1, m=2, w=1) => 0.05,
(a=1, m=2, w=2) => 0.10,
(a=1, m=2, w=3) => 0.10,
(a=1, m=3, w=1) => 0.01,
(a=1, m=3, w=2) => 0.03,
(a=1, m=3, w=3) => 0.01,
(a=2, m=1, w=1) => 0.02,
(a=2, m=1, w=2) => 0.03,
(a=2, m=1, w=3) => 0.05,
(a=2, m=2, w=1) => 0.04,
(a=2, m=2, w=2) => 0.20,
(a=2, m=2, w=3) => 0.60,
(a=2, m=3, w=1) => 0.01,
(a=2, m=3, w=2) => 0.02,
(a=2, m=3, w=3) => 0.03,
(a=3, m=1, w=1) => 0.10,
(a=3, m=1, w=2) => 0.15,
(a=3, m=1, w=3) => 0.20,
(a=3, m=2, w=1) => 0.02,
(a=3, m=2, w=2) => 0.03,
(a=3, m=2, w=3) => 0.04,
(a=3, m=3, w=1) => 0.06,
(a=3, m=3, w=2) => 0.25,
(a=3, m=3, w=3) => 0.20
))
]
graph = SimpleDiGraph(3)
add_edge!(graph, 1, 2)
add_edge!(graph, 2, 3)
add_edge!(graph, 1, 3)
net = BayesianNetwork(vars, factors, graph)
設定好貝氏網路之後,我們可以看各種情況發生的機率,本文在此舉三個例子,分別為(一)雨天待在草屋的人去開窗的機率、(二)陰天待在木屋的人去開電風扇的機率、(三)晴天待在磚房裡捲袖子的機率。計算過程的程式碼如下:
cases = [
(a=1, m=1, w=1),
(a=2, m=2, w=2),
(a=3, m=3, w=3)
]
# case 1: 雨天、草屋、開窗
# case 2: 陰天、木屋、開電風扇
# case 3: 晴天、磚房、捲袖子
for case in cases
prob = probability(net, Assignment(case))
println("P$(case) = $prob")
end
最後印出來的結果:
P(a = 1, m = 1, w = 1) = 0.0020000000000000005
P(a = 2, m = 2, w = 2) = 0.018
P(a = 3, m = 3, w = 3) = 0.025
從這個計算結果可以看到,第一種情況、即雨天待在草屋的人去開窗的機率是0.002,第二種情況、即陰天待在木屋的人去開電風扇的機率是0.018,第三種情況、即晴天待在磚房裡捲袖子的機率是0.025。第一種情況之所以機率那麼小,主要原因是我在主觀設定雨天待在草屋的條件機率本身特別小,所以整體情況發生的機率就會小得多。透過貝氏網路,我們可以清楚不同因素之間的影響關係,加上貝氏網路的chain rule,我們可以計算各種情況組合起來的發生機率。
小記

強化學習在阿瓦隆的應用論文
兩年半前我便想用Algorithms for Decision Making第二章的貝氏網路來寫一篇文章,那個時候想應用在阿瓦隆遊戲的情境裡,像是遊戲場上的一些舉動可能比較會是壞人,用條件機率的話來講,便是給定一些已經發生的舉動,那麼做出這些舉動的人有多大的可能會是壞人。聽起來好像滿合理,但是又覺得例外的狀況太多、或是例子可能沒那麼有說服力,有點沒辦法單用貝氏網路來推斷,後來便擱筆。
後來有看到一些研究阿瓦隆的文章,像是"Finding Friend and Foe in Multi-Agent Games"這篇由哈佛和麻省理工的研究員所撰寫的文章,即是用強化學習的方法來模擬阿瓦隆的遊戲策略,這些是"Algorithms for Decision Making"這本書後面的內容了。
想想醞釀這篇文章的這兩年半有什麼變化,從疫情時代走出來,從學生變成上班族,周遭也算物是人非,我也只是像強化學習裡的一個agent,還在不斷變化的狀態中學習。
這篇文章獻給我的母親,阿嬤說她設計了阿公阿嬤家,所以也算是個建築師
2025/5/9,新北板橋,小胡
參考文獻
Kochenderfer, M. J., Wheeler, T. A., & Wray, K. H. (2022). Algorithms for decision making. MIT press.
Stokey, N. L., & Lucas Jr, R. E. (1989). Recursive methods in economic dynamics. Harvard University Press.
Guo, D., Yang, D., Zhang, H., Song, J., Zhang, R., Xu, R., ... & He, Y. (2025). Deepseek-r1: Incentivizing reasoning capability in llms via reinforcement learning. arXiv preprint arXiv:2501.12948.
Serrino, J., Kleiman-Weiner, M., Parkes, D. C., & Tenenbaum, J. (2019). Finding friend and foe in multi-agent games. Advances in Neural Information Processing Systems, 32.
Camus, A. (2022). 異鄉人 (Vol. 5). 新潮社文化事業有限公司出版 創智文化有限公司總經銷.




