量子アニーラを使ってできるのは最適化計算だけではありません。確率分布を作り出すことができますので、ゲームなどの利用に最適です。今回はD-Waveの新型マシンであるAdvantage System1.1を利用してガチャを作ってみたいと思います。
いらすとや
まずはいらすとやさんから良さそうなキャラクターと、ガチャのレア度の画像をダウンロードし、いくつか作ってみました。
まずはガチャの画像です。右上に量子コンピュータを配置してみました。
次にノーマルです。スライムにしました。
次にレアです。確かベヒーモスです。
そして、さらにハイパーレアで変なおっさん。オーディーンかなんかだった気がします。
最後に滅多に出ないSSRはリヴァイアサンにしました。
ボルツマン分布とQUBO
早速ガチャやります。今回はボルツマン分布を使ってみます。イジングモデルのエネルギー値に対して、確率分布である、
p(x) = 1/Z * exp(beta*E)
が成立します。これを利用し、QUBOを作り、エネルギー分布とガチャのレア度を対応させます。
ツール読み込み
今回は純粋にD-WaveのAdvantageを呼び出します。
import numpy as np
from dwave.system.samplers import DWaveSampler
from dwave.system.composites import EmbeddingComposite
早速サンプリング
早速QUBOを作って、実機に投げてみます。tokenは自分のをあらかじめ設定します。
#qubo = np.array([[0,1,10],[0,0,-1],[0,0,-0.5]])
qubo = np.array([[0,-2,10],[0,0,-1],[0,0,-0.5]])
bqm = dimod.BQM.from_numpy_matrix(qubo)
response = EmbeddingComposite(DWaveSampler(endpoint='https://cloud.dwavesys.com/sapi', token=token, solver='Advantage_system1.1')).sample(bqm, num_reads=1000)
print(response)
作るQUBOによって分布が変わります。今回はAdvantage system 1.1に1000回投げました。
確率分布
結果はこのような感じででます。
0 1 2 energy num_oc. chain_.
0 1 1 0 -2.0 551 0.0
1 0 1 1 -1.5 375 0.0
2 0 0 1 -0.5 38 0.0
3 1 0 0 0.0 11 0.0
4 0 0 0 0.0 15 0.0
5 0 1 0 0.0 10 0.0
['BINARY', 6 rows, 1000 samples, 3 variables]
110が551回。011が375回、その他続くという感じです。背景にある確率分布は厳密に求めることができますが、今回はサンプリングですので、それに準じて出現回数が決まっています。
量子ゲートマシンでもできる
今回は量子アニーラを使いましたが、IBMやGoogleやIonQ、Honeywellなどのマシンでも利用できます。その際にはボルツマンガチャではなく、状態ベクトルを直接とる、ボルンガチャとなります。ボルンガチャの作り方は、今回のQUBOとは異なるので、またの機会に紹介したいと思います。
量子アニーラの特徴は応答が速いことです。量子ゲートマシンで結果を取得するのは時間がかかるので、今回はアナログのD-Waveの量子アニーラのサンプリングを使います。
スマホアプリへ実装
早速スマホアプリへ実装しましょう。ガチャの画面を押すと、カナダのD-Waveへとジョブが投入され、ガチャが決まります。確率分布は上記のボルツマン分布を仮定して調整されているので、なかなかSSRを引くのは大変です。
理論的な話
実際に、背後の確率分布はそれぞれ、出ているエネルギー値-2.0や-1.5などによって変わります。サイズが小さい場合には、厳密な確率を求めることができますが、実際にはアナログマシンですので、マシンの性能や状態によっても分布が変わりますので、事前に実機で分布を取るのが望ましいです。
上記は、実機では、SSRが出る確率は、およそ1%となっています。この辺り調整するには、量子アニーラではイジング式をいじれば良いことになります。
ゲームは面白い
量子コンピュータや量子アニーラの不確実性をゲームに導入するのはとても面白いと思いますので、ぜひ新しい分野に挑戦してみてください。