common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

blueqat cloud経由でのD-Waveでの交通最適化問題

Yuichiro Minato

2021/04/16 05:09

#量子アニーリング #D-Wave

2

1

こんにちは、今日は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, {})

やり方はこちらを参考にしますが、もう少し大きめの問題を解いてみます。 https://blueqat.com/yuichiro_minato2/2c19e9ce-c1c8-4246-a710-fd55aff03a72

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>output

次は行列自体を可視化してみます。

plt.imshow(qubo) plt.colorbar() plt.show()
<Figure size 432x288 with 2 Axes>output

早速解いてみますが、シミュレータでやってみます。調整変数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>output
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で同率一位の解が二つありました。どちらでも正解ですので、無事実機でも交通最適化が解けました。以上です。

© 2024, blueqat Inc. All rights reserved