やること
前回、 「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回とも大域解を発見しました!ええ!?!?
おわりに
もう少し試しながら改良する予定です。