イジング計算機用のqubo(Ising)モデル定式化には,sympyやpyqubo,amplifyが存在する。実行速度やライブラリの更新頻度からamplifyが一番よさそう。
備忘録としてまとめておく。
(公式ドキュメント https://amplify.fixstars.com/ja/docs/amplify/v0/index.html)
v0とv1があり異なる部分があるようだが、v1は執筆途中なのか未記載の部分が多い為v0を参考にしている。
ここではTSPの定式化を例に。
0. amplifyのインストール
condaにはなさそうなのでpipでインストール。python3.8~3.12まで対応しているらしい。
pip install amplify
1. 変数を作成
SymbolGeneratorで変数を作成。配列の次元数は自由に選べる。
gen = SymbolGenerator(BinaryPoly) # 変数変数ジェネレータを定義
qubo_symbols = gen.array(city_num,city_num) # 長さが都市数の2乗である Binary 配列を生成
qubo_symbolsの各要素にはqubo変数が格納されている。
2. 目的関数を作成
1.で作成したqubo_symbolsを使用して目的関数を記述する。
H_obj = 0
for t in range(city_num-1):
for j in range(city_num):
for i in range(city_num):
if i == j:
continue
H_obj += Intercity_Distances[i][j] * qubo_symbols[t][i] * qubo_symbols[t+1][j]
for j in range(city_num):
for i in range(city_num):
if i == j:
continue
H_obj += Intercity_Distances[i][j] * qubo_symbols[city_num-1][i] * qubo_symbols[0][j]
式として記述するため0で初期化
3. 制約条件を作成
H_const = 0
for i in range(city_num):
temp = -1
for j in range(city_num):
temp += qubo_symbols[i][j]
H_const += temp**2
for i in range(city_num):
temp = -1
for j in range(city_num):
temp += qubo_symbols[j][i]
H_const += temp**2
4. 二次多項式模型を作成
quboを用いるので、BinaryQuadraticModelを選択。
model = BinaryQuadraticModel(H_obj + H_const)
これをnumpy形式で表示したりファイル出力したい場合、
model.logical_matrix
を使用する。
tuple形式で[0]にJhが、[1]にCが格納されている。
amplify標準の出力形式は
amplify.save_qplib
で利用できる。
5. 余談:lpファイル出力
目的関数や制約条件を多項式で出力できる。
その場合、制約条件はconstraintsクラスで記述する必要がある。
lpファイルを作成しておくことで、制約条件のチェック用プログラムを問題ごとに作成しなくてよいという嬉しさがある。
時間があるときに追記します