blueqat cloudでquboを実行する方法を紹介します。
ツール類はすでにプリインストールされていますので何も考えずに使えます。
まずはツールを読み込みます。
*このipynbはblueqat.comからですと左上の雲ダウンロードマークをおすと自分のクラウドのフォルダのimportedに自動的にコピーされます。
import neal
from pyqubo import Array
次に量子ビットを準備します。QUBOの場合にはBINARYを指定します。
q = Array.create('q', shape=(5), vartype='BINARY')
式を書きます。
H = -2*q[0] -2*q[1] -3*q[2] -3*q[3] -2*q[4] +2*q[0]*q[1] +2*q[1]*q[2] +2*q[0]*q[3] +2*q[2]*q[3] +2*q[2]*q[4] +2*q[3]*q[4]
あとは変換してシミュレータに投げることで解を得ることができます。
#お決まりの変換。特に考えない。
model = H.compile()
bqm = model.to_bqm()
sa = neal.SimulatedAnnealingSampler()
sampleset = sa.sample(bqm, num_reads=10)
print(sampleset)
q[0] q[1] q[2] q[3] q[4] energy num_oc.
0 0 1 0 1 0 -5.0 1
1 1 0 1 0 0 -5.0 1
2 1 0 1 0 1 -5.0 1
3 0 1 0 1 1 -5.0 1
4 1 0 1 0 0 -5.0 1
5 0 1 0 1 0 -5.0 1
6 1 0 1 0 1 -5.0 1
7 1 0 1 0 1 -5.0 1
8 0 1 0 1 0 -5.0 1
9 1 0 1 0 1 -5.0 1
['BINARY', 10 rows, 10 samples, 5 variables]
decoded_samples = model.decode_sampleset(sampleset)
best_sample = min(decoded_samples, key=lambda x: x.energy)
print("Sample =", best_sample.sample)
print("Cost =", best_sample.energy)
Sample = {'q[4]': 0, 'q[3]': 1, 'q[2]': 0, 'q[1]': 1, 'q[0]': 0}
Cost = -5.0
from pyqubo import Array, Constraint
import neal
#今回は3量子ビットのみ
q = Array.create('q', shape=(3), vartype='BINARY')
#式を別々に用意します。
HA = (3*q[0]+2*q[1]+q[2]-3)**2 + (5*q[0]+2*q[1]+3*q[2]-5)**2
HB = -(q[0]+2*q[1]+q[2])
#つけるときに今回はConstraint関数を使うことであとで簡単に確かめができます。Constraintは制約条件の方だけにつけます。
M = 10
H = Constraint(HA, label="const1") + M*HB
model = H.compile()
bqm = model.to_bqm()
sa = neal.SimulatedAnnealingSampler()
sampleset = sa.sample(bqm, num_reads=10)
print(sampleset)
q[0] q[1] q[2] energy num_oc.
0 0 1 1 -30.0 1
1 0 1 1 -30.0 1
2 0 1 1 -30.0 1
3 0 1 1 -30.0 1
4 0 1 1 -30.0 1
5 0 1 1 -30.0 1
6 0 1 1 -30.0 1
7 0 1 1 -30.0 1
8 0 1 1 -30.0 1
9 0 1 1 -30.0 1
['BINARY', 10 rows, 10 samples, 3 variables]
decoded_samples = model.decode_sampleset(sampleset)
best_sample = min(decoded_samples, key=lambda x: x.energy)
print("Sample =", best_sample.sample)
print("Cost =", best_sample.energy)
print("Break =", best_sample.constraints(only_broken=True))
Sample = {'q[2]': 1, 'q[1]': 1, 'q[0]': 0}
Cost = -30.0
Break = {}
アニーリング実例のおさらい
化学
・線形回帰(旭化成様)
・量子化学
・ボルツマンマシン機械学習
自動車
・交通最適化
・自動車の軌跡データ圧縮(凸版印刷様)
・構造部材の構造計算最適化
建設
・部材、構造計算
・シフト最適化
・生産工程最適化
小売/広告
・広告とか配置
・物流サプライ
・リコメンド
創薬
・プロテインフォールディング
・分子ドッキング
・その他機械学習