common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

クレジットクーポンを利用してD-Waveに接続しプログラムを実行してみた

Tetsuro Tabata

2021/04/23 02:13

#D-Wave #アニーリング

クレジットクーポンを利用してD-Waveに接続しプログラムを実行してみた

§ 本記事の目的

本記事では、blueqat.comで購入できるクーポンを利用して、量子アニーリングマシンであるカナダのD-Waveに実際に接続し、簡単な問題をプログラミングして実機上で実行する手順をご紹介します。

※本記事は令和3年4月22日に執筆しています。
今後の仕様変更やバージョンアップより当記事内容が有効でなくなった場合はご了承ください。

§ 量子アニーリングマシン、カナダのD-Waveって何?

D-Waveは、量子コンピューターの実機として世界で最も早く商用化、発売された量子コンピューターです。
D-Waveは「ディーウェイブ」と読みます。カナダのベンチャー企業が世界で最初に開発しました。現在は日本のNECが資金提供を行っています。

量子コンピューターは主に「アニーリング方式」と「ゲート方式」の二種類ありますが、D-Waveは前者の「アニーリング方式」を採用しています。
「アニーリング方式」は、主に組合せ最適化問題を解くことに特化した方式です。また、機械学習分野への応用も研究されています。

組合せ最適化問題とは、最も効率の良い手段や選択肢を特定する問題解決の手段として近年注目され、例えば工場の在庫計画や販売計画、流通分野では配送ルートの選択、一般分野では勤務表の作成などに応用が期待されています。

§ 今回解く問題とQUBO配列

(1)今回解く問題

今回解く例題とプログラミングを行います。
今回はなるべく簡単な問題として以下を解きます。

[例題]
x0+x1=1x_0 + x_1 = 1を満たす整数x0x_0x1x_1を探す

この問題の解は以下の2通りであることが直感的にわかります。

x0=1,x1=0x_0=1, x_1=0
または
x0=0,x1=1x_0=0, x_1=1

D-Waveでこの問題を解くための立式を行います。

(2)ハミルトニアンの立式

量子アニーリングにより問題を解くには、ハミルトニアン(ハミルトン式)を立式する必要があります。
ハミルトニアンは機械学習分野で言うと損失関数またはコスト関数に当たるもので、その値が最も小さくなる条件を求めます。 この時の条件が解となります。

例題についてのハミルトニアンHは以下となります。

H={1(x0+x1)}2(1)H=\{1-(x_0+x_1)\}^2\quad(式1)

(式1)を試しに検証してみます。
x0,x1x_0,x_1それぞれに値を代入して比較してみましょう。

<ケース1>x0=0,x1=0x_0=0,x_1=0の場合

x0=0,x1=0x_0=0,x_1=0の場合、ハミルトニアンがどうなるかを算出します。

H={1(0+0)}2=1(2)\begin{align} H&=\{1-(0+0)\}^2\\ &=1\quad(式2) \end{align}

<ケース2>x0=1,x1=1x_0=1,x_1=1の場合

x0=1,x1=1x_0=1,x_1=1の場合、ハミルトニアンがどうなるかを算出します。

H={1(1+1)}2={12}2={1}2=1(3)\begin{align} H&=\{1-(1+1)\}^2\\ &=\{1-2\}^2\\ &=\{-1\}^2\\ &=1\quad(式3) \end{align}

<ケース3>x0=0,x1=1x_0=0,x_1=1の場合

x0=0,x1=1x_0=0,x_1=1の場合、ハミルトニアンがどうなるかを算出します。

H={1(0+1)}2={11}2={0}2=0(4)\begin{align} H&=\{1-(0+1)\}^2\\ &=\{1-1\}^2\\ &=\{0\}^2\\ &=0\quad(式4) \end{align}

<ケース4>x0=1,x1=0x_0=1,x_1=0の場合

x0=1,x1=0x_0=1,x_1=0の場合、ハミルトニアンがどうなるかを算出します。

H={1(1+0)}2={11}2={0}2=0(5)\begin{align} H&=\{1-(1+0)\}^2\\ &=\{1-1\}^2\\ &=\{0\}^2\\ &=0\quad(式5) \end{align}

(式2)~(式5)からハミルトニアンが最小値となるケースはケース3とケース4で、最初の直感通り解が以下であることがわかりました。

x0=1,x1=0x_0=1, x_1=0
または
x0=0,x1=1x_0=0, x_1=1

よって、立式(式1)は正しいことがわかります。

(3)ハミルトニアンからQUBO配列を求める

ハミルトニアンの立式ができたら、式を展開しQUBO配列を求めます。
QUBOとはQuadratic Unconstrained Binary Optimization(制約なし二次形式二値変数最適化)の略で、D-Waveで解を算出する場合はQUBO配列を求めることが必要です。

QUBOを求めるために(式1)を展開します。

