@yuichirominato 2018.09.07更新

Wildqatでquboとイジングを解いてみる

QUBO wildqat イジング 量子アニーリング

はじめに

最近再度イジングマシンの需要が上がって来ていて、よく企業様から要望をいただきます。
公式ドキュメントも整備を進めていますが、国産のシミュレータとSDKでアプリケーションの作り方や問題の解き方を見直してみます。

Wildqatとは?

Wildqatは誰でも簡単にpythonベースで最近の量子アニーリング型の量子コンピュータのアプリケーションを作れる開発キットSDKです。

カナダのD-Wave社や
https://www.dwavesys.com/press-releases/mdr-corporation-and-d-wave-systems-announce-quantum-computing-agreement

Microsoft Innovation Award 2018
https://www.microsoft.com/ja-jp/startups/mia#mia18-finalist
様々なところから注目いただいております。

入手方法

こちらは簡単です。githubもしくはpypiにおいてありますので、そちらから入手できます。

https://github.com/mdrft/Wildqat


$ pip3 install wildqat

もしくは


$ git clone https://github.com/mdrft/Wildqat.git
$ python setup.py install

で、手に入ります。

使用の仕方

このあと簡単なチュートリアルで順を追って説明しますが、
基本的にはQUBOと呼ばれる行列を作って、それをマシンにかけます。
Wildqatでは、これらをとても簡単に使用することができます。


import wildqat as wq
a = wq.opt()
a.qubo = [[4,-4,-4],[0,4,-4],[0,0,4]]
a.sa() #=> array([1, 1, 1])

少し順を追って見てみます。インストールが完了したら、


import wildqat as wq

で、モジュールを読み込みます。次に簡単な準備で、


a = wq.anneal()

こちらを実行します。
そして、問題を用意します。問題の作り方は後ほど触れますが、QUBOもしくはイジングという形で作ります。
これは上三角行列の形をしています。


a.qubo = [[4,-4,-4],[0,4,-4],[0,0,4]]

最終の計算にはイジングを使いますが、QUBOで用意した行列をイジングへ変換します。そして、最後にこれを使って計算をします。


a.sa() #=> array([1, 1, 1])

実行すると答えが出ます。saはシミュレーテッドアニーリングの略で、温度を使ったアルゴリズムです。量子アニーリングを使うと少し重たいですが、 下記のように計算ができます。


a.sqa() #=> [array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1]),array([1, 1, 1])]

量子アニーリングは複数のトロッタと呼ばれる並列を使っています。シミュレーションではそれらを複数呼び出すことができます。

例題:自然数分割問題

自然数分割問題を解いてみます。

(例題)$n_i=[1,1,1,1]$を2つのグループに分割する。

$
\begin{array}
-&x_0&x_1&x_2&x_3\\
x_0& 0 & 2 & 2 & 2\\
x_1& & 0 & 2 & 2 \\
x_2& & & 0 & 2\\
x_3& & & & 0
\end{array}
$

このイジング行列をそのまま実装します。


import wildqat as wq
a = wq.opt() #一部変更になりました。。18.09.07updated ver0.3.2
a.J = [[0,2,2,2],[2,0,2,2],[2,2,0,2],[2,2,2,0]]
a.sa() #=> array([-1,  1,  1, -1])

結果は、問題の答え通り、1が2つ、-1が2つでました。
答えは正解です。

足し算もやってみます。

ハミルトニアンは、

$
H = -3q_0+4q_0q_1-4q_1+4
$

QUBOmatrixは、

$
\begin{array}
-&q_0&q_1\\
q_0 & -3 & 4\\
q_1 & & -4\\
\end{array}
$

早速やってみると、こちらはQUBOからできていますので、変換を噛ませます。


import wildqat as wq
a = wq.opt()
a.qubo = [[-3,4],[0,-4]]
a.sa() #=> array([-1,  1])

参考にsqaでもやってみます。


a.sqa() #=> [array([-1,  1]),array([-1,  1]),array([-1,  1]),array([-1,  1]),array([-1,  1]),array([-1,  1]),array([-1,  1]),array([-1,  1])]

こちらも無事すべて同じ値となりました。

答えは、

$
0+2*1 = 2
$

なので、

$
1 + 1 = 2
$

あわせて読みたい