要望がでましたのでざっくり説明します。
量子コンピュータを使って組合せ最適化問題を解く際には二つのコスト関数を入れ替えながら計算をします。最初に準備するコスト関数は比較的解きやすい答えのわかっているもの、最後に使うコスト関数は解きたい問題で答えがわかりづらいものを用意します。
物理学ではこのコスト関数はハミルトニアンと呼ばれていますが、この二つを用意して解くのがQAOAです。
最近の組合せ最適化問題においては、この最初の簡単に解ける方をmixer hamiltonianやdriver hamiltonianと呼んでいます。全く同じものですが、呼び方が定まっていません。
mixerはいろんな種類がありますが、一番有名なのはXmixerで西森先生で有名な量子アニーリングがこれにあたります。指定の仕方はハミルトニアンなのでコスト関数と同じように指定し、
mixer = X[0] + X[1]
のようにpauliゲートと量子ビットを指定して実行します。mixerを使うにはハミルトニアンを作るだけではだめで、それに対応した固有状態を準備する必要があります。こちらは、Xの固有状態[1,1]を用いますが、これは量子コンピュータでは重ね合わせ状態なので、Hゲートを適用すればつくれます。なので、初期状態は、
init = Circuit().h[0,1]
のように準備します。ほかの有名なミキサーにXYがあります。こちらは、
init = Circuit().h[0].cx[0,1].x[1]
mixer = (X[0]*X[1] + Y[0]*Y[1])*0.5
のように、XとYをつかった2量子ビットのミキサーで古典計算だと2-optに対応します。XYmixerの固有状態は[0,1,1,0]があるので、量子もつれを使った作っています。
このようにQAOAmixerはmixerハミルトニアンと初期状態をセットで準備して量子ツールで計算します。
hamiltonian = q(0)-3*q(1)+2*q(0)*q(1)
step = 2
init = Circuit().h[0].cx[0,1].x[1]
mixer = (X[0]*X[1] + Y[0]*Y[1])*0.5
result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step, init, mixer)).run()
print(result.most_common(4))
こんな感じで計算できます。正答率が上がります。回路の長さも長くなります。以上です。