こんにちは、今日はblueqat cloudを利用して簡単な交通最適化を実行したいと思います。こちらはまだAPIを作ったばかりなので、フロントエンドのツール類はこれから少しずつ提供される予定なので、現時点ではちょっと煩雑かもしれませんが、楽しめる方は見ていただけると幸いです。
このファイルは、記事ページから直接blueqat cloudの自分のアカウントにimportできる機能が付いています。クラウドのダウンロードマークを押すと自分のblueqat cloudのフォルダにimportされます。
API関連整備
まずはツール類を読み込み関数を作ります。ポイントはタスクを投げるところ、回収するところです。APIのキーは事前に.passというテキストファイルに記述しておいてあり、そっから読み込んでます。
import json
import urllib.request
import numpy as np
import pandas as pd
import networkx as nx
from blueqat.wq import *
import matplotlib.pyplot as plt
%matplotlib inline
f = open('../.pass', 'r', encoding='UTF-8')
API_KEY = f.read()[:-1]
f.close()
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, num_reads, chain_strength=8):
path = "quantum-tasks/create"
body = {
"qubo": qubo,
"num_reads": num_reads,
"chain_strength": chain_strength
}
return post_request(path, body)
def get_credit():
path = "credit/get"
return post_request(path, {})
やり方はこちらを参考にしますが、もう少し大きめの問題を解いてみます。
N = 12
#混雑度の条件
A = [
[4,4,0,8,4,0,0,0,4,4,0,4],
[0,4,0,4,8,0,0,0,2,2,0,6],
[0,0,4,0,0,8,2,6,2,0,4,0],
[0,0,0,4,4,0,0,0,4,4,0,4],
[0,0,0,0,4,0,0,0,2,2,0,6],
[0,0,0,0,0,4,2,6,2,0,4,0],
[0,0,0,0,0,0,3,2,0,0,4,0],
[0,0,0,0,0,0,0,3,2,0,4,0],
[0,0,0,0,0,0,0,0,3,4,0,2],
[0,0,0,0,0,0,0,0,0,2,0,2],
[0,0,0,0,0,0,0,0,0,0,2,0],
[0,0,0,0,0,0,0,0,0,0,0,4]
]
#制約条件
B = np.diag([-1 for i in range(N)])
for i in range(0,N,3):
B[i][i+1] = 2
B[i][i+2] = 2
B[i+1][i+2] = 2
#set a QUBO
M = 1
qubo = A+B*M
#show as network
G = nx.from_numpy_matrix(qubo)
nx.draw_networkx(G)
plt.show()
<Figure size 432x288 with 1 Axes>
次は行列自体を可視化してみます。
plt.imshow(qubo)
plt.colorbar()
plt.show()
<Figure size 432x288 with 2 Axes>
早速解いてみますが、シミュレータでやってみます。調整変数Mを導入してみます。
#to simulator
M = 10
qubo = A+B*M
plt.imshow(qubo)
plt.colorbar()
plt.show()
a = Opt()
a.qubo = qubo
res = a.run()
print(sum(res))
print(res)
<Figure size 432x288 with 2 Axes>
4
[0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0]
続いて同じ問題をクラウド経由で実機へ
num_reads = 100
#to D-Wave Advantage
M = 10
qubo = (A+B*M).tolist()
result = create_quantum_task(qubo, num_reads)
table = pd.read_json(result["task"]["dataframe"]).sort_values('energy')
result2 = table.loc[0][0:N].astype('int').to_list()
print(sum(result2))
print(result2)
4
[0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0]
table
0 1 2 3 4 5 6 7 8 9 10 11 chain_break_fraction energy \
0 0 1 0 0 0 1 1 0 0 1 0 0 0 -23
1 0 0 1 0 1 0 1 0 0 1 0 0 0 -23
2 1 0 0 0 0 1 1 0 0 1 0 0 0 -21
3 0 0 1 1 0 0 1 0 0 1 0 0 0 -21
18 0 0 0 0 1 0 0 1 0 1 0 0 0 -19
16 0 0 1 0 1 0 0 1 0 1 0 0 0 -19
15 0 1 0 1 0 0 0 1 0 0 1 0 0 -19
14 0 0 0 0 1 0 1 0 0 1 0 0 0 -19
13 0 1 0 1 0 0 1 0 0 0 1 0 0 -19
12 0 1 0 0 0 0 1 0 0 1 0 0 0 -19
11 0 1 0 0 0 0 0 0 1 0 1 0 0 -19
17 0 0 1 1 0 0 1 0 0 0 0 1 0 -19
9 0 0 0 0 1 0 0 0 1 0 1 0 0 -19
8 0 1 0 0 0 0 0 1 0 1 0 0 0 -19
7 0 0 1 0 1 0 0 0 1 0 1 0 0 -19
6 0 1 0 0 0 1 0 0 1 0 1 0 0 -19
5 1 0 0 0 1 0 0 1 0 0 1 0 0 -19
4 0 0 1 0 0 0 1 0 0 1 0 0 0 -19
10 0 1 0 0 0 1 0 1 0 1 0 0 0 -19
19 0 0 1 0 1 0 0 0 0 1 0 0 0 -18
26 0 0 1 1 0 0 0 0 1 0 1 0 0 -17
25 1 0 0 0 0 0 0 1 0 0 1 0 0 -17
24 1 0 0 0 0 0 0 0 1 0 1 0 0 -17
23 0 0 1 0 1 0 0 0 1 1 0 0 0 -17
21 1 0 0 0 0 0 0 1 0 1 0 0 0 -17
20 0 0 0 1 0 0 0 1 0 1 0 0 0 -17
22 0 0 1 1 0 0 0 1 0 1 0 0 0 -17
27 0 1 0 0 0 1 0 0 1 0 0 0 0 -15
28 0 0 1 0 0 0 0 0 1 0 0 1 0 -15
29 0 0 0 1 0 0 0 1 0 0 0 1 0 -15
30 0 0 0 0 0 1 0 0 0 1 0 0 0 -14
31 0 0 1 1 0 0 0 0 0 0 0 1 0 -14
33 0 0 1 0 1 0 0 0 1 0 0 1 0 -13
32 0 0 0 0 1 0 0 1 0 0 0 0 0 -13
34 0 0 0 0 0 0 0 0 1 0 0 1 0 -11
num_occurrences
0 4
1 21
2 1
3 10
18 3
16 3
15 6
14 1
13 3
12 2
11 1
17 5
9 2
8 8
7 1
6 2
5 3
4 1
10 1
19 1
26 1
25 1
24 1
23 3
21 2
20 1
22 1
27 2
28 2
29 1
30 1
31 1
33 2
32 1
34 1
テーブルを見てみると、エネルギー値-23で同率一位の解が二つありました。どちらでも正解ですので、無事実機でも交通最適化が解けました。以上です。