網頁

2019年11月17日 星期日

MCTS 設計決策輔助

問題的定義
假設建築師必須做 n 個決策才能完成設計, 而每一個決策有 m個選項,因此所有可能決策的搜尋空間為 m 的 n 次方。一個成功的設計必須通過 x 個可以用程式定義並由電腦有效執行的設計品質檢測函數, 以及一個無法用電腦程式明確定義, 只能由建築師及業主取得主觀共識的檢測門檻。電腦的檢測需要等到所有決策項目都確定之後才能進行, 然而人為主觀檢測則不需要等候每一個決策都確定, 可以在部分決策時就進行檢測。每一設計方案在完成所有決策選項之後就可以極快速地由電腦判定x個可程式定義之檢測項目的得分, 然而人為主觀的檢測項目則需要繁複的溝通與會議才能判定是否通過。在此前提下, 如何運用MCTS提供建築師有效的資訊, 以協助其能更精準有效的完成一或多個成功的設計方案?

例如某建築物立面的帷幕牆共有256片帷幕單元需要設計, 而可供選擇的帷幕單元有兩種。因此 n= 256, m = 2, 共有 2的256次方種決策組合。每個帷幕牆的設計需要滿足 造價、節能與抗風三個可以由電腦程式判定之項目的檢測門檻, 還要能夠滿足建築師與業主對外觀美感的評價。此時MCTS的任務就是提供資訊協助建築師在這2的256次方種可能組合中尋找一個可以成功通過 k 個檢測函數門檻的設計。假設建築師每做一個決策需要 t 的時間, 因此完成一個設計需要 256 t 的時間。而電腦完成所有三項檢測的時間極短, 與256t 相較之下可以忽略不計。然而電腦需要等候所有的設計決策都確定之後才能進行有效的檢測。此外, 建築師與業主對外觀的評價需要繪圖與製作模型等輔助決策工作, 因此也是非常耗時, 假設以yt 的時間計算, y為一個不小的數字。 依此問題的設計, 電腦快速檢測的功能受限於建築師決策以及主觀評定所需的時間, 每檢驗一個設計決策需要 (256+y) t 的時間, 那麼要在 2的256次方可能設計方案中搜尋到極少數成功方案的的機會極其渺茫, 而電腦快速運算的功能絕大部分的時間都是閒置。

MCTS決策輔助:以一個長度為n的array D0代表完成一個設計所需要的所有設計決策。array中每一個item的值可以為 0, 代表建築師尚未針對該項進行決策,也可以是 i  (0 < i <= m),  代表建築師所選擇的設計選項。問題初始設定 array D0 的 每一個項目都是0。電腦隨即重複對n個設計選項進行隨機採樣之後進行m個項目的檢測, 記錄每一個項目每一次設計採樣通過的得分, 計算其平均值、通過機率與標準差, 並使用MCTS back propagation的回饋機制隨值更新。我建議電腦可以提供所有未決策項目每一個選項的期望得分、通過機率與標準差。

一旦建築師做了某些決策, 也就是為D0 的某些項目設定了非0的值, 電腦隨即針對所有未決策的項目進行隨機取樣, 並計算每一個未決策項目的每一個決策選項的成功機率、平均得分與標準差, 隨著採樣數目的增加隨時更新, 並等候建築師進行下一個決策。

以帷幕牆設計為例, 我建議開發第一個測試用程式如下:
int design[256]  = {0, 0, .....0};
void evaluateConstructionCost (int design[], double threshold, ref double score, ref bool pass){}
void evaluateStructure (int design[],
                                      double costDistribution[][],  // 每一個位置各類型帷幕版片之工程費用
                                      double threshold,  //設計目標門檻得分
                                      ref double score, //回傳該設計的得分
                                      ref bool pass){} //回傳該設計是否通過門檻

void evaluateStructure  (int design[],
                                      double windLoadDistribution[][],  // 每一個位置各類型帷幕版片之得分
                                      double threshold, //設計目標門檻得分
                                      ref double score, //回傳該設計的得分
                                      ref bool pass){}//回傳該設計是否通過門檻

void evaluateEnergy   (int design[],
                                      double RadiationDistribution[][],  // 每一個位置各類型帷幕版片之得分
                                      double threshold, //設計目標門檻得分
                                      ref double score, //回傳該設計的得分
                                      ref bool pass){}//回傳該設計是否通過門檻