common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING

Nobisuke

Dekisugi


autoQAOA
DEEPSCORE

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

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>

image

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

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

image

早速解いてみますが、シミュレータでやってみます。調整変数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>

image

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で同率一位の解が二つありました。どちらでも正解ですので、無事実機でも交通最適化が解けました。以上です。

© 2025, blueqat Inc. All rights reserved