クレジットクーポンを利用してD-Waveに接続しプログラムを実行してみた
§ 本記事の目的
本記事では、blueqat.comで購入できるクーポンを利用して、量子アニーリングマシンであるカナダのD-Waveに実際に接続し、簡単な問題をプログラミングして実機上で実行する手順をご紹介します。
※本記事は令和3年4月22日に執筆しています。
今後の仕様変更やバージョンアップより当記事内容が有効でなくなった場合はご了承ください。
§ 量子アニーリングマシン、カナダのD-Waveって何?
D-Waveは、量子コンピューターの実機として世界で最も早く商用化、発売された量子コンピューターです。
D-Waveは「ディーウェイブ」と読みます。カナダのベンチャー企業が世界で最初に開発しました。現在は日本のNECが資金提供を行っています。
量子コンピューターは主に「アニーリング方式」と「ゲート方式」の二種類ありますが、D-Waveは前者の「アニーリング方式」を採用しています。
「アニーリング方式」は、主に組合せ最適化問題を解くことに特化した方式です。また、機械学習分野への応用も研究されています。
組合せ最適化問題とは、最も効率の良い手段や選択肢を特定する問題解決の手段として近年注目され、例えば工場の在庫計画や販売計画、流通分野では配送ルートの選択、一般分野では勤務表の作成などに応用が期待されています。
§ 今回解く問題とQUBO配列
(1)今回解く問題
今回解く例題とプログラミングを行います。
今回はなるべく簡単な問題として以下を解きます。
[例題]
を満たす整数 x_0 + x_1 = 1 と x_0 を探す x_1
この問題の解は以下の2通りであることが直感的にわかります。
または
D-Waveでこの問題を解くための立式を行います。
(2)ハミルトニアンの立式
量子アニーリングにより問題を解くには、ハミルトニアン(ハミルトン式)を立式する必要があります。
ハミルトニアンは機械学習分野で言うと損失関数またはコスト関数に当たるもので、その値が最も小さくなる条件を求めます。
この時の条件が解となります。
例題についてのハミルトニアンHは以下となります。
<ケース1>
<ケース2>
<ケース3>
<ケース4>
または
よって、立式(式1)は正しいことがわかります。
(3)ハミルトニアンからQUBO配列を求める
ハミルトニアンの立式ができたら、式を展開しQUBO配列を求めます。
QUBOとはQuadratic Unconstrained Binary Optimization(制約なし二次形式二値変数最適化)の略で、D-Waveで解を算出する場合はQUBO配列を求めることが必要です。
QUBOを求めるために(式1)を展開します。
ここで、
x_0 | x_1 | |
---|---|---|
x_0 | -1 | 2 |
x_1 | 0 | -1 |
QUBO配列は以下となります。
§ 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で書き換えます。
次に、(式7)で得たQUBO配列をソースに取り込みます。
サンプルソースの以下の部分を(式7)で書き換えれば良いです。
作成したソースは以下となります。
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に貼り付けて実行することができます。
実行結果は以下となりました。
実行結果を確認します。
赤枠内は例題の変数
上段は
同様に、下段は
ここで注意ですが、今回は10回のみの計算回数で実行しました。量子コンピューターの解は計算回数と出現確率で算出されますので、毎回計算を実行する度に異なる結果が得られます。
上の結果では、上段のケースと下段のがちょうど半分ずつ得られましたので、どちらのケースも同じ確率で解となることを意味しています。
以上で、D-Waveに実際に接続しプログラムを実行することができました。
D-Waveを使用する際に、D-Wave Leapにアカウント登録をする必要がない点が便利と言えます。