H={1(x0+x1)}2=12(x0+x1)+(x0+x1)2=12x02x1+x02+2x0x1+x12\begin{align} H&=\{1-(x_0+x_1)\}^2\\ &=1-2(x_0+x_1)+(x_0+x_1)^2\\ &=1-2x_0-2x_1+x_0^2+2x_0x_1+x_1^2 \end{align}

ここで、x0,x1x_0,x_1は0または1を取る変数なので、x02=x0,x12=x1x_0^2=x_0,x_1^2=x_1とみなします。

H=12x02x1+x0+2x0x1+x1=1x0x1+2x0x1(6)\begin{align} H&=1-2x_0-2x_1+x_0+2x_0x_1+x_1\\ &=1-x_0-x_1+2x_0x_1\quad(式6) \end{align}

(式6)よりQUBOに変換する表を以下のように求めます。ここで定数は無視します。

x_0x_1
x_0-12
x_10-1

QUBO配列は以下となります。

QUBO=(1201)(7)QUBO=\begin{pmatrix} -1 & 2 \\ 0 & -1 \end{pmatrix}\quad(式7)

§ API KEYを取得する

blueqat.comクラウド環境からD-Waveに接続してプログラムを実行する際にAPI KEYが必要となります。
API KEYはblueqat.comサイトのアカウント情報ページから取得できます。
API KEYの取得方法についてはこちらの記事に記載していますのでご参照ください。

■無料で量子コンピュータの計算が投げられる10,000クレジットクーポンを購入し、API KEYを確認する
https://blueqat.com/tetsurotabata/9bba9713-3dfc-4aa4-974a-b83db01bf60e

§ プログラムを作成する

D-Waveに接続して実際に例題の解を求めるプログラムを作成します。
ここで、blueqat.comから実機接続を行うためのサンプルソースが提供されていますので、これを利用します。

サンプルソースについてはこちらからご覧下さい。

■量子マシンへのジョブ投稿のテンプレート
https://blueqat.com/yuichiro_minato2/d1b16207-5331-43d4-bf56-b021006287bf

先程取得したAPI KEYを設定します。
サンプルソースの以下の部分"YOUR_API_KEY"をAPI KEYで書き換えます。

image

次に、(式7)で得たQUBO配列をソースに取り込みます。
サンプルソースの以下の部分を(式7)で書き換えれば良いです。

image

作成したソースは以下となります。

import json import urllib.request API_KEY = "*************************************************" API_ENDPOINT = "https://cloudapi.blueqat.com/v1/" def post_request(path, body): headers = { 'Content-Type': 'application/json', 'X-Api-Key': API_KEY, } req = urllib.request.Request( API_ENDPOINT + path, json.dumps(body).encode(), headers) with urllib.request.urlopen(req) as res: body = res.read() return json.loads(body) def get_quantum_tasks(index): path = "quantum-tasks/list" body = { "index": index, } return post_request(path, body) def get_quantum_task(id): path = "quantum-tasks/get" body = { "id": id, } return post_request(path, body) def create_quantum_task(qubo, chain_strength, num_reads): path = "quantum-tasks/create" body = { "qubo": qubo, "chain_strength": chain_strength, "num_reads": num_reads, } return post_request(path, body) def get_credit(): path = "credit/get" return post_request(path, {}) print("get_credit") credit = get_credit() print("{} credits available.".format(credit["amount"])) # 既定の設定 chain_strength = 8 # 計算回数の設定 num_reads = 10 # CUBOの設定 qubo = [[-1, 2], [ 0, -1]] # 結果の表示 print('result') result = create_quantum_task(qubo, chain_strength, num_reads) table = pd.read_json(result["task"]["dataframe"]) print(table)
get_credit

9950 credits available.

result

   0  1  chain_break_fraction  energy  num_occurrences

0  0  1                     0      -1                2

1  1  0                     0      -1                8

§ プログラムを実行する

書き換えを行ったプログラムを実行します。
プログラムはPythonプログラムとして実行できます。
ソースをそのままblueqat.comのクラウド開発環境であるnotebookに貼り付けて実行することができます。

実行結果は以下となりました。

image

実行結果を確認します。

image

赤枠内は例題の変数x0,x1x_0,x_1を意味しています。
上段はx0=0,x1=1x_0=0,x_1=1となるケースでその出現頻度は右の緑色枠の数字で評価されます。
同様に、下段はx0=1,x1=0x_0=1,x_1=0となるケースでその出現頻度も確認できます。

ここで注意ですが、今回は10回のみの計算回数で実行しました。量子コンピューターの解は計算回数と出現確率で算出されますので、毎回計算を実行する度に異なる結果が得られます。

上の結果では、上段のケースと下段のがちょうど半分ずつ得られましたので、どちらのケースも同じ確率で解となることを意味しています。

以上で、D-Waveに実際に接続しプログラムを実行することができました。

D-Waveを使用する際に、D-Wave Leapにアカウント登録をする必要がない点が便利と言えます。

© 2024, blueqat Inc. All rights reserved