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

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