Last active
June 3, 2024 08:32
-
-
Save mohzeki222/8086ffdae5db1bf39c87404832422a97 to your computer and use it in GitHub Desktop.
Qsolution_day1.ipynb
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"private_outputs": true, | |
"provenance": [], | |
"name": "Qsolution_day1.ipynb", | |
"authorship_tag": "ABX9TyPpvez6LJstdy52ooKG6TOW", | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/mohzeki222/8086ffdae5db1bf39c87404832422a97/-_day1.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"Google colaboratory上にD-Wave Systemsが提供しているOcean SDKをインストールするところから始めます。\n", | |
"以下のように pip install と言うコマンドでシステムに新しいライブラリをインストールすることができます。\n", | |
"(こうした呪文であらかじめ頭のいい人がプログラムしたものを呼び出すことができます)\n", | |
"今回の場合ですと、dwave-ocean-sdkをインストールすることになります。" | |
], | |
"metadata": { | |
"id": "96aJLeAIr2yJ" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"id": "rzN-a0abRuWc" | |
}, | |
"outputs": [], | |
"source": [ | |
"pip install dwave-ocean-sdk" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"ご自身のローカル環境へインストールする際も同様の手順で差し支えありません。\n", | |
"(ただし環境によってうまくインストールできるかどうかはわかりませんので、適宜ご対応いただければと思います)\n", | |
"これでD-Wave Systemsの量子アニーリングマシンを利用することができる準備が整いました。 たったこれだけの準備だてでOKです。" | |
], | |
"metadata": { | |
"id": "DzeP9CuOsFcp" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## 量子アニーリングマシンの目的\n", | |
"量子アニーリングマシンは「組合せ最適化問題」を解くために生まれたマシンです。\n", | |
"最適化問題は、その名前の通り「最適化」をしてくださいというものですが、\n", | |
"これは中学・高校のときに「なになにの最小値・最大値を求めなさい。またその時のxの値を求めなさい」という出題のあった数学の問題のことです。\n", | |
"もしもその関数が何かを表す関数であれば、それを最小化・最大化することを通して、何か特別な点を求めてくださいということとなります。\n", | |
"もしもその関数が、今後の将来の収入を予測したものであれば、最大化した生き方をしたいはずです。\n", | |
"もしもその関数が、今後の将来の苦労を予測したものであれば、最小化した生き方をしたいかもしれません。\n", | |
"逆にいれば、自分でそうした関数を作り出して、最小化ないしは最大化をすることで効率的な判断をするための参考にすることができます。\n", | |
"\n", | |
"## 量子アニーリングマシンが最小化する関数\n", | |
"量子アニーリングでは自然現象を利用して、次の関数の最小値およびその最小となるxを求めてくれます。\n", | |
"\\begin{equation}\n", | |
"E({\\bf x}) = \\sum_{i=1}^N \\sum_{j=1}^N Q_{ij} x_i x_j\n", | |
"\\end{equation}\n", | |
"ここでシグマ記号が高校生や数学の苦手な方を苦しめるかもしれませんが、とにかく全部足したものという意味です。\n", | |
"また$x_i$とか添え字の$i$があってかっこいいやら怖いやらという感覚を覚えるかもしれませんが、いくつも選択する要素がある。その要素の番号を$i$として省略しています。\n", | |
"\n", | |
"このような関数を最小化する問題のことを制約なし2値の2次計画問題と言います。英語でQuadratic unconstrained binary optimization(QUBO)と呼びます。\n", | |
"こうした最小化される対象となる関数のことをコスト関数と呼びます。\n", | |
"\n", | |
"量子アニーリングマシンには、こうした問題を解けと司令をするために、$Q_{ij}$という2つの添字を持った数の集団(行列)を送信します。\n", | |
"そのため$Q_{ij}$のことをQUBO行列とよび、中心的な役割を果たすものとして重視します。" | |
], | |
"metadata": { | |
"id": "dN8El8YpsTXw" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## D-Wave Leapにアカウント登録\n", | |
"\n", | |
"それでは適当にQUBO行列を作って、量子アニーリングマシンに投入してみましょう。\n", | |
"https://cloud.dwavesys.com/leap/ にアクセスしてください。\n", | |
"\n", | |
"メールアドレスや氏名・所属情報を記入してご自身のアカウントを作成してください。\n", | |
"そのアカウントでログインしたのちに、画面左下にあるAPI tokenをコピーしてください。\n" | |
], | |
"metadata": { | |
"id": "lrqEB55PvN7n" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"#簡単な問題を投入する\n", | |
"\n", | |
"それではアカウント登録が済んだら、そこで得られたご自身のAPI keyを利用して、量子アニーリングマシンに問題を投じてみましょう。先ほど紹介したように量子アニーリングマシンに問題を投じるというのは、QUBO行列をカナダにある量子アニーリングマシンに送信するという意味です。\n", | |
"だからQUBO行列さえ用意することができれば良いわけです。\n", | |
"そのためにpythonで有用なライブラリの1つnumpyを利用して、行列を簡単に作ってみましょう。" | |
], | |
"metadata": { | |
"id": "jNomvoq3vpWY" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import numpy as np" | |
], | |
"metadata": { | |
"id": "028CB9SSX1Ad" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"まずは簡単な例として、10×10行列によるQUBOを考えてみます。 np.random.randn()は、平均0、分散1のガウス分布に従う乱数を生成するという関数です。 それをN**2=100個作ったのち、reshape(N,N)として、10×10の行列の形にします。" | |
], | |
"metadata": { | |
"id": "HcN0xMvmv15e" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"#変数の数を10個に指定します\n", | |
"N = 10\n", | |
"#QUBO行列を作ります\n", | |
"QUBO = np.random.randn(N**2).reshape(N,N)\n", | |
"#細かいことですが、対称行列にしましょう。\n", | |
"QUBO = (QUBO + QUBO.T)/2" | |
], | |
"metadata": { | |
"id": "MSmIxfAzYCqy" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"ここでQUBO+QUBO.Tというところで、.Tというコマンドで転置をとっています。\n", | |
"行列の形を対称な形にするためです(細かいことですがたまに忘れます)\n", | |
"どんな値になっているのか調べたい人はprint等を利用して調べてみると良いでしょう。" | |
], | |
"metadata": { | |
"id": "CZSdmn0EwCoh" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"print(QUBO[0][1])" | |
], | |
"metadata": { | |
"id": "bBYBnQvywWBv" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"ここではQUBO[0][1]と指定していますが、上から0番目(常識的な数え方では1番目)、左から1番目(常識的な数え方では2番目)の数値を見ることができています。" | |
], | |
"metadata": { | |
"id": "aSqPGtbTwVL0" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"さてこうした下準備が終わりましたら、量子アニーリングマシンに投入してみましょう。\n", | |
"これだけで準備完了です。\n", | |
"まずは先ほど取得したAPI tokenを準備します。" | |
], | |
"metadata": { | |
"id": "Bn4qXgnVw6ka" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"token = '**' # 個人のAPI tokenを使用" | |
], | |
"metadata": { | |
"id": "oGGv6N5Bw2U8" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"続けて量子アニーリングマシンを呼び出す関数をいくつか用意します。" | |
], | |
"metadata": { | |
"id": "0_WI8EH8xKK4" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from dwave.system import DWaveSampler, EmbeddingComposite" | |
], | |
"metadata": { | |
"id": "hbQxfHn7cNqT" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"**from dwave.system**とあるのはOcean SDKのdwave.systemの中からということです。\n", | |
"\n", | |
"**import DWaveSampler**でDWaveSamplerという関数を呼び出しており、\n", | |
"これは量子アニーリングを行うQPUチップを利用する関数です。\n", | |
"\n", | |
"**import EmbeddingComposite**でEmbeddingCompositeという関数を呼び出しています。\n", | |
"これは用意したQUBO行列をQPUチップに埋め込むための関数です。" | |
], | |
"metadata": { | |
"id": "vobfP-fUxMi_" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dw_sampler = DWaveSampler(solver='Advantage_system6.4', token=token)" | |
], | |
"metadata": { | |
"id": "A_lI5rZHc3Z7" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"ここでsolver=というオプションで、どの量子アニーリングマシンを使うのかを指定することができます。\n", | |
"最新式の量子アニーリングマシンはD-Wave Advantageであり、それを利用する場合には\n", | |
"solver = 'Advantage_system6.3'としましょう。\n", | |
"さらに次世代の量子アニーリングマシン用のプロトタイプのチップも利用できます。\n", | |
"その場合には、\n", | |
"solver = 'Advantage2_prototype2.3'\n", | |
"とします。\n" | |
], | |
"metadata": { | |
"id": "Rusoq4s_xjkz" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"次におまじない的ですが、QUBO行列をQPUに埋め込むための作業を行うために\n", | |
"EmbeddingCompositeという機能を付与します。" | |
], | |
"metadata": { | |
"id": "4G1Ihjoryvyr" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampler = EmbeddingComposite(dw_sampler)" | |
], | |
"metadata": { | |
"id": "qEQOkU0tdPM0" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"これでみなさんのQUBO行列をなんでも埋め込めるようになりました。\n", | |
"回路の限界はありますが、できるかぎりQUBO行列をQPUチップに載せてくれます。\n", | |
"それでは早速量子アニーリングマシンに問題を投入しましょう。\n", | |
"以下のコマンドでOKです。その際にnum_readsで何回量子アニーリングを実行するのかを指定しましょう。" | |
], | |
"metadata": { | |
"id": "q6vqs0oUy6DV" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampleset = sampler.sample_qubo(QUBO, num_reads=100)" | |
], | |
"metadata": { | |
"id": "IoZNZumfeS94" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"このコマンドを実行すると、カナダに問題が送信されます。順次彼方では量子アニーリングマシンが他のジョブとともに次々に組合せ最適化問題を解き、その結果を記録しています。\n", | |
"私たちはその結果を取得する必要があります。\n", | |
"そのために行うのが、samplesetの実行です。\n", | |
"例えばどんな結果が出てきたのかをみたいときにはsampleset.recordなどを打つと良いでしょう。" | |
], | |
"metadata": { | |
"id": "d65vouts0NVo" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"print(sampleset.record)" | |
], | |
"metadata": { | |
"id": "zn0MNSd_fNMM" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"他にもコスト関数がどのような値を取っていたのか、その頻度をプロットしたヒストグラムを描くことができます。\n", | |
"エネルギーだけのリスト(numpy.array)を取得するためにはsampleset.data_vectors[\"energy\"]\n", | |
"です。" | |
], | |
"metadata": { | |
"id": "-BAA_MML0r1B" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ene = sampleset.data_vectors[\"energy\"]" | |
], | |
"metadata": { | |
"id": "gW3doLE60qRC" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"結果の表示のために利用するライブラリとしてmatplotlibを呼び出します。\n", | |
"\n", | |
"(通常プログラミングを行う際にはこうしたライブラリは最初に表記して用意しておきますが、今回はライブコーディングですので必要に応じて呼び出しています)" | |
], | |
"metadata": { | |
"id": "vcygicdE1Ddb" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"plt.hist(ene, bins=20)\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "9TMZs27w19Bu" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"それではこれを残しておいて、別のQPUでも試してみて、性能を比較してみましょう。\n", | |
"このノートブックではAdvantage6.1とAdvantage2_prototype1.1を比較してみます。\n" | |
], | |
"metadata": { | |
"id": "hLcU1v0Y2Ia-" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"dw_sampler2 = DWaveSampler(solver='Advantage2_prototype2.3', token=token)\n", | |
"sampler2 = EmbeddingComposite(dw_sampler2)\n", | |
"sampleset2 = sampler2.sample_qubo(QUBO, num_reads=100)" | |
], | |
"metadata": { | |
"id": "Fr7T5u7C2X5x" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"D-Waveマシンを使う関数群については一気に利用してみました。\n", | |
"それぞれ変数名等を2と付してあります。" | |
], | |
"metadata": { | |
"id": "2jwmn8vH2kD0" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ene2 = sampleset2.data_vectors[\"energy\"]\n", | |
"plt.hist(ene2, bins=20)\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "Zbfolh1C2jqw" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"おそらく結果が異なる傾向にあると思います。\n", | |
"せっかくですので重ねて比較してみましょう。\n", | |
"range=(min,max)で範囲を揃えて描くと綺麗に仕上がります。" | |
], | |
"metadata": { | |
"id": "ehbpQuYD2zV5" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"plt.hist(ene, bins=20, alpha=0.5,range=(-8,-6))\n", | |
"plt.hist(ene2, bins=20, alpha=0.5,range=(-8,-6))\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "HckW9Mxd2ts5" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"これを見ますと(青が先に用意したもの、オレンジが後に用意したものです)\n", | |
"Advantage2が優勢で、より低いエネルギーを持つ答えを得ることに成功しているのがわかります。" | |
], | |
"metadata": { | |
"id": "oMSY9T__6JCV" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## 混雑を分散してみよう!" | |
], | |
"metadata": { | |
"id": "TxnKaaEfImZY" | |
} | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"板書で紹介したQUBOを実際に作ってみましょう。\n", | |
"まずは適当な乱数により$C_{it}$を作ってみます(実際の応用例では実データに差し替える部分)\n", | |
"Nを人数、Mを時間として適当に設定してみます。\n", | |
"\n", | |
"t0とt1を開始時刻、終了時刻として設定します。\n", | |
"randintにより整数値が適当に選ばれます。\n", | |
"それをnp.sort()により小さい順に変えておきます。\n", | |
"そこに含まれる自国の場合に$C_{ti}=1$とします。\n", | |
"\n", | |
"その結果をyに格納しておきプロットしてみましょう。\n", | |
"見やすいようにplt.fill_betweenを利用します。" | |
], | |
"metadata": { | |
"id": "Jp8iArDuIoLu" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"N = 10\n", | |
"M = 10\n", | |
"Cit = np.zeros([N,M])\n", | |
"\n", | |
"x = list(range(M))\n", | |
"for i in range(N):\n", | |
" t0 = np.random.randint(1,M-1)\n", | |
" t1 = np.random.randint(2,M)\n", | |
" [t0,t1] = np.sort([t0,t1])\n", | |
"\n", | |
" print(t0,t1)\n", | |
" for j in range(M):\n", | |
" if j >= t0 and j <= t1:\n", | |
" Cit[i,j] = 1\n", | |
" y = Cit[i,:]\n", | |
" plt.plot(x,y,'blue')\n", | |
" plt.fill_between(x,y,color='blue',alpha=0.1)\n", | |
" plt.show()\n" | |
], | |
"metadata": { | |
"id": "SaDv-0w42erD" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"またこちらも適当ですが、優先度合い$d_i$をrandintで設定します。\n", | |
"混雑してでも呼びたい人なのか、どうなのか、この数値で調整されることになります。\n" | |
], | |
"metadata": { | |
"id": "gZfUx8I7JUph" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"d = np.random.randint(1,5,N)\n", | |
"d" | |
], | |
"metadata": { | |
"id": "CuELu7iT-SJT" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"さて肝心のQUBOです。\n", | |
"ここのプログラムの部分についてですが、実はすごい簡単です。\n", | |
"自分でQUBOを数式で書ける人は何も不自由なく量子アニーリングを実行することができます。\n", | |
"実はシグマ記号というのはコンピュータプログラムのfor文と同様でして、\n", | |
"シグマ記号があるものについてはそのままfor文で書き下せば良いのです。\n", | |
"まずはQUBO行列の初期化を行います。" | |
], | |
"metadata": { | |
"id": "KyTcmfJpJ6JX" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"QUBO = np.zeros([N,N])\n", | |
"K = 2" | |
], | |
"metadata": { | |
"id": "OejS910XAZSp" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"次に$C_{ti}$が含まれる項を二乗ということですから以下のように2つの和の積ということになります。\n", | |
"\\begin{equation}\n", | |
"\\sum_t \\left(\\sum_i C_{ti}x_i \\right)\\left(\\sum_j C_{tj}x_j \\right)\n", | |
"\\end{equation}\n", | |
"これをバラして順番を入れ替えてみると\n", | |
"\\begin{equation}\n", | |
"\\sum_t \\sum_i \\sum_j C_{ti}C_{tj}x_i x_j\n", | |
"\\end{equation}\n", | |
"ここで$x_ix_j$の席に当たる部分だけ抜き取って以下のように計算をします。\n" | |
], | |
"metadata": { | |
"id": "HDkfCJ0MKNPC" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"for t in range(M):\n", | |
" for i in range(N):\n", | |
" for j in range(N):\n", | |
" QUBO[i,j] += Cit[i,t]*Cit[j,t]/M\n" | |
], | |
"metadata": { | |
"id": "QaAuF1iQKyFu" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"for文は、そのままシグマ記号を直しているだけなのが見て取れますね。\n", | |
"同じように第二項の\n", | |
"\\begin{equation}\n", | |
"-\\alpha \\sum_{i}d_ix_i\n", | |
"\\end{equation}\n", | |
"についても実は$x_i=x_ix_i$の事実を利用すると、これはQUBOの対角項に数字を埋めているということがわかります。\n", | |
"\\begin{equation}\n", | |
"- \\alpha \\sum_{i}d_i x_ix_i\n", | |
"\\end{equation}" | |
], | |
"metadata": { | |
"id": "ikQVK1QlKz9S" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"alpha = 0.0\n", | |
"for i in range(N):\n", | |
" QUBO[i,i] -= alpha*d[i]\n", | |
"\n" | |
], | |
"metadata": { | |
"id": "e-N9dQuaLt5R" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"罰金法の項についても同様にそれぞれ\n", | |
"\\begin{equation}\n", | |
"\\frac{\\lambda}{2} \\sum_{i} \\sum_{j} x_i x_j\n", | |
"\\end{equation}\n", | |
"および\n", | |
"\\begin{equation}\n", | |
"-\\lambda K \\sum_{i} x_i\n", | |
"\\end{equation}\n", | |
"という事実を見ながら以下のようにコードに反映させます。" | |
], | |
"metadata": { | |
"id": "gWC1vjGLLvWz" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"lam = 10\n", | |
"for i in range(N):\n", | |
" for j in range(N):\n", | |
" QUBO[i,j] += lam/2\n", | |
"\n", | |
"for i in range(N):\n", | |
" QUBO[i,i] -= 2*K*lam/2" | |
], | |
"metadata": { | |
"id": "P2ztr8POMCej" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"それでは先ほど利用したsamplerを利用して、今回のQUBOを解いてもらいましょう。" | |
], | |
"metadata": { | |
"id": "4Xx-Rt3JMFlD" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampleset = sampler.sample_qubo(QUBO, num_reads=100)" | |
], | |
"metadata": { | |
"id": "OattUNzGDlSp" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"結果として得られたデータを取得する際には同様に以下のようなコードを組んで\n", | |
"エネルギーのヒストグラムをたとえば取得してみましょう。" | |
], | |
"metadata": { | |
"id": "xstY71G6MKBx" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ene3 = sampleset.data_vectors[\"energy\"]\n", | |
"plt.hist(ene3, bins=20)\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "eO1LKoIOD0j_" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"どんな答えが出力されているのかを閲覧する際に以下のようなコードも利用できます。" | |
], | |
"metadata": { | |
"id": "vEZd7ZjrMRzB" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampleset.record" | |
], | |
"metadata": { | |
"id": "eUWa2R5KEVRw" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"こちらの0行目、0列目は1番エネルギーの小さい回答となります。\n", | |
"(1列目はエネルギーの値そのものを返します)" | |
], | |
"metadata": { | |
"id": "l2khs1CHMXVj" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ans = sampleset.record[0][0]\n", | |
"print(ans)" | |
], | |
"metadata": { | |
"id": "oHgVf2eOF0BV" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"この結果に基づき、混雑度合いを見てみましょう。\n", | |
"回答が1であったもの、つまり選ばれた人のスケジュールを重ねてみます。\n", | |
"全ての結果を重ねたものをyallとします。" | |
], | |
"metadata": { | |
"id": "XHVPcRdaMeV1" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"yall = np.zeros(M)\n", | |
"for i in range(N):\n", | |
" if ans[i] == 1:\n", | |
" y = Cit[i,:]\n", | |
" yall += y\n", | |
" plt.plot(x,y,'blue')\n", | |
" plt.fill_between(x,y,color='blue',alpha=0.5)\n", | |
"\n", | |
"plt.plot(x,yall,'red')\n", | |
"plt.fill_between(x,yall,color='red',alpha=0.1)\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "U0hC5WTdGv3y" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"## おまけ・シミュレータの紹介\n", | |
"最後に自学自習のためにたくさんやってみたいけど\n", | |
"量子アニーリングマシンを使うとマシンタイムなどが心配になるという方に\n", | |
"シミュレータを紹介します。\n", | |
"東北大学・東工大発スタートアップの株式会社Jijから出ておりますOpenJijです。\n", | |
"早速インストールしてみましょう。" | |
], | |
"metadata": { | |
"id": "6aOzjVwFECox" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"pip install openjij" | |
], | |
"metadata": { | |
"id": "evUl1l3plqqS" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"使い方は簡単で、量子アニーリングのシミュレータということでSQASamplerを呼び出します。\n", | |
"\n", | |
"(他にもシミュレーテッドアニーリングのシミュレータであるSASamplerなども)" | |
], | |
"metadata": { | |
"id": "zyjcoOM4EYxg" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"from openjij import SQASampler" | |
], | |
"metadata": { | |
"id": "nWzRD9F2mEOv" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"D-Waveマシンの使い方と同じようにsamplerとして呼び出します。" | |
], | |
"metadata": { | |
"id": "RA86vIGLEjwS" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampler_sim = SQASampler()" | |
], | |
"metadata": { | |
"id": "u3DD-SENmX87" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"使い方は基本的には量子アニーリングマシンと同じです。num_readsを指定して実行します。" | |
], | |
"metadata": { | |
"id": "aV9OTfG2EoLO" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"sampleset_sim = sampler.sample_qubo(QUBO, num_reads=100)" | |
], | |
"metadata": { | |
"id": "6TJTu067mbWa" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"ene_sim = sampleset_sim.data_vectors[\"energy\"]\n", | |
"plt.hist(ene_sim, bins=20)\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "cHzeZM6Umhe4" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"素朴に量子アニーリングマシンと比較してみたくなりますよね。\n", | |
"やってみましょう。" | |
], | |
"metadata": { | |
"id": "Wr06sccxE3Iy" | |
} | |
}, | |
{ | |
"cell_type": "code", | |
"source": [ | |
"plt.hist(ene_large, bins=20, alpha=0.5,range=(-170,-130))\n", | |
"plt.hist(ene_sim, bins=20, alpha=0.5,range=(-170,-130))\n", | |
"plt.show()" | |
], | |
"metadata": { | |
"id": "sDtjf_1RmpLL" | |
}, | |
"execution_count": null, | |
"outputs": [] | |
}, | |
{ | |
"cell_type": "markdown", | |
"source": [ | |
"やや量子アニーリングマシンが優勢?かな。くらいの結果でした。\n", | |
"大きな差がない良質のシミュレータと考えることができます。\n", | |
"是非ともご自身でたくさんの試行錯誤をする際はシミュレータを駆使してください。" | |
], | |
"metadata": { | |
"id": "D0p7QYA4FBux" | |
} | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment