Nobisuke
Dekisugi
RAG
Privacy policy
2021/02/01 00:55
量子ゲートでのQAOAや量子アニーリングなどをやっていると「コスト関数」と「制約条件」と呼ばれる項がでてきます。そのうちの制約条件はよく使われますが、その作り方とルールを確認したいと思います。
どういうことかというと、{0,1}のバイナリで表現されるN量子ビットがあり、その中からK量子ビットだけを+1、その他を0となるようにイジングモデルをプログラミングしたいとします。実際にはイジングは意識せず、QUBOとよばれるバイナリ値のコスト関数だけを意識してつくることができます。
コスト関数と呼ばれる関数を基本とします。N量子ビットからK量子ビット選ぶコスト関数は、バイナリをとるを用いて、下記のようにかけます。
QUBOmatrixというものを作れば、それを入力することで問題が解けます。ここで例題を5量子ビットから2量子ビット選ぶという問題でやってみましょう。
・5量子ビットから2量子ビット選ぶ
上記は全てを展開して、バイナリのルールを適用しています。QUBOmatrixに直して、
こうなりましたので、これをSDKに代入します。
Copy from blueqat.wq import Opt Opt().add([[-3,2,2,2,2],[0,-3,2,2,2],[0,0,-3,2,2],[0,0,0,-3,2],[0,0,0,0,-3]]).run()
[0, 0, 1, 1, 0]
これで入力と実行は終わりで、出力は、
[0, 1, 1, 0, 0]
確かにバイナリ値で5量子ビットの中の2量子ビットだけ選ばれています。
上記行列には明らかにルールがあります。他の例で3量子ビットから1量子ビット選ぶには、
QUBOmatrixは、
対角項が1-2Kで、非対角項が2になります。
Copy Opt().add([[-1,2,2],[0,-1,2],[0,0,-1]]).run() #[0, 0, 1]
[0, 1, 0]
つまり一般化して実行してみると、
Copy import numpy as np N = 5 K = 2 Opt().add(np.diag([1-2*K]*N)+np.triu([[2] * N for i in range(N)],k=1)).run() #[0, 1, 0, 1, 0]
[0, 0, 1, 0, 1]
量子ゲートモデルのQAOAというアルゴリズムは量子アニーリングに近いことを実行していますので、同様のものを計算できます。このままできます。
Copy result = Opt().add(np.diag([1-2*K]*N)+np.triu([[2] * N for i in range(N)],k=1)).qaoa() print(result.most_common(5)) #(((0, 1, 0, 1, 0), 0.07565315862509445), ((1, 1, 0, 0, 0), 0.07565315862509443), ((1, 0, 1, 0, 0), 0.07565315862509443), ((1, 0, 0, 1, 0), 0.07565315862509443), ((0, 0, 1, 1, 0), 0.07565315862509443))
(((1, 0, 0, 1, 0), 0.06708667713096965), ((0, 1, 0, 1, 0), 0.0670866771309696), ((1, 0, 0, 0, 1), 0.0670866771309696), ((1, 0, 1, 0, 0), 0.06708667713096958), ((0, 1, 1, 0, 0), 0.06708667713096958))
出てきた答えの後ろの小数点の数字は回答の出る確率になっています。1が1つだけ選ばれている組み合わせが同一の確率で登場しているのがわかります。実機では状態ベクトルと呼ばれる確率を確認する機能が計算できますが、実機ではそれが計算できませんのでなんども計算をして確率分布を自分で求める必要があります。ここでは、状態ベクトルから出現確率を計算しています。
© 2024, blueqat Inc. All rights reserved