challenges.quantum-computing.ibm.com
10月27日 ~ 11月06日の間に開催されて、量子コンピュータライブラリであるQiskitを使った4つのチャレンジにパスするとバッジがもらえるよ(何のバッジだ)、というハンズオンチャレンジでした。
バッジを貰える14問はクリアできましたが、最後のchallenge4-cはクリアできなかったです。
今はCloseされたので、解法や感想を書こうと思います。といっても書くこと少ないのですが。
基本的にわからないことがあればQiskitのSlack(https://ibm.co/joinqiskitslack)に質問すれば誰かが答えてくれます。また、よくある質問や詰まるところのヒントもSlack内で検索すれば出てくるので、そういうのを駆使して問題を解いていきました。
このChallengeはあともう少しくらいは公開するらしく(バッジやスコアには反映されない)、それを過ぎたら削除される予定らしいので、やりたい方は早めに。やった方はバックアップ推奨。
私の提出コードはここにあります。
Challenge 1 Qiskit Finance - Optimizing your portfolio with quantum computers
金融においてはリスクを最小化しリターンを最大化することが大事で、そんなポートフォリオを作ることはポートフォリオ最適化問題と呼ばれています。それをQiskitを使って量子コンピュータで問題を解こうというチャレンジでした。
金融のこと何もわからないですが、書いてあるとおりに書き下していくと問題にパスできます。ライブラリの使い方を調べるゲームでした。
Challenge 2 Qiskit Nature - Band gap calculation of OLED molecules
有機EL分子のエネルギーバンドギャップの計算?
とたんに化学の知識を要求されるようで精神的にきつかったです。実際は書いてあるとおりにやって参考ビデオや文献を読めばやるべきことが見えてくるので、原子軌道がなんなのかとかは理解せずともクリアできます。
とはいえ唐突に出てきた分子軌道の計算はさっぱりだったので、適当にYouTubeで「分子軌道」と検索して出てきた動画(https://youtu.be/ZICW_IJRk4o?t=44)によると分子軌道=原子軌道ということが判明したのでこれでどうじゃい、をするとACしました。
あとはライブラリの使い方を調べて引数にこれとこれを与えたらこれが返ってくるので……をひたすらします。
ライブラリの使い方を検索したら古いバージョンのが最初に引っかかったりとしたので苦戦しました。
そういう試行錯誤をするゲームでした。
hallenge 3 Qiskit Machine Learning - Image classification by QSVM
量子機械学習による画像分類
Quantum SVMを体験しようというチャレンジです。
- まず量子特徴マップ(FeatureMap)を作成し、それから量子カーネル(Quantum Kernel)を生成する
- 量子カーネルを量子カーネル行列に変換する
- すると量子カーネル行列をSVMに利用できるようになる
という感じのことをします。
ここのChallenge 3cが難関で、N_DIM
やreps
を単に大きくすればスコアが増えるわけではないので注意。ZZFeatureMap
を使って試行錯誤でクリアしました。
Challenge 4 Qiskit Optimization - Battery Revenue Optimization
電池による収益の最適化
組合せ最適化をQAOAで解こうというチャレンジです。というかナップサック問題をQAOAで解こうというものです。
ナップサック問題は競技プログラミング頻出なので、競プロやっててよかったと思いました。競技プログラミングはIBM Quantum Challenge Fall 2021の役に立つ。
古典的な解法では、
# dp[i][C] := i日目のときの、C_max以内のコストでの、収益の合計の最大値 dp = [[0 for _ in range(C_max+1)] for __ in range(8)] for i in range(1, 8): for c in range(0, C_max+1): dp[i][c] = dp[i-1][c] # 市場M1を選んだ場合 if c-C1[i-1] >= 0: dp[i][c] = max(dp[i][c], dp[i-1][c-C1[i-1]]+L1[i-1]) # 市場M2を選んだ場合 if c-C2[i-1] >= 0: dp[i][c] = max(dp[i][c], dp[i-1][c-C2[i-1]]+L2[i-1]) print(dp[7][C_max])
程度のナップサック問題です。とはいえ古典的なナップサック問題の解法を書くわけでなく、QiskitのライブラリKnapsak
で使える形式に問題を変形せよ、という問題でした。
参考文献の[2]にあるhttps://arxiv.org/pdf/1908.02210.pdfのペーパーの1.2節と1.3節を読めば大体わかります。
配列の長さt = 7 市場M1の収益L1 = [5,3,3,6,9,7,1] 市場M2の収益L2 = [8,4,5,12,10,11,2] 市場M1のコストC1 = [1,1,2,1,1,1,2] 市場M2のコストC2 = [3,2,3,2,4,3,3] コストはC_max = 16 以下になるようにする
という2つの市場からうまく選んで収益を最大化するナップサック問題は、
newL = [L2[i]-L1[i] for i in range(len(L2))] newC = [C2[i]-C1[i] for i in range(len(C2))] newC_max = C_max - sum(C1)
という風に1次元に変換できる、というのが問題の主題です。
つまらないTypoで小一時間詰まりましたが、なんとかACできました。
Challenge 4cは49名の人がパスしたそうです。すごい!私は時間が足りずに無理でした。
バッジ
Credlyというサイトでバッジがもらえました。Credlyを知らなかったのですが、これはオフィシャルバッジを作成・管理・配布するためのバッジプラットフォームらしいです。へぁ~ニッチ産業。と私は思いました。
まとめ
最大の敵はIBM Quantum LabのKernelフリーズでした。なんか全然パスできないと思っても、Kernelを再起動したらパスしたということがありました。
全体を通した学びとしては量子機械学習のお気持ちだけわかったかなといった感じです。
量子コンピュータは各Big Tech、スタートアップが力を入れて開発していますが、実用的なレベルにはまだまだ時間がかかりそうという話もよく聞きます。三体読んで夢が広がっているので、生きているうちに量子コンピュータで制御された恒星間航行用宇宙機器を作ってみたいものです。
以上。