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

【初心者】量子アニーリング系計算の基本テクいくつか

Yuichiro Minato

2021/01/01 13:57

#量子アニーリング

はじめに

量子アニーリングなどをやっているとよく使う式が出てきますが、よく使うので忘れがちなものはちょっとまとめておきます。

量子ビットを+1と-1でランダムに初期化

量子ビットは-1と+1で初期化されますので、

import numpy as np

N=10
q = np.random.choice([-1,1],N)
print(q)

#=>
[-1 1 -1 -1 -1 -1 -1 1 -1 -1]

#リストにしたいときは、
list(q)

#=>
[-1, 1, -1, -1, -1, -1, -1, 1, -1, -1]

QUBOmatrixをよしなに操作

量子アニーリングでは問題設定をQUBOという形で表現しますが、matrixを使って表現もします。QUBOmatrixはN量子ビットに対してN*Nの行列の形で、上三角行列を使って局所磁場と相互作用の計算を表現します。計算によっては、対称行列を使いたいこともありますので、

#量子ビット数を決める
N=10

#QUBOmatrixを適当に初期化
qubo = np.ones((N,N))

#=>
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])

#上三角だけを抜き出す
np.triu(qubo)

#=>
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

#上三角行列にしてから対称行列に戻してみる。まず上三角行列
qubo = np.triu(qubo)

#=>
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 1., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 1., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 1., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 1., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 1., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 1., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 1., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])

#戻す。上三角行列とオフセットした行列の転置をとって足し合わせる
print(np.triu(qubo)+np.triu(qubo,k=1).T)

#=>
[[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]]

QUBOとイジング変換

QUBOは{0,1}のバイナリで考える一方、イジングは{-1,+1}で考えます。相互変換が可能で量子ビットの値は、

QUBO=>イジングは、値を二倍して-1します。

0*2-1 = -1

1*2-1 = +1

のように0が-1に、1が+1に変換されます。

同様に、

イジング=>QUBOは、+1して/2します。

(-1+1)/2 = 0

(+1+1)/2 = 1

のように、-1が0に、+1が1のままとなります。コードでは、

N=10
q = np.random.choice([-1,1],N)
print(q)

#=>
[-1 1 1 -1 -1 -1 -1 -1 1 -1]

#イジングからQUBOへ
print((np.asarray(q,int)+1)/2)

#=>
[0. 1. 0. 0. 0. 0. 0. 0. 1. 1.]

#QUBOからイジングヘ
print(q*2-1)

#=>
array([ -1., 1., -1., -1., -1., -1., -1., -1., 1., 1.])

Blueqatも開発中

OSSノ量子コンピュータSDKのBlueqatにもこんなのどんどん搭載してます。ご贔屓に。。。

https://github.com/Blueqat/Blueqat

© 2025, blueqat Inc. All rights reserved