「入力データの作成」の章で作成した数分割問題のデータをCMOSアニーリングマシンに入力して解いてみましょう。簡単のため、CMOSアニーリングマシンの4つのスピンを使ってCMOSアニーリングマシンで実行する過程を説明します。
数分割問題を定式化の工程においてイジングモデルとしてとらえたところ、スピンに該当する要素、つまり1つ1つの数をまんべんなく掛け合わせたものが相互作用となっています。すべてのスピン間に相互作用があるイジングモデルは、全結合のイジングモデルと言います。当サイトのCMOSアニーリングマシンは、King’s graphで疎結合です。数分割問題は定式化の過程で全結合であることがわかりましたが、King’s graphにも4つの数を分割する問題ならば入力することができます。
ここまでは理論の学習でしたが、ここからはCMOSアニーリングマシンを操作する必要がありますので、最初に簡単に開発環境の準備について説明をいれます。CMOSアニーリングマシンからはWEB API(Application Programming Interface)でCMOSアニーリングマシンを操作することができます。手順としては以下の通りです。
CMOSアニーリングにアクセスするには、Web-APIを使います。ご自身の使いやすい環境があればそれを使ってください。ここでは、その1例として、Windows-PCでJupyter Notebookを使う方法を紹介します。
こちらから最新バージョンをダウンロードしましょう。自分のPCのスペックに合うものを選択してください。
Jupyter Notebookはブラウザ上で起動する対話型のプログラミング実行環境です。ここではごくシンプルな機能しか使わないので、Jupyter Notebook 公式サイト等を参考にしてpipによるインストールを行ってください。
Jupyter Notebookの起動はコマンドプロンプトから”Jupyter Notebook”で起動
終了時はコマンドプロンプト上でCtrl + Cにより終了します。
無事Jupyter Notebookを起動できるようになったら演習を進めていきましょう。
CMOSアニーリングにアクセスするには、Web-APIで使うAPIトークンを取得する必要があります。下記のページからトークン発⾏を依頼してみましょう。アンケートも忘れずに記⼊してください。
https://annealing-cloud.com/ja/web-api/token-request.html
さてさっそく入力データを作成してみましょう。まず、$S=\{13, 9, 8, 5\}$という集合が与えられていたとします。これを2グループに分割するので、最適解は$S_A=\{13, 5\}$、また $S_B = \{9, 8\}$となるのが分かっています。うまくCMOSアニーリングで分けることができるでしょうか。
要素に番号をつけます。
a1 | a2 | a3 | a4 |
13 | 9 | 8 | 5 |
そして相互作用をリストアップします。
すべてリストアップできましたね。
さて、CMOSアニーリングマシンにこれを入力していきます。やり方としてはCMOSアニーリングマシンのイジングモデルはKing’s graphつまり格子状であるため$x$座標、$y$座標上の並んだスピンとして表現します。Annealing Cloud WebのCMOSアニーリングマシンのスペックは、GPU版で$512\times512=256,000$個のスピン、ASIC版で$384\times384=147,456$個のスピンを入力できるサイズです。そのうち4個のスピンが互いに相互作用するためにはこのように配置します。また、入力上簡単なのは0軸と1軸にセットするように記述するのが早いでしょう。
たとえば$(0,0)$のスピンと相互作用しているスピンは$(1,0)$や$(0,1)$など、隣にあるとして記述していきます。CMOSアニーリングマシンに入力する際、隣接していないとエラーとなります。
上の図では、数の要素を$a_1~a_4$ではなく、$\sigma_1~\sigma_4$として表現しています。これは、数の要素をイジングモデル上のスピンとしてアニーリングマシンに配置したことを意図しているためです。
CMOSアニーリングマシンでは相互作用をこのように表します。
以下がJSONの記述です。
coefficients = [ [0, 0, 0, 1, 117], [0, 0, 1, 0, 104], [0, 0, 1, 1, 65], [0, 1, 1, 0, 72], [0, 1, 1, 1, 45], [1, 0, 1, 1, 40], ]
標準のパラメータで作成してみます。パラメータと言っているのは、温度スケジュールを指定する数値であり「初期温度」「最終温度」「ステップ長」「ステップ数」により指定できます。詳しい説明はイジングエディタのチュートリアルで学習してください。
ここではひとまずAPIリファレンスと同じパラメータを使って実行します。
Annealing Cloud Webでは現在2タイプのマシンを選ぶことができます。今回は、大きい相互作用を使用できる、GPU版を使います。typeは3です。
これらを設定して、Pythonで実行するデータを下記のように作ってみました。このinput_dataという変数に入力データが設定されています。
# parameters num_executions = 5 temperature_initial = 30 temperature_target = 0.0000001 machine_type = 3 input_data = { "num_executions": num_executions, "model": coefficients, "type": machine_type, "parameters": { "temperature_initial": temperature_initial, "temperature_target": temperature_target, }, }
実行するための設定は下記のとおりです。XXXX…には、取得したAPIトークンを設定してください。
import requests import json # API token token = "XXXXXXXXXXXXXXXXXXX" headers = {'Authorization': 'Bearer {}'.format(token)} # CMOSアニーリングマシン address CMOSannealing_url = 'https://annealing-cloud.com/api/v2/solve'
ここまで準備出来ればあとは実行です。下記のように実行してみましょう。
r = requests.post(CMOSannealing_url, headers=headers, json=input_data) result_sigma = r.json() print (json.dumps(result_sigma))
実行すると下記の結果が返ってくると思います。CMOSアニーリングの特徴として、乱数を用いているため、必ずしも同じ答えではないと思いますが、形式等は下記の感じとなっているかと思います。
{ "status": 0, "result": { "energies": [-169.0, -169.0, -169.0, -169.0, -169.0 ], "execution_time": 278175600, "spins": [ [[0, 0, -1], [1, 0, 1], [0, 1, 1], [1, 1, -1]], [[0, 0, 1], [1, 0, -1], [0, 1, -1], [1, 1, 1]], [[0, 0, 1], [1, 0, -1], [0, 1, -1], [1, 1, 1]], [[0, 0, -1], [1, 0, 1], [0, 1, 1], [1, 1, -1]], [[0, 0, -1], [1, 0, 1], [0, 1, 1], [1, 1, -1]] ], "job_id": "95c834c3-7d8a-4c32-8560-fd4d6fdddfb2" }
Web APIの「レスポンス」も参照しながら結果を確認してください。
最初にenergyが表示されています。5回アニーリングを実行していますが、すべて$H=-169$になったということになります。実行時間はnsecです。上記結果では0.27秒位で解けたことがわかります。エラーメッセージもなく成功です。
求めていた最適解はspinsを見ます。1つ目の解が$[[0, 0, -1], [1, 0, 1], [0, 1, 1], [1, 1, -1]]$です。イジングモデルの頂点に割り当てた数字の要素をもう一度見ながら確認します。
$1$に割り振られた$\sigma_2$と$\sigma_3$が同じグループ、$-1$に割り振られた$\sigma_1$と$\sigma_4$が同じグループという解であるのがわかります。合計が前者は$17$で後者は$18$ですから、想定していた通りの解になりました。
ではコスト関数に当てはめてみるとどうなるでしょう。
$H = -169$であり、CMOSアニーリングマシンが求めたエネルギーであることがわかりますね。
このように、簡単な4要素の数分割問題でCMOSアニーリングマシンの使い方を知ることができました。
5回のアニーリングで導かれた他の解についてもどうなっているか確認してみましょう。
また、分割する数字を変えて結果が変わるかも実験してみましょう。その際に、数が大きくない場合には、ASIC版のCMOSアニーリングマシンが使えるかもしれません。場合によっては、実行するマシンも変えてみましょう。
記事が役に立ちましたか?他の人に共有してみてください。