ベスパリブ

プログラミングを主とした日記・備忘録です。ベスパ持ってないです。

IBM Quantum Challenge Fall 2021 体験記

challenges.quantum-computing.ibm.com

10月27日 ~ 11月06日の間に開催されて、量子コンピュータライブラリであるQiskitを使った4つのチャレンジにパスするとバッジがもらえるよ(何のバッジだ)、というハンズオンチャレンジでした。

バッジを貰える14問はクリアできましたが、最後のchallenge4-cはクリアできなかったです。

f:id:takeg:20211110010549p:plain
クリア時ステータス

今は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を体験しようというチャレンジです。

という感じのことをします。

ここのChallenge 3cが難関で、N_DIMrepsを単に大きくすればスコアが増えるわけではないので注意。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名の人がパスしたそうです。すごい!私は時間が足りずに無理でした。

バッジ

f:id:takeg:20211110005942p:plain
バッジ

Credlyというサイトでバッジがもらえました。Credlyを知らなかったのですが、これはオフィシャルバッジを作成・管理・配布するためのバッジプラットフォームらしいです。へぁ~ニッチ産業。と私は思いました。

まとめ

最大の敵はIBM Quantum LabのKernelフリーズでした。なんか全然パスできないと思っても、Kernelを再起動したらパスしたということがありました。

全体を通した学びとしては量子機械学習のお気持ちだけわかったかなといった感じです。

量子コンピュータは各Big Tech、スタートアップが力を入れて開発していますが、実用的なレベルにはまだまだ時間がかかりそうという話もよく聞きます。三体読んで夢が広がっているので、生きているうちに量子コンピュータで制御された恒星間航行用宇宙機器を作ってみたいものです。

以上。