定義問題以及用QUBO表示約束
D-Wave擅長解決的問題之一就是二值優化(optimization of binary variables)問題。二值變量只有變量 0(NO, or FALSE)和變量 1(YES, or TRUE)。
傳統計算機可以被認爲是由邏輯門(logic gates)組成的,邏輯門是一種簡單的決策裝置,其根據輸入產生輸出。雖然 D-Wave 系統並不是基於門的,但巧合的是一個特殊的門(異或門)形成了系統要解決的第一個優化問題。
異或門內容如下:
假設由兩個二值的輸入 。若,則輸出爲 , 若,則輸出爲 , 其他情況下輸出爲0.
定義目標函數
對於一個有兩個qubit的問題,我們希望在退火之後的 qubits 得到一樣的值。qubit 的狀態有4種情況,如下表所示:
0 | 0 |
0 | 1 |
1 | 0 |
1 | 1 |
我們需要定義一個目標函數,使其最終實現狀態(0,0)和(1,1)。在目標函數中,qubit 是變量。bias(qubit 偏置) 和 strengths(couplers 的強度)是線性項和二次項上的係數。兩個 qubit 問題的目標函數有三個項。目標函數的形式如下:
其中 是變量 的向量,和$ a_2$ 是 qubit biases, 是 coupler 的權重(strengths)。
設置滿足最初目標的 。首先可以看到,當 和 都等於0(記爲(0,0))時,目標函數的值爲0,也沒有其他可調參數。這就是我們希望得到的狀態,對應於基態的最小能量應該爲0。同時不希望有狀態(0,1)和(1,0)。一種辦法就是給 兩個 biases 都設置爲 0.1:
Objective Value | ||
---|---|---|
0 | 0 | 0 |
0 | 1 | 0.1 |
1 | 0 | 0.1 |
1 | 1 | 0.2 + |
又因爲狀態(1,1)也是我們希望得到的狀態,一種方式就是給coupler權重設置 .最終的目標函數是:
上述表格的輸出就變成如下所示:
Objective Value | ||
---|---|---|
0 | 0 | 0 |
0 | 1 | 0.1 |
1 | 0 | 0.1 |
1 | 1 | 0 |
當我們對這個問題在D-Wave系統上運行了很多次退火之後(也稱爲 採樣(samples) or 讀取(reads)),我們希望得到基態(0,0)和(1,1),而不是激發態(0,1)和(1,0)。
把這個問題在D-Wave2000Q系統上運行1000次之後,可以獲得1000個採樣結果。
Energy | State | Occurrences |
---|---|---|
0 | (0,0) | 555 |
0 | (1,1) | 443 |
0.1 | (0,1) | 1 |
0,1 | (1,0) | 1 |
如果再次運行這個問題,我們期望得到的 energy 0 可能會有不同,但是一定是在500的附近(樣本的50%左右)。
需要注意的是,結果中大多數情況是(0,0)和(1,1),調用足夠多次QPU時,會看到偶爾的(0,1)和(1,0)這樣的解。對於更復雜的 QUBOs ,這種反覆求解同一個問題以獲得一系列答案的過程稱爲採樣(sampling)。
問題縮放(Problem Scaling)
考慮另外一個 2-qubit 問題,這次給 qubit biases 和 coupler strength 分別賦值0.5和1,目標函數如下:
同上,可以得到如下結果:
Objective Value | ||
---|---|---|
0 | 0 | 0.5 |
0 | 1 | 0.5 |
1 | 0 | 0.5 |
1 | 1 | 0 |
因爲這個問題的激發態和前面那個問題中的值不同,導致基態和激發態之間的能量差更大(0.5 和 0.1),所以這次可能會看到不同的結果。話句話說,當基態和激發態之間存在較大的間隙(能量差)時,從基態更不容易達到激發態。
前面在第一個問題中,我們在返回的結果中可以看到了一小部分激發態。如果我們多次運行這兩個問題,通常會觀察到相同的結果,但實際是第二個問題(明顯)存在較大差距,這與我們的預期的50%差別有點大。
這一結果是由D-Wave系統的一個稱爲**自動縮放(auto-scaling)**的功能引起的。每個QPU的偏差 和強度 都有一個允許的範圍值。除非我們明確禁用自動縮放,否則D-Wave軟件會調整問題的 和 的值,使得把問題發送到QPU之前採用整個可用的(a,b)範圍。因此,在運行這兩個問題時,它們向QPU呈現相同的(a,b)值,因此返回的解決方案實際上是相同的。當在運行結束返回能量值和目標值時,我們使用的是預縮放(pre-scaling)值。
下面來測試一下這個功能。首先運行第一個問題1000次(激發態的值是 0.1),禁用 auto-scaling。這次看到的結果如下所示:
Energy | State | Occurrences |
---|---|---|
0 | (0,0) | 272 |
0 | (1,1) | 526 |
0.1 | (0,1) | 124 |
0.1 | (1,0) | 68 |
然後運行第二個問題1000次(激發態的值是 0.5),禁用 auto-scaling。這次看到的結果如下所示:
Energy | State | Occurrences |
---|---|---|
0 | (0,0) | 436 |
0 | (1,1) | 563 |
0.5 | (0,1) | 1 |
0.5 | (1,0) | 0 |
這些結果表明,在沒有自動縮放(auto-scaling)的情況下,第一個問題比第二個問題具有更小的間隙(基態和激發態的能量差),並且返回更多的激發態樣本。間隙越小,從基態變到激發態越容易(激發態的次數越多)。
用 QUBO 來表示約束
先用 QUBOs 定義一個簡單的約束(constraints),可以拓展到更大更復雜的問題中。
exactly-one-true 約束是一個布爾(Boolean)可滿足性(satisfiability)問題,給定一組變量,我們想知道何時恰好有一個變量爲1(真)。
例如,當優化一個旅行銷售人員通過一系列城市的路線時(TSP),需要一個約束條件,必須強制銷售人員在旅行的每個階段只能在一個地方(exactly one city),同時在多個地方是無效的。
下面就來說明一下如何以D-Wave可以解決的方式來構建一個簡單的 exactly-one-true。步驟如下:
- 從目標函數開始:在這個例子中,就是從有三個變量的 exactly-one-true 約束開始,然後建立一個滿足這個目標的真值表。
- 建立一個能夠得到所期望的狀態且抑制其他狀態的 QUBO。
- 把 QUBO 轉換到一個graph中。
對目標函數建真值表
考慮一個簡單的例子:給定三個變量 ,我們想知道什麼時候恰好只有一個變量是1。(也就是說, 中只有一個變量是1,而其他兩個變量是0),真值表表示如下:
Exactly 1 | |||
---|---|---|---|
0 | 0 | 0 | FALSE |
1 | 0 | 0 | TRUE |
0 | 1 | 0 | TRUE |
1 | 1 | 0 | FALSE |
0 | 0 | 1 | TRUE |
1 | 0 | 1 | FALSE |
0 | 1 | 1 | FALSE |
1 | 1 | 1 | FALSE |
建立一個只有一個爲真的 QUBO
我們希望找到一個函數 ,當這個目標爲真時,使得函數是最小的,可以用下式表示:
或
上述第二個式子表示的含義是,當 都爲0時,結果時 -1, 這是一個比 TRUE 狀態更低的能量狀態。避免這個情況出現的方式是,給這個方程加平方:
於是就有平方表達式:
因爲這些變量都是二值的(0 和 1),有 於。是我們的目標函數就變成了
其中函數 的能量(energy)就是目標函數的值。
加入 energy 這一列之後再看一下真值表。需要注意的是,最低能態和 exactly-one-true 約束是匹配的。解越好,能量越低。
Exactly 1 | Energy | |||
---|---|---|---|---|
0 | 0 | 0 | FALSE | 1 |
1 | 0 | 0 | TRUE | 0 |
0 | 1 | 0 | TRUE | 0 |
1 | 1 | 0 | FALSE | 1 |
0 | 0 | 1 | TRUE | 0 |
1 | 0 | 1 | FALSE | 1 |
0 | 1 | 1 | FALSE | 1 |
1 | 1 | 1 | FALSE | 4 |
表達爲 QUBO 的形式則爲:
把 QUBO 轉換到 Graph 中
QUBO 能量函數能用三角圖表示如圖6.2。每個二值變量都是一個帶有線性係數的 bias 節點。每個二次項都變成節點之間的一條 edge。