:::danger
老師重新說明一次 CAN 要考慮自己,然後什麼不可以拿自己證
:::
# Intro
這週的 System design 只是其中很小的一部分,但老師希望我們可以透過這次的內容瞭解到 System design 是要符合很多 constrain 跟 最佳化的問題。
>老師:車廠從開始設計到開始製造可能會花 1 到 2 年的時間
第 3 頁右邊的圖是個垂直來看 Layered design 的圖,其中的每個 layer 都可以是一個 system design 的問題;這堂課要著重的是如何把 software 那層 map 到下面 Hardware 那層,當中的 System design 問題。
:::info
從那張圖可以發現,首先透過抽象化技巧把想做的事情拆成很多層,然後就可以著手對各層做 System design
:::
## 早期的問題
System Design 會決定哪些 task 要分配到哪些 ECU,以及哪些 signal 要由哪些 message 來傳輸,同時決定了那些硬體器材的規格要開到多少。
因為那些硬體器材通常是由其他家廠商做的,但是他們製作總需要時間,所以 System Design 算是很早期就要先弄好的一件工程,才可以告訴製造廠我們需要的規格。
## Model-Based Design
有三件事情:`Model`、`Design`、`Analysis`
Model-Based Design 是在自己定義的 `Model` 上面「做 `Design` 跟 `Analysis`」。
但是這三件事情沒有所謂的先後順序,而是互相影響彼此,例如:
- 通常在 `Design` 的時候同時也會受 `Analysis` 的結果影響,就像上週提到 TDMA-Based protocol 在 Asynchronous 情況下要越平均越好
- `Model` 的好壞也會影響 `Design` 的難易度
其實還有第四件事情:`Implement`,就是把我們的 `Model` 跟 `Design` 真的 `Implement` 出來。
---
# Mixed Integer Linear Programming / MILP
:::warning
非常基本的用數學解最佳化問題的方法,老師說雖然跟車子毫無關聯,但是這可以讓我們在各方面很受用。
>感謝老師,讚嘆老師
:::
## Linear Programming
在講 MILP 之前,一定要先提到 LP。
他就是國中(還是高中?)有提到的線性規劃問題,但是那時候都只有提到 2 維的。
總之以 2 維來說,問題就大概長得像:
$$
\begin{align}
\text{Maximize:}&2x-y\\
\text{Subject to:}& x-y\le1\\
2y\le3\\
x,y\ge0\\
x,y\in \mathbb{R}
\end{align}
$$
通常 Subject 的內容可以圍成一個多邊形,然後你要做的就是把想要 Maximize(或 Minimize) 的斜直線到處平移找到最大(最小值)。
如果是多維的話就會變成超平面到處平移找到超維體的某個地方,得到極值。
而解 LP 問題時,現在會使用的方法就是先轉成 Canonical form:
$$
\begin{align}
\text{min:}&\mathbf{c}^{T}\mathbf{x}\\
\text{subject to:}&\mathbf{Ax}\le\mathbf{b}, \mathbf{x}\ge 0, x\in \mathbb{R}\\
\end{align}
$$
然後再搭配一些演算法,例如 Simplex algorithm 來解。
>不同的軟體用的演算法,以及 Canonical form 可能都會不同,請參閱公開說明書
## Integer (Linear) Programming ILP
$$
\begin{align}
\text{Maximize:}&2x-y\\
\text{Subject to:}& x-y\le1\\
2y\le3\\
x,y\ge0\\
x,y\in \mathbb{Z}
\end{align}
$$
簡單來說就是 LP 問題,但是每個維度的值只能是整數。
很可惜的是這是個 NP-Complete 問題,目前尚未有線性時間的演算法可以找到最佳解,大多都是找到某個解但不一定是最佳解。
>如果你找到的話,你就可以證明 P=NP 了 :)
## Mixed Integer Linear Programming ILP
$$
\begin{align}
\text{Maximize:}&2x-y\\
\text{Subject to:}& x-y\le1\\
2y\le3\\
x,y\ge0\\
x\in \mathbb{R}\\
y\in \mathbb{Z}\\
\end{align}
$$
Mixed 的意思就是混合了整數跟實數,如上面的例子,就是 x 軸是實數,但是 y 軸只能是整數;MILP 雖然一樣是 NP-Complete,但是因為有些軸是實數,所以有一些較好的算法可以求得不錯的解。
:::info
總之 LP、ILP、MILP 只要照著使用說明書轉成該軟體所要的 Canonical Form,就可以得到你想要的解(近似解)了。
>但是不確定會跑多久,通常面對大型問題會很慢
>例如我的「機器學習安全特論筆記」有提到的 Certified Robustness 就有用到 MILP 做驗證,但是很慢:)
:::
## Quadratic Programming / QP
既然講到了 LP,那當然就要提一下 QP。
Canonical form 如下
$$
\begin{align}
\text{min:}&\frac{1}{2}\mathbf{x}^{T}\mathbf{Q}\mathbf{x}+\mathbf{c}^{T}\mathbf{x}\\
\text{subject to:}&\mathbf{Ax}\le\mathbf{b}, \mathbf{x}\ge 0, x\in \mathbb{R}\\
\end{align}
$$
一樣是詳閱公開說明書,就有熱騰騰的現成工具可以用。
>可以順便參考我的「林軒田老師 機器學習技法筆記」當中支持向量機的部分
## Convex optimization
這是 QP 的更 general 的形式。
$$
\begin{align}
\text{max:}&f(\mathbf{x})\\
\text{subject to:}&g_{i}(\mathbf{x}),\ \forall i\\
\end{align}
$$
其中 $f$ 跟 $g_{i}$ 是 convex 的。
:::warning
By wiki:
[**凸函數**](https://zh.wikipedia.org/zh-tw/%E5%87%B8%E5%87%BD%E6%95%B0)(英文:Convex function)是指[函數圖形](https://zh.wikipedia.org/wiki/%E5%87%BD%E6%95%B0%E5%9B%BE%E5%BD%A2 "函數圖形")上,任意兩點連成的線段,皆位於圖形的上方的[實值函數](https://zh.wikipedia.org/wiki/%E5%AE%9E%E5%87%BD%E6%95%B0 "實函數")
:::
---
# Simulated Annealing 模擬退火
有時候在找最小值的時候,找到的其實是 local optimal,不是 global optimal,這時候就要犧牲一點往高的地方走,擺脫 local optimal 後再次開始搜尋。
>老師的人生哲學:這期時就跟人生很像,有時候遭遇到了困難讓情況變得更糟令你很挫折,
>但是這或許就是一個讓你改變的機會,擺脫 local optimal,達到 global optimal
## 背景概念
跟鐵匠在鍛造的時候很像,「溫度高的時候」比較可以做「較大的改動」,「溫度低的時候」比較會去做「較小的改動」。
## 數學式子
溫度在這裡也可以叫做「時間」。從腳下的點 $S$,想要走到令一個點 $S^{\prime}$,會根據「兩點的高度差距」以及「總共經過的搜尋時間」決定一個機率,以該機率判斷要不要跳過去。
$$
\begin{align}
&Prob[S\rightarrow S^{\prime}]=\min(1,e^{\frac{-\triangle C}{T}})\\
&\triangle C= \text{cost}(S^{\prime})-\text{cost}(S)
\end{align}
$$
min 其實可以看作是:
- 如果 $\triangle C \le 0$
- 也就是 $S^{\prime}$ 的 cost 更低,那麼就一定給他走過去
- 如果 $\triangle C > 0$
- 此時雖然 cost 變高,但是有一定的機率會走過去
## Algorithm
- 得到初始 $S$
- 得到初始溫度 $T>0$
- $S^{*}$ 是解,先令 $S^{*}=S$
```
while 還沒冷卻
在 S 附近隨機挑出一個鄰居 S'
算出 Cost
如果 Cost 比較低就直接跳到 S',並令 S*=S
否則算出機率,再用機率決定要不要跳過去,決定要不要令 S*=S
T = rT, 其中 0 < r < 1
回傳 S*
```
## 注意事項
- 解空間
- 如何找鄰居
- 例如通常會在當前的 $S$ 附近開始搜索
- 如何評估 Cost
- 老師有強調 Invisible Solution 的重要性
- 所謂不可見解,就是搜索過程中沒有拜訪到的點
- 雖然沒有拜訪到,但是他們會對你如何訪問下一個點產生影響
- 如何降低溫度
:::warning
雖然 Simulated Annealing 不一定是最佳解,但是通常相比 MILP 會比較快
:::
:::info
詳細的部分我會補充在「人工智慧導論」的筆記
:::
---
# CAN Mapping Problem
學完上面的技巧,搭配之前的 Timing Analysis,現在終於可以來最佳化 Mapping Problem 了。
以下會針對四個項目各自做最佳化:
- Task Allocation
- 哪些 Task 要給哪些 ECU
- Signal Packing
- 哪些 Signal 要給哪些 message
- Task Priority Assignment
- Message Priority Assignment
## Task Allocation
- Indices 跟 Variable
- task 的 index 有 $i$ 跟 $j$
- ECU 的 index 有 $k$
- $a_{i,k}$:[0,1],代表 task $i$ 有無放在 ECU $k$ 上面
- $s_{i,j}$:[0,1],代表 task $i$ 跟 task $j$ 有無放在同個 ECU 上面
- Contraints
- $\forall i\ \sum_{k}a_{i,k}=1$ 也就是 1 個 task 就只有 1 個
- $\forall i, j, k,\ a_{i,k}+a_{j,k}+s_{i,j}\ne 2$
- 此時要注意 $s_{i,j}$ 只是代表有沒有放在同個 ECU 上面
- 如果兩個 $a$ 都是 1,那麼 $s$ 一定是 1,加起來就是 3
- 如果兩個 $a$ 一個 1 一個 0,那麼 $s$ 一定是 0,加起來就是 1
- 如果兩個 $a$ 都是 0,那麼 $s$ 可能是 0 或 1
- 總之絕對不等於 2
:::info
$s_{i,j}$ 在後面才會用到。
這裡我們並沒有對 ECU 可以放多少 task 有限制,但是之後的 Timing Analysis 就會對他做出制裁。
:::
## Task Priority Assignment
- Indices 跟 Variable
- task 的 index 有 $i$、$j$ 跟 $j'$
- $p_{i,j}$:[0,1],代表 task $i$ 比 task $j$ 有無更高的 priority。
- Contraints
- $\forall i,j, i\ne j\ \ \ p_{i,j} + p_{j,i}=1$
- 1 個 task 一定有更高的 priority
- $\forall i,j,j', i\ne j,i\ne j',j\ne j'\ \ \ p_{i,j} + p_{j,j'}-1\le p_{i,j'}$
- 如果大小關係是 $i>j>j'$,那麼上面就會是 $1+1-1\le 1$
- 如果是其他的大小關係,左手邊要嘛是 0 或 -1,右手邊要嘛是 0 或 1
:::warning
那為何 indices 不是設置像 $p_i:[1,...,n],\text{for i in 1 to n}$?
因為這樣的話, constraints 會變成需要 $p_i\ne p_j$,但是這樣的 constraints 會需要做轉換。
也就是 $p_i>p_j$ 或 $p_j>p_i$
但如果想要把這兩條 `OR` 轉成 MILP 需要的 `AND`,還是會需要用到上面提到的 $p_{i,j}$:
$$
p_{i,j} + p_{j,i}=1\text{ and }(p_i-p_j)<(1-p_{i,j})M\text{ and }(p_j-p_i)<p_{i,j}M
$$
其中 $M$ 是一個很大的 constant。
那這樣還不如直接用上面的方法;而且 $M$ 可能會導致 MILP 運算變很慢
:::
## Signal Packing
>老師說是這章節最困難的一張投影片
- Indices 跟 Variable
- $i$ 跟 $j$ 是 task 的 index;$k$ 是 ECU 的 index;$l$ 是 message 的 index;
- $T_{i,j}$ 是 task $i$ 到 task $j$ 的 signal 的 period
- $T_{k,l}$ 是 ECU $k$ 的 message $l$ period
- $a_{i,k}$:[0,1],代表 task $i$ 有無放在 ECU $k$ 上面
- $t_{i,j,k,l}$:[0,1],代表 task $i$ 往 task $j$ 的 signal 有無放在 ECU $k$ 的 message $l$ 上面
- $v_{k,l}$:[0,1],代表 ECU $k$ 的 message $l$ 有無被使用
- Contraints
- $\forall i,j,k\ \sum_{l}t_{i,j,k,l}=a_{i,k}(1-a_{j,k})$
- 如果 task $i$ 跟 $j$ 都放在 ECU $k$ 上面,那他們之間不用有 signal,所以加起來是 0
- 如果沒有放在同個 ECU 之間,但是 signal 有方向性,$t_{i,j,k,l}$ 是 $i$ 往 $j$ ,因此只有當 $i$ 有放在 $k$ 上面的時候,加起來才會是 1,否則就是 0
- $\forall i,j,k,l\ \ \ t_{i,j,k,l}\le v_{k,l}$
- 也就是 ECU $k$ 的 message $l$ 要嘛有用要嘛沒有用
- $\forall i,j,k,l\ \ \ t_{i,j,k,l}\times T_{k,l} \le T_{i,j};t_{i,j,k,l}\times T_{i,j} \le T_{k,l}$
- 這其實是把 $t_{i,j,k,l}\times T_{k,l} = T_{i,j}$ 拆開來
- 也就是如果要把 $i$ 傳到 $j$,想透過 $k$ 的 $l$,那麼兩者的 period 一定要一樣
:::info
可以回顧到上面 task allocation 並沒有限制一個 ECU 上可以放多少 task
:::
:::warning
為什麼需要 Packing?
因為大多汽車內的訊號都是 1 個或 2 個 bit,如果每次傳輸都只傳少少的資料,CAN 原本的 data efficiency 已經夠差了,這樣會更差,因此把多個要傳的訊號打包在一起一次傳出去,會更有效率。
當然接收者要知道自己想要的資料是位於 data field 的哪個區段。
:::
## Message Priority Assignment
跟 Task Priority Assignment 是一樣的,頂多名稱換一下。
## Timing Constraints
有了上面四大種 variables,以及一些附帶的 constrains 之外,還需要一些跟時間有關的 constraints
- Task
- 就是 ECU 內部 preemptive 形式算出的 Response Time
- $R_i=C_i+\sum_{p_i<p_j}\left\lceil\frac{R_i}{T_i}\right\rceil C_j$
- Period $T$ 都是已知
- Message and Signal
- 就是上週算 CAN 的 non preemptive 形式算出的 Response Time
- $Q_i=B_i+\sum_{p_i<p_j}\left\lceil\frac{Q_i+\tau}{T_i}\right\rceil C_j \text{ and } R_{i}=Q_i+C_i$
- Period $T$ 都是已知
- Signal 的 Response Time 就是看他包在哪個 Message 裡面,那個 Message 的 Response Time 就是 Signal 的 Response Time
- Path
- 有了上面兩種的 Response Time,就可以來決定一條路徑上的 Worst Case Response Time
- 例如從 task $\tau_1$ 經過 message $\sigma_1$ 傳到 task $\tau_4$,把中間經過的 worst case response time 加起來
- 然後會有一個給定的 deadline ,上面算出的時間要小於等於這個 deadline
## $s_{i,j}$ 跟 $v_{k,l}$
這兩個在 MILP 的式子裡面會發揮用處,例如 $s_{i,j}$ 決定兩個 task 有沒有在同個 ECU 上,如果沒有的話,在計算 response 的時候其實 $\Sigma$ 裡面有一人不會出現,此時只要在旁邊乘上 $s_{i,j}$ 就可以達到這種效果。
$v_{k,l}$ 也會有類似的作用。
---
# Solved by MILP:Linearization
其實這個概念應該要在制定 variable 跟 constraints 的時候先提及,因為不是所有式子都可以轉成線性的式子;也就是在制定的時候就要同時去想能不能轉成線性的式子。
## Equivelence
下面在轉成線性式子的時候,除了用到 binary 的特性,還會用到 if and only if 的推導,得到 「等價 Equivelence」的式子,例如:
$$
\begin{align}
a+b=0&\Leftrightarrow a=0 \text{ and } b = 0\\
&\Leftrightarrow ab=0\\
a+b>0&\Leftrightarrow a\ne 0\text{ and } b \ne 0\\
\end{align}
$$
## Inequality of three binary
$$
a+b+c\ne 2
$$
可以轉換成:
$$
a+b-c\le 1\text{ and }a-b+c\le 1\text{ and }-a+b+c\le 1
$$
## Ceiling Function
先令:
$$
\text{ceil}(f)=x
$$
然後就可以轉換成:
$$
0\le x-f \le 1
$$
## Multiplication of two binary variables
先令
$$
a\times b =c
$$
然後就可以寫成:
$$
a+b-1\le c \text{ and } c \le a \text{ and } c \le b
$$
## Multiplication of a binary variable $a$ and a real variable $x$
一樣先令
$$
a\times x = y,\ \ y \in \mathbb{R}
$$
接著就可以寫成:
$$
0\le y \le x \text{ and } x - M(1-a) \le y \le Ma
$$
$M$ 是一個很大的常數。
## Scalability Issue
但是實務上問題的規模往往大到 MILP 無法在合理的時間內算出來,所以通常實際上會採用以下的方式來求得某個解:
- 先設定好 signal packing 跟 message priority (和 group assignment)為某個經驗值,
- 求得這樣設定下的 task allocation 跟 task priority 的解
- 接著換成固定剛剛求得的 task allocation 跟 task priority,(group assignment 一樣為假設值)
- 求得 signal packing 跟 message priority 的解
- (最終將 signal packing、message priority、task allocation、task priority 固定成剛剛的解)
- 求得 group assignment
:::warning
但是要注意這樣的做法不一定能得到最佳解,甚至有時候會減少解空間的,使得我們找不到最佳解;但是這樣做我們可以得到合理的時間加速。
group assignment 是沒有提到的部分。
:::
---
# Solved By Simulated Annealing
一樣是考慮那四個 Ingredient
- Solution space
- 也就是上面的四大 variable 的內容
- task 要放哪裡? signal 要放哪裡? 每個 task 的 priority? 每個 message 的 priority?
- Neighborhood structure
- 要怎麼挑出一個解?首先可以看四大 variable 的內容,你想著重哪一項
- 先挑出一項後,再做判斷:
- 如果是 task 要放哪裡,例如把某個 task 從 原本的 ECU 移動到另一個 ECU
- 如果是 signal 要放哪個 message 裡面,也是一樣換位置看看
- 如果是 priority 的話,可以試試看交換兩個 task(message) 的 priority
- Cost Function
- 可以利用剛剛的 path 長度作為 cost
- Annealing schedule
- 溫度要怎麼設,同樣溫度下要跑多少 iteration 也是設計者可以自行根據經驗發揮的地方
---
# 很多 task 放同個 ECU 是好事嗎
雖然同個 ECU 放太多 task 可能會導致 worst case repsonse time 變很大,但是其實同時對於 signal 會有一些好處:
- 如果兩個 signal 在同個 ECU 內,那就不用傳了
- 如果兩個 signal 的 destination 一樣,那麼就可以塞進同個 message 裡面
- 這樣還可以省下 header
---
# TDMA-Based Mapping Problem
既然我們有提到 TDMA-Based 的 Timing Analysis,那麼我們也可以依樣畫葫蘆的,照上面的流程來解 TDMA-Based Mapping Problem。
- 不過由於 TDMA-Based 通常傳輸比較快,所以通常為了避免太複雜,不會做 Signal Packing,也就是一個 signal 就會對應到一個 message。
- 而且由於哪段時間要給誰用的 pattern 都是給定的,所以 message 不再需要有 priority。
- 雖然少了 Signal Packing 跟 message priority,但是要新增處理的就是 scheduling,也就是 time slot 跟 message 的 pattern 要如何設置
## Scheduling
通常來說因為 variables 很有可能也會非常多,所以除了用上面提到的變種版的 MILP 去解,也有可能用 SA 來解。
而用 SA 來解的時候,就可以用上週提到 Synchronous 跟 Asynchronous 的特性來做 Neighborhood 的挑選。
但同時也要注意,如果是有多個 Message 的話,那可能就要小心衝突的問題。
:::danger
不確定由同個 switch 發出的 signal 是不是算同個 message;如果是的話,多個 message 是代表多個 switch 嗎?
:::