@yuichirominato 2019.01.20更新 245views

【イジング】数式入力による量子アニーリングとゲート組み合わせ計算

latex sympy イジング 量子アニーリング 量子ゲート

はじめに

量子コンピュータを行なっていると組合せ最適化問題がよく出てきます。実際に量子コンピュータを使って組合せ最適化問題が早くなるのかがよくわかっていませんが、それを探索するために日々たくさんの研究開発が進んでいます。

ここでは数式を使ってこうした組合せ最適化問題を解く方法を以前よりもより簡単にできるように作ってみました。

手順のおさらい

組合せ最適化問題を解くには、

1、QUBOと呼ばれるバイナリ値を使ったネットワーク問題に問題を落とし込む。
2、QUBOの係数をmatrixの形に直してマシンに渡す
3、あとはマシンが解いてくれるです。

色々な問題を解いてきましたが、より普及を目指すために簡単に数式から解けるようにしました。まだいくらか改善余地がありますが、2次式の方程式でしたら解くことできます。早速やってみます。

実装方法

実装方法には二種類あります。量子アニーリング系列で解くのと量子ゲート系列で解きます。両方やってみます。

from blueqat import opt

#アニーリングでやりたい場合には、
a = opt.opt()
a.qubo = opt.optm("(q0+q1)^2",2)
a.sa()

#ゲートでやりたい場合には、
from blueqat import vqe

qubo = opt.pauli(a.qubo) 
step = 4 
result = vqe.Vqe(vqe.QaoaAnsatz(qubo,step)).run() 
print(result.most_common(10))

基本的には同じなので、同じようにできますが、利用できる量子ビット数に限界があります。それぞれ問題をさらにD-WaveとIBMQにも投げられますが、接続の考慮などやるべきところはまだまだありますので、慣れている人が使ってみてください。

例題

下記のような例題を考えます。

これは工夫してみます。QUBOで連立方程式を解く際には、連立方程式を、
A=c,B=dという式があった場合には、E=(A-c)^2+(B-d)^2とすることで式を解くことができます。まずこれをみてみます。上記のx1=q0,x2=q1,x3=q2として3量子ビット使います。

$$E=(3*q0+2*q1+q2-3)^2+(5*q0+2*q1+3*q2-5)^2$$

となります。早速これを解いてみましょう。導入するのはblueqatです。
こちらから入手できます。
https://github.com/mdrft/Blueqat

from blueqat import opt

a = opt.opt()
#latexのまま表現を入れて、第二引数に利用する量子ビット数を入れてください。
a.qubo = opt.optm("(3*q0+2*q1+q2-3)^2+(5*q0+2*q1+3*q2-5)^2",3)

#たくさん解を求めるために100回計算してます。
result = a.sa(shots=100,sampler="fast")
opt.counter(result)                                                                                                                             

Out[9]: Counter({'100': 45, '011': 55})

上記のように答えは100と011が出てきました。この2つが解のようです。問題は与えられた方程式で解が小さい方を求めるものなので、これにさらに条件式を追加してみます。加える条件式は、q0+2*q1+q2です。これを小さくする方を選びます。

from blueqat import opt

a = opt.opt()
#latexのまま表現を入れて、第二引数に利用する量子ビット数を入れてください。2項目を少し強くしました。
a.qubo = opt.optm("(3*q0+2*q1+q2-3)^2+(5*q0+2*q1+3*q2-5)^2 - 2*(q0+2*q1+q2)",3) 

#たくさん解を求めるために10回計算してます。精度を出したいのでsamplerの設定は落とさずやりました。
result = a.sa(shots=10)
opt.counter(result)                                                                                                                             

Out[18]: Counter({'011': 9, '100': 1})

解けました011が答えです。あってました。

#ゲートでやりたい場合には、
from blueqat import vqe

qubo = opt.pauli(a.qubo) 
step = 4 
result = vqe.Vqe(vqe.QaoaAnsatz(qubo,step)).run() 
print(result.most_common(10))

#=>(((0, 1, 1), 0.6704866696485028), ((1, 1, 0), 0.11442902810888132), ((1, 0, 0), 0.074740630862302), ((1, 0, 1), 0.06268477954204113), ((0, 0, 1), 0.044455349172431595), ((0, 1, 0), 0.024447840599808604), ((0, 0, 0), 0.008141149869739687), ((1, 1, 1), 0.0006145521962940024))

これも出ました。ゲートでもあってます。

クリーク問題

もいっちょ解いてみます。

クリーク問題は、グラフ理論において、グラフ中のクリーク(任意の二頂点間に枝があるような頂点集合)を見つける問題。下記はグラフ中にKのクリークが存在するかどうかをみつけるコスト関数です。1項目は頂点数をKに制約する条件。2項目のBで囲まれた部分は選んだ頂点が完全グラフを構成している場合にコストがもっとも小さくなるようなエッジの数の条件です。クリーク数がKのものが存在する場合、コスト関数E=0となります。

今回は6ノードの問題からクリーク数3を探します。

数値を代入して、

ここまでできてれば入れればいいだけですね。

from blueqat import opt

a = opt.opt()
#latexのまま表現を入れて、第二引数に利用する量子ビット数を入れてください。
a.qubo = opt.optm("(q0+q1+q2+q3+q4+q5-3)^2 + 0.7*(3-q0*q4-q0*q1-q1*q4-q1*q2-q2*q3-q3*q4-q3*q5)",6) 

#たくさん解を求めるために100回計算してます。精度を出したいのでsamplerの設定は落とさずやりました。
result = a.sa(shots=100,sampler="fast")
opt.counter(result)                                                                                                                             

Out[24]: Counter({'110010': 90, '001101': 1, '011110': 9})

きちんと110010が出てきました。上記ノードの0,1,4にクリーク数3が見つかりました。続いて、ゲートで。

#ゲートでやりたい場合には、
from blueqat import vqe

qubo = opt.pauli(a.qubo) 
step = 4 
result = vqe.Vqe(vqe.QaoaAnsatz(qubo,step)).run() 
print(result.most_common(10))

#=>(((1, 1, 0, 0, 1, 0), 0.11728523302275547), ((0, 0, 0, 1, 1, 1), 0.10264146416340207), ((0, 1, 0, 1, 1, 0), 0.06604237261339371), ((0, 0, 1, 1, 0, 1), 0.05284869089830696), ((1, 1, 0, 1, 1, 0), 0.05079462746260506), ((0, 0, 1, 1, 1, 1), 0.04574666384690351), ((0, 1, 1, 1, 0, 0), 0.044475553525798225), ((0, 1, 0, 0, 1, 0), 0.033712680053092935), ((0, 0, 0, 0, 1, 1), 0.026730394314588582), ((1, 1, 1, 0, 1, 0), 0.026167733539093747))

こちらもきちんと出ました。このように簡単にできます。

まとめ

ちょっとやってる時にバグ見つけちゃいました(修正予定)。が、基本的には便利なはずなので、数式が出てきたら数値代入してそのまま入れてみてください。色々な例題ができます。

式の途中に出てきたパラメータはハイパーパラメータといって調整すべきものです。いろいろ試してみて調整してください。

Recommended


CONTACT

info@mdrft.com

ブログトップへ Wikiへ移動

量子コンピュータ一般

量子ゲートアルゴリズム

量子アニーリング一般

量子アニーリングアルゴリズム

BlueqatSDKの使い方