4/14(日) 足・靴・木型研究会「第2回研究集会」を開催します☆彡

21-38. 【試験導入】QUBOアニーリング「TYTAN」に対ワンホット高速GPUサンプラーが追加

やること

前回、 「TYTAN」パッケージに追加された高速GPUサンプラー「ArminSampler」の性能を確認しました。

今月勉強会のときに、「ワンホット制約のある問題の解がイマイチだなぁ」という声が聞かれました。そこで対ワンホットの独自サンプラー「PieckSampler」を試験的に追加しましたので使い方と性能を確認してみましょう。GPU対応してます。(tytan==0.0.27以降)

ベンチマーク問題

前回と同じ180量子ビットの生産計画最適化問題(ジョブスケジューリング問題)を用いました。大域解は74時間(複数パターンあり)です。

この問題はワンホット制約×36式方程式コスト×5式で定式化されており、ワンホット制約のせいで従来の「SASampler」やそれを高速化した「ArminSampler(GPUモード)」の性能が十分に発揮されないのかなと思います。

実行マシン

前回と同じです。

CPU:Ryzen 5 5600G
GPU:RTX 2070(※ColabのTesla T4より性能は高い)

PieckSamplerの実行方法

「PieckSampler」は特殊なコンパイル「PieckCompile」とセットで用いる必要があります。前回はサンプリングが10秒程度で終わるようにパラメータを調整しましたが、こいつはワンホット制約が得意なためshots=1000, T_num=2000にとどめています。CPUモードもGPUモードも3~5秒程度でした。

#コンパイル
qubo, offset = PieckCompile(H).get_qubo()

#サンプラー選択
solver = sampler.PieckSampler(seed=None, mode='GPU') #'CPU', 'GPU'

#サンプリング
result = solver.run(qubo, shots=1000, T_num=2000, show=True)
------ PieckCompile ------
Extracted onehot group: 36
Extracted onehot keys: 180
--------------------------
offset=30980.0
------ PieckSampler ------
MODE: GPU
DEVICE: cuda:0
--------------------------
4.993 s
Energy=-30980.0, Occurrence=1
[[1 0 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0]
 [0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0]
 [0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 1]
 [0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0]
 [0 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0]]
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1]
機械0 タスク [ 1  6 10 14 15 28] 時間 74.0
機械1 タスク [ 3 13 27 31] 時間 74.0
機械2 タスク [ 7  8 16 22 24 35 36] 時間 74.0
機械3 タスク [ 4  9 12 18 21 25 26 33] 時間 74.0
機械4 タスク [ 2  5 11 17 19 20 23 29 30 32 34] 時間 74.0

スコア比較

前回のグラフに追加する形で、各10回実行した最良解のエネルギーをまとめました。-30980が大域解です。

PieckSamplerは10回とも大域解を発見しました!ええ!?!?

おわりに

もう少し試しながら改良する予定です。

タイトルとURLをコピーしました