# INDRODUCTION TO ARTIFICIAL INTELLIGENCE ## HW1 ## 1. (10%) 以文字說明如何實現 P1 (Brute Force) ? ```python= temp = 999999 #initialize the value for x in range(x_lower_bound, x_upper_bound): for y in range(y_lower_bound, y_upper_bound): if func(x,y) <= temp: temp = func(x,y) temp_x, temp_y = x, y return temp, temp_x, temp_y #return [minimun of f(x,y), x, y] ``` 以2個 `for` 迴圈遍巡在 `x` 和 `y` 的上下界中的所有數值組合 若帶入`func()`得到的值比`temp`小就會替換掉 不斷重複這個動作直至所有組合都執行過後結束這個程式 > 以作業中所附的`input.txt`給的 x 和 y 範圍,該過程會執行 > [60-(-60)]*[70-(-30)]=12000 次 func() ## 2. (20%) P2 (SA,模擬退火法) 透過調整參數觀察到什麼? 模擬退火法中經典的Metropolis演算法,以一定概率的接受新的狀態 \begin{equation} Probability= \left\{ \begin{array}{lr} 1 &, E(x_{new})\ <\ E({x_{old}}) \\ \exp(-\frac{E(x_{new})\ -\ E({x_{old}})}{T}\ \ ) & E(x_{new})\ \geq\ E({x_{old}})\\ \end{array} \right. \end{equation} 經典模擬退火演算法的降溫方式為 \begin{equation} T(t)=\frac{T_{0}}{log(1+t)} \\ \end{equation} 作業中嘗試的降溫方式為 \begin{equation} T(t)=\frac{T_{0}}{1+t} \end{equation} 以下方組合嘗試: | Initial_T | Minimun_T | The annealing schedule| |:---------:|:--------:|:--------------:| | 1000 | 10 | $T(t)=\frac{T_{0}}{1+t}$| :::danger 發現Metropolis演算法求換成較差的neighbor的機率非常高 導致求最小解的過程會不斷替換,沒有意義 ::: 經嘗試後發現關係為求解時`Initial_T`和`Minimun_T`的數量級會影響該機率 $\exp(-\frac{E(x_{new})\ -\ E({x_{old}})}{T}\ )$ 中 $E(x_{new})\ -\ E({x_{old}})$ 和 $T$ 若相差太多倍會使得機率趨近於1。 因而調整`Initial_T`和`Minimun_T`的比例以及降溫的方法 | Initial_T | Minimun_T | The annealing schedule| |:---------:|:--------:|:--------------:| | 0.01 | 0.00001 | $T(t+1)=T(t)*\beta$ ($\beta=0.999$)| 可得出結果(總執行次數:6906): ![](https://i.imgur.com/NLdobJP.png) 左方為求解的過程中最小值的變化,而右邊為求解過程中記錄發生替換的變化(`值=1`為找到較小解、`值=2`為$E(x_{new})\ \geq\ E({x_{old}})$ 但替換成較差的neighbor的發生次數) 嘗試下列組合 | Initial_T | Minimun_T | The annealing schedule| |:---------:|:--------:|:--------------:| | 0.01 | 0.00001 | $T(t+1)=T(t)*\beta$ ($\beta=0.99$)| | 0.01 | 0.00001 | $T(t+1)=T(t)*\beta$ ($\beta=0.97$)| $\beta=0.99$ (總執行次數:689) ![](https://i.imgur.com/HmI9Y3f.png) $\beta=0.97$ (總執行次數:228) ![](https://i.imgur.com/zBtzG9x.png) :::info **發現$\beta$越接近1**過程中**接近最小的過程越快**(以執行的整個過程而言) :fire: **但其中也發現$\beta=97$時並未找出最小解就執行完畢了** :zap: **注意:** 執行的次數較多,且接近最小值的執行次數仍比較多 ::: :::success 接下來嘗試以固定機率將最小值替換成較小的解,嘗試下列組合 ::: $P=0.01$ 且 $\beta=0.999$ (總執行次數:4604) ![](https://i.imgur.com/KQvxrCq.png) $P=0.01$ 且 $\beta=0.99$ (總執行次數:460) ![](https://i.imgur.com/MYHZoFp.png) $P=0.001$ 且 $\beta=0.999$ (總執行次數:4604) ![](https://i.imgur.com/C0Cnfu4.png) $P=0.001$ 且 $\beta=0.99$ (總執行次數:460) ![](https://i.imgur.com/N2c52cY.png) 發現**當 $P=0.01$ 且 $\beta=0.99$ 的組合**過程中發生替換成較差neighbor的圖形較理想,有替換成較差的值最終也能收斂於最小解,且執行的次數也較少。 :::warning :zap: 該方法也具機率性無法找到最小解 ::: ## 3. (10%) 比較兩方法有哪些優缺點?實作過程的心得? 暴力法中所有的組合都會被嘗試過一遍,雖然可能需要執行較多次,但**保證得出來的一定是最小解**,但當精度提高後,可能需要小數點後3位、甚至更高的需求,而**執行的次數則是以$10^n$成長**,但**可以作為不同測試方法的baseline**。 相較之下,模擬退火演算法具有一定的機率得到最佳解,缺點也包含**需要針對各種任務設計不同的參數**、演算法,但模擬退火卻大大減少需要測試的次數,利於在**提高精度的時候可以減少不少運算量**。 在設計模擬退火法時,我認為主要影響的參數有: 1. 如何取下一個嘗試的值(如何在函式中移動),若移動的太多則會錯過最佳解,若太小有可能卡在區域最佳解,本次作業隨機數取值的範圍為總範圍的$\frac{1}{10}$(移動的step為總範圍的$\frac{1}{10}$以內) ```python= x_new = x + random.randint(ads(x_lower_bound)*-0.1, x_upper_bound*0.1) y_new = y + random.randint(abs(y_lower_bound)*-0.1, y_upper_bound*0.1) ``` 2. 模擬降溫的方法會影響執行的次數 3. 如何設計替換成較差解的方法,可以設計成隨著執行次數增加減少替換的機率(假設在會找到最佳解的基礎上) 4. 找的起始點 寫作業的時候蠻像在調整神經網路的參數,但依據不同的任務需要調整找解的方法,而了解運作的原理則有助於較有系統的調整。 :::info 我認為該種找尋方法依賴於對題目的理解,若無法公布測資則無法針對題目做特定的優化方法,可能會影響到是否能找出最佳解。 :::