{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "V_NR6GiIBDP2" }, "source": [ "# 2-アニーリングアルゴリズムの評価" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/OpenJij/OpenJijTutorial/blob/master/source/ja/002-Evaluation.ipynb)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FbP_6wGgBDP6" }, "source": [ "アニーリングアルゴリズムはヒューリスティクスの一つなので毎回最適解を出せるとは限りません。これは近似解を求めるアルゴリズムです。\n", "また確率的アルゴリズムなので毎回解が異なります。そのため、アルゴリズムの評価をするときは様々な平均値を用いてその解を評価します。よく用いられる指標に\n", "\n", "- 成功確率 : Success probability\n", "- TTS : Time to solution\n", "- 残留エネルギー : Resudial energy\n", "\n", "の3つがあります。特に**TTS**は計算時間を表すもので様々な評価によく用いられます。残留エネルギーは最適解にどれくらい近づけたのかを平均的に示す値です。\n", "\n", "この章では上記の3の評価指標の解説と測定方法について解説します。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "av11BMPjBDP8" }, "source": [ "## Time to solution\n", "\n", "アニーリングアルゴリズムはどの計算時間でも何かしらの近似解を出すことができます。しかしいくら計算が速くても、誤った解が求まるようでは意味がありません。そこで(例えば90%の確率で最適解が得られるのにかかる時間、のように)自分が必要な確率で最適解が算出されるまでにかかる計算時間を指標とします。\n", "\n", "\"1-Introduction\"でも行なったようにアニーリングアルゴリズムは複数回行った中から最適解を探すため、計算時間を評価するには複数回行うことも考慮に入れる必要があります。\n", "\n", "> 例えば短い計算時間$\\tau_{short}$で最適解を出す確率が低くても、その計算時間$\\tau_{short}$で複数回アニーリングをした方が、より長い計算時間$\\tau_{long}$を1回行うよりも計算時間が短くて済むかもしれません。\n", "> なので計算時間を考慮するには単純にアニーリング時間を比較するだけでは不十分なことがあります。\n", "\n", "複数回アニーリングを行うことも考慮に入れて、上述の計算時間を算出したものを**Time to solution(TTS)**と呼びます。TTSは以下のように簡単に導くことができます。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "kqwBOHdVBDP9" }, "source": [ "1回のアニーリング時間を$\\tau$とし、1回のアニーリングで最適解が算出される確率を$p_s(\\tau)$としましょう。この$p_s(\\tau)$が、アルゴリズムの評価に用いられる成功確率です。これらの定義から、1回のアニーリングで最適解が算出されない失敗確率は\n", "\n", "$$1-p_s(\\tau)$$\n", "\n", "となります。これを$R$回繰り返してみましょう。すると、この$R$回全てで最適解が算出されない確率は\n", "\n", "$$\\{ 1-p_s(\\tau) \\}^R$$\n", "\n", "です。よって$R$回のうち1回でも最適解を得る確率$p_R$は以下のように求まります。\n", "\n", "$$p_R = 1-\\{ 1-p_s(\\tau)\\}^R$$\n", "\n", "この式を$R$について解きましょう。すると\n", "\n", "$$R = \\frac{\\ln(1-p_R)}{\\ln\\{1-p_s(\\tau)\\}}$$\n", "\n", "となります。これに1回の計算時間$\\tau$をかけると総計算時間となります。これがTime to solution (TTS, 解を得るまでにかかる計算時間)です。\n", "\n", "$${\\rm TTS}(\\tau, p_R) = \\tau R = \\tau \\frac{\\ln(1-p_R)}{\\ln\\{1-p_s(\\tau)\\}}$$\n", "\n", "${\\rm TTS}(\\tau, p_R)$は一回のアニーリングに$\\tau$の計算時間、確率$p_s(\\tau)$のアルゴリズムを用いて最適解が得られるとき、確率$p_R$で最適解が得られるまでの繰り返し回数も考慮した総計算時間になります。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "UH5K7TpfBDP-" }, "source": [ "実際の計算の評価では$p_R$を定数で与えます。研究などによく用いられる値としては、$p_R=0.99$が多いです。そして様々なアニーリング時間$\\tau$で$p_s(\\tau)$を計算し、それらを用いて${\\rm TTS}(\\tau, p_R)$を計算します。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Y_aOax-OBDP_" }, "source": [ "### OpenJij で実験を行ってTTSを測る\n", "\n", "実際にOpenJijを使ってTTSを図ってみましょう。 \n", "以下では1次元反強磁性Ising modelを考えます。これは以下のハミルトニアンで表現される物理モデルです。\n", "\n", "$$H(\\{\\sigma_i\\}) = \\sum_{i=0}^{N-1} J_{i, i+1}\\sigma_i \\sigma_{i+1} + \\sum_{i=0}^{N-1} h_i \\sigma_i$$\n", "\n", "ここでは$J_{ij} \\in [0.1, 1.0]$、$h_0 = -1$で他の縦磁場は0を考えます。$J_{ij} > 0$(反強磁性)より、各スピンは異なる向きを向くとエネルギーが下がります。よって最適解となる$\\{\\sigma_i\\}$は$1, -1, 1, -1, \\cdots$ のように、値が交互になります。また$h_0=-1$より、0番目のスピンは$\\sigma_0 =1$になります。よって最適解は$1, -1, 1, -1, \\cdots$となります。\n", "\n", "つまり「この問題のTTSを求めよ」という問題は、$1, -1, 1, \\cdots$を得るためにかかる総計算時間となります。 \n", "上述のIsing modelを解き、1回の計算時間を伸ばすとTTSがどのように変化するかを見てみましょう。" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# OpenJijをimportします。\n", "import openjij as oj " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# 反強磁性1次元Ising modelを作ります。\n", "N = 30\n", "h = {0: -10}\n", "J = {(i, i+1): 1 for i in range(N-1)}" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "63j1bHf1BDQR" }, "source": [ "## TTSを計算してみる\n", "\n", "openjijの`sample_ising`または`sample_qubo`から返ってくる Response クラスは`info`というメンバ変数を持っています。`info`にはsamplerごとに異なる情報が辞書型で格納されています。ほとんどのSamplerには`'execution_time'`というkeyで、各アルゴリズムの1回の実行時間(単位は$\\mu$ s)が格納されています。 \n", "SASamplerの場合はSimulated Annealingの1回あたりの計算時間を格納しています。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# 最適解を作成します。\n", "correct_state = [(-1)**i for i in range(N)]\n", "# 最適値を計算しておきます。\n", "bqm = oj.BinaryQuadraticModel.from_ising(h, J)\n", "minimum_energy = bqm.energy(correct_state)\n", "\n", "# TTS を計算するのに必要なpRを定義します。\n", "pR = 0.99\n", "\n", "# Samplerの引数の というパラメータに渡すリスト: num_sweeps_listを定義します。 \n", "# num_sweepsはアニーリング中のパラメータ(温度, 横磁場)を下げていくときの分割数です。\n", "# よって増やすほどゆっくりアニーリングをすることに相当し、アニーリング時間が伸びます。\n", "num_sweeps_list = [30, 50, 80, 100, 150, 200]\n", "\n", "TTS_list = [] # 各計算時間に対するTTSを格納しておくリストを定義します。\n", "tau_list = [] # 計算時間を格納しておくリストを定義します。\n", "e_mean_list = [] # エネルギーの平均値\n", "e_min_list = [] # 最小エネルギー\n", "\n", "# 計算の過程で成功確率が求まるので、それを格納しておくリストも定義します。\n", "ps_list = []\n", "\n", "# 確率を計算するために1回のアニーリングを行う回数を定義します。\n", "num_reads = 1000\n", "\n", "for num_sweeps in num_sweeps_list:\n", " sampler = oj.SASampler(num_sweeps=num_sweeps, num_reads=num_reads) \n", " response = sampler.sample_ising(h, J)\n", "\n", " # 計算結果のうち、最適解の数を数えて最適解を得た確率を計算します。\n", " tau = response.info['execution_time']\n", " \n", " # psを計算します。最適値以下のエネルギーの個数をカウントします。\n", " energies = response.energies\n", " ps = len(energies[energies <= minimum_energy])/num_reads\n", " \n", " \n", " # ps = 0のときTTSが無限大に発散してしまうため、それを回避します。\n", " if ps == 0.0:\n", " continue\n", " \n", " # TTSを計算します。\n", " TTS_list.append(np.log(1-pR)/np.log(1-ps)*tau if ps < pR else tau)\n", " tau_list.append(tau)\n", "\n", " # 成功確率を計算します。\n", " ps_list.append(ps)\n", " \n", " e_mean_list.append(np.mean(energies))\n", " e_min_list.append(np.min(energies))" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 各種描画の設定を行います。\n", "fig, (axL, axR) = plt.subplots(ncols=2, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "fontsize = 10\n", "\n", "# TTSを描画します。\n", "axL.plot(tau_list, TTS_list, '-o')\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "# 成功確率psを描画します。\n", "axR.plot(tau_list, ps_list, '-o')\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "このようにして、TTSと成功確率を計算することができます。上の2つの図は両方とも、横軸が1回のアニーリングにかかる計算時間となっています。 アニーリング時間が増加するとTTSも増加する傾向にあります。必要な成功確率が補償できた時点でアニーリングをやめたいときの指標として、これらを有効に使っていきましょう。\n", "\n", "TTSを縦軸に横軸にannealing time を取った図において、最小のTTSが検証したインスタンスに対するアニーリングアルゴリズムの最良な計算時間となります。\n", "\n", "この最小のTTSがアルゴリズムの計算時間としてよく用いられる指標になります。またどれくらいの近似比つまり、コストを下げられたかを評価指標として用いることもあります。物理では残留エネルギーという最適値からの差分の平均値が使われることもあります。\n", "\n", "近似比\n", "$$\n", "R = \\langle E \\rangle / E_{\\min}\n", "$$\n", "\n", "残留エネルギー\n", "$$\n", "E_{\\text{res}} = \\langle E \\rangle - E_{\\min}\n", "$$\n", "物理ではコスト値が変数の数$N$に比例する問題を扱うことが多いので$(\\langle E \\rangle - E_{\\min})/N$のようにサイズで規格化したり、\n", "最適値で$(\\langle E \\rangle - E_{\\min})/|E_{\\min}|$のように規格化することもあります。\n", "\n", "アニーリングアルゴリズムは最適解への漸近的な収束性が存在するアルゴリズムなので、ほとんどの場合はアニーリング時間を長くすれば、この残留エネルギーが小さくなっていきます。残留エネルギー vs アニーリング時間をプロットすることで、アニーリングアルゴリズムがうまく動いていることを確認できます。上記のOpenJijのテストでエネルギーの平均値を保存していたので、その結果をプロットしてみましょう。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(tau_list, (np.array(e_mean_list) - minimum_energy)/np.abs(minimum_energy), '-o', label='mean')\n", "plt.plot(tau_list, (np.array(e_min_list) - minimum_energy)/np.abs(minimum_energy), '-o', label='lowest')\n", "plt.xlabel('annealing time', fontsize=fontsize)\n", "plt.ylabel('Residual energy', fontsize=fontsize)\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "しっかりアニーリング時間が伸びるごとに平均残留エネルギーが下がっていることがわかります。先ほどは成功確率からTTSなどを計算しましたが、なかなか問題が難しく、最適解が得られない場合にちゃんとアニーリングがうまくいっているかを図る指標としても残留エネルギーは有効です。\n", "また残留エネルギーは得られたエネルギー値を最適値でシフトしているだけなので、最適値を知らない場合でも、エネルギー vs アニーリング時間というプロットは有効です。ちゃんとアニーリングが動いているのか?最適値がわからない場合でのアルゴリズムの比較などを行う際に使うことができます。" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "ekqnlWy_BDQY" }, "source": [ "ここまでは原理を確認するためにスクリプトを作成しましたが、OpenJijにはデフォルトでTTS, 残留エネルギー, 成功確率を評価してくれるベンチマーク関数`openjij.solver_benchmark`が存在します。 \n", "\n", "## solver_benchmark関数\n", "\n", "上述の通り、solver_benchmark関数はTTS, 残留エネルギー, 成功確率を計算し、その値を返します。\n", "\n", "以下に引数を列挙します。\n", "\n", "- solver: function \n", " `Response`クラスを返す関数です。`time`と`num_reads`という引数を持つ必要があります。\n", " `time`は計算時間を制御するパラメータです。`SASampler`の場合は`num_sweeps`に相当します。\n", " `num_reads`はTTSや残留エネルギーなどを計算するときに必要なサンプリング回数を指定します。\n", " また関数の戻り値の`Response.info`には、`time_name`という引数で指定する文字列をキーワードで持ち、`time_name`に紐づく値は1回あたりの計算時間が格納されている必要があります。\n", "- time_list: list \n", " solverの`time`引数に入れる値のリストです。\n", "- solutions: list(list: state) \n", " 基底状態(最適解)となる状態のリストです。縮退(同じ状態が複数あり見分けがつかない状態)している場合は[state1, state2]のように、複数の状態を入れます。\n", "- args: dict\n", " solverにオプションで必要な場合につけます。デフォルトでは`args = {}`です。\n", "- p_r: 0 < float <= 1 \n", " TTSを計算するために必要な値です。上述のTTSの説明のp_Rに相当します。\n", "- ref_energy: float \n", " 参照エネルギーです。次のmeasure_with_energyと合わせて用います。デフォルトでは`ref_energy = 0`です。\n", "- measure_with_energy: bool \n", " False: スピンの状態が基底状態と一致しているとき、成功とカウントします。 \n", " True: エネルギーが先ほどのref_energy以下のとき、成功とカウントします。基底状態がわからない場合に用います。 \n", " デフォルトではFalseです。\n", "- time_name: str \n", " `Response.info`に入っている実行時間と紐づくキーを指定します。デフォルトでは`'execution_time'`です。\n", " \n", "返り値はbenchmark計算の結果が以下のように辞書型で格納されています。\n", "\n", "- time: 実行時間のリストです。\n", "- success_prob: 成功確率のリストです。\n", "- tts: TTSのリストです。\n", "- residual_energy: 残留エネルギーのリストです。\n", "- info: (dict) ベンチマーク関数のパラメータ情報です。\n", "\n", "次は、このベンチマーク関数を用いてTTSなどを計算してみましょう。" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": {}, "colab_type": "code", "id": "UsT_OrHpBDQZ", "scrolled": true }, "outputs": [], "source": [ "# 最適解を定義します。\n", "correct_state = [(-1)**i for i in range(N)]\n", "\n", "# num_sweepsとnum_readsの反復数を与えます。\n", "num_sweeps_list = list(range(10, 51, 10)) # [10, 20, 30, 40, 50]\n", "num_reads = 100\n", "\n", "# benchmark関数を用いてTTS, 残留エネルギー, 成功確率を計算します。\n", "result = oj.solver_benchmark(\n", " solver=lambda time, **args: oj.SASampler(num_sweeps=time, num_reads=num_reads).sample_ising(h,J), \n", " time_list=num_sweeps_list, solutions=[correct_state], p_r=0.99\n", " )" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 245 }, "colab_type": "code", "id": "cZ1cs-g1BDQc", "outputId": "faf086d7-83b4-48e8-f75a-d2eefbac563d" }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# 各種描画を行うための設定を行います。\n", "fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "fontsize = 10\n", "\n", "# TTSを描画します。\n", "axL.plot(result['time'], result['tts'])\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "# 残留エネルギーを描画します。\n", "axC.plot(result['time'], result['residual_energy'])\n", "axC.set_xlabel('annealing time', fontsize=fontsize)\n", "axC.set_ylabel('Residual energy', fontsize=fontsize)\n", "\n", "# 最適解が出現した確率を描画します。\n", "axR.plot(result['time'], result['success_prob'])\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "F1MP6xatBDQf" }, "source": [ "このようにして簡単にベンチマークをとることができます。 \n", "\n", "先ほどと同じ反強磁性1次元Ising modelを解いているため、TTSと成功確率は先ほどと同様の単調増加グラフが出力されていることがわかります(ヒューリスティックスな解法なので、厳密な計算結果は毎回変わります)。\n", "\n", "残留エネルギーについてもアニーリング時間を増加させて計算すれば、いつかは収束することが予想されます。\n", "\n", "`solver`に入れる関数は`Response`クラスを返して、`.info['execution_time']`に計算時間を格納しておけばどのような自作関数を代入しても構いません。 \n", "\n", "以下に適当なユーザ関数を作成して実行する例を示します。[1, 1, 1, 1,...]と[1, -1, 1, -1,...]と[-1, 1, -1, 1,...]の3つのスピン状態からランダムに一つの状態を返す関数を作成し、アニーリングアルゴリズムのベンチマークを取ってみましょう。最適解は[1, -1, 1, -1,...]とします。" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": {}, "colab_type": "code", "id": "QDHCChaRBDQg" }, "outputs": [], "source": [ "import time \n", "\n", "def anti_ferro_solver(time_param, num_reads, h, J):\n", "# \"\"\"\n", "# [1, 1, 1,...]と[1,-1,1,...]と[-1,1,-1,...]の3つの状態からランダムに選ぶ関数です。\n", "# \"\"\"\n", " \n", " # 入力された h と J から添字の集合を作成します。\n", " indices = set(h.keys())\n", " indices = list(indices | set([key for keys in J.keys() for key in keys]))\n", " \n", " # [1, 1, 1,...]の状態を作成します。\n", " ones_state = list(np.ones(len(indices), dtype=int))\n", " \n", " # [-1, 1, -1,...]の状態を作成します。\n", " minus_plus_state = np.ones(len(indices), dtype=int)\n", " minus_plus_state[::2] *= -1\n", " # [1, -1, 1,...]の状態を作成します。\n", " plus_minus_state = -1 * minus_plus_state\n", " \n", " # 実行時間を計測を開始します。\n", " start = time.time()\n", " _states = [ones_state, list(minus_plus_state), list(plus_minus_state)]\n", " \n", " # 3つの状態からランダムに1つの状態を選出します。\n", " state_record = [_states[np.random.randint(3)] for _ in range(num_reads)]\n", " # state_recordをndarrayに変換します。\n", " state_record = np.array(state_record)\n", " \n", " # ここでは適当に計算時間をかさ増しします。\n", " exec_time = (time.time()-start) * 10**6 * time_param\n", " # ここでは適当にエネルギーを計算します。\n", " energies = [sum(state) for state in state_record]\n", " \n", " # 状態のリストと添字を紐づけるために、1つのタプルにします。\n", " samples_like = (state_record, indices)\n", " \n", " # dimodのfrom_samplesを参考に、Responseクラスに状態とエネルギーを格納します。\n", " response = oj.Response.from_samples(samples_like=samples_like, energy=energies, vartype='SPIN')\n", " # response.infoの'execution_time'キーに計算時間を代入します。\n", " response.info['execution_time'] = exec_time\n", " \n", " return response" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "OpenJijのresponseはdimodのSampleSetを参考にして作られています。\n", "そのため、OpenJijに慣れておけばdimodの利用やD-Wave実行への移行も容易になるというメリットがあります。\n", "dimodのSampleSetの詳細については以下のdimodのSamplesページをご覧ください。 \n", "[Samples](https://docs.ocean.dwavesys.com/projects/dimod/en/latest/reference/sampleset.html)" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": {}, "colab_type": "code", "id": "lO8DpCkyBDQk" }, "outputs": [], "source": [ "# 最適解である[1, -1, 1,...]を定義しておきます。\n", "correct_state = [(-1)**i for i in range(N)]\n", "\n", "# num_sweepsとnum_readsを定義しておきます。\n", "num_sweeps_list = list(range(10, 51, 10))\n", "num_reads = 2000\n", "\n", "# benchmark関数でTTS, 残留エネルギー, 成功確率を計算します。\n", "result = oj.solver_benchmark(\n", " solver= lambda time_param, **args: anti_ferro_solver(time_param, num_reads, h, J), \n", " time_list=num_sweeps_list, solutions=[correct_state], p_r=0.99\n", " )" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 245 }, "colab_type": "code", "id": "v8feULpDBDQo", "outputId": "6a4eb208-1795-4aec-ed26-bde92d9c928c", "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Success probability')" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "fig, (axL,axC,axR) = plt.subplots(ncols=3, figsize=(15,3))\n", "plt.subplots_adjust(wspace=0.4)\n", "\n", "fontsize = 10\n", "axL.plot(result['time'], result['tts'])\n", "axL.set_xlabel('annealing time', fontsize=fontsize)\n", "axL.set_ylabel('TTS', fontsize=fontsize)\n", "\n", "axC.plot(result['time'], result['residual_energy'])\n", "axC.set_xlabel('annealing time', fontsize=fontsize)\n", "axC.set_ylabel('Residual energy', fontsize=fontsize)\n", "\n", "axR.plot(result['time'], result['success_prob'])\n", "axR.set_xlabel('annealing time', fontsize=fontsize)\n", "axR.set_ylabel('Success probability', fontsize=fontsize)" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "c3T8GiiSBDQr" }, "source": [ "3つの状態からランダムにひとつ1つ最適解の状態を選んでいるので、成功確率はおよそ1/3くらいになるはずです。 \n", "上の成功確率の図も縦軸がその程度の数値になっています。\n", "\n", "このようにうまくsolver関数を作っておけば、OpenJijのソルバーに限らずTTS, 残留エネルギー, 成功確率を計算することが可能です。 " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "次のページでは、この章で紹介した指標の標準誤差を計算する機能をご紹介します。" ] } ], "metadata": { "colab": { "collapsed_sections": [], "include_colab_link": true, "name": "2_Evaluation_ver008.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.3" } }, "nbformat": 4, "nbformat_minor": 1 }