QAOAとQUBO化について
1. QUBOとは?
定義
QUBO(Quadratic Unconstrained Binary Optimization)は以下のような最適化問題:
minimize: xᵀ Q x
- 
x: 0または1からなるバイナリ変数ベクトル(各要素は 0 または 1)(例:x = [0,1,1,0,...])
- 
Q: 係数が入った正方行列(n×n)
目的:
Qの中の係数に従って、xの組み合わせ(すべて0と1)で最小値となるものを探すこと。
- QAOAとは?(Quantum Approximate Optimization Algorithm)
 QAOAは、量子コンピュータ上で組合せ最適化問題を近似的に解くアルゴリズム。
 ハーバード大学のFarhiや、Gutmann等によって提案された。
概要:
QAOAは次のように動きます:
QUBOやMaxCutなどをIsingモデルに変換
Hamiltonian(H_C)とミキサーHamiltonian(H_M)を用意
両者を交互にパラメータ付きで適用して量子状態を作る
パラメータ(γ, β)を古典コンピュータで最適化
最終状態を測定して、最も良い解(x)を得る
QUBOとQAOAの関係
QUBOはQAOAに与える入力形式の一つです。
QAOAで使うには、以下のようなステップが必要:
変換の流れ
組合せ最適化問題
 ↓
QUBO形式にする(またはIsingモデルに変換)
 ↓
QUBO → Isingモデル(スピン形式)
 ↓
QAOAで解く
QUBOとIsingモデルの変換
QUBOは0-1変数を使うが、Isingモデルは±1(スピン)を使用:
QUBO変数 x ∈ {0,1} を Ising変数 s ∈ {-1, +1} に変換
x = (1 + s) / 2
この変換によって、QUBOを量子コンピュータが扱える形式(Hamiltonian)に変換できる。
具体例:MaxCut問題
問題:グラフのノードを2つのグループに分け、切られるエッジの数を最大化する。
QUBO形式に変換:
ノードiとjが同じグループにあるとき:
x_i = x_j → エッジが切られない → 0
x_i ≠ x_j → エッジが切られる → 1
目的関数:
maximize ∑_{i,j ∈ E} x_i(1 - x_j) + x_j(1 - x_i)
→ QUBO形式に落とし込める
このQUBOをQAOAに入力し、最適なノード分割(カット)を量子コンピュータで求める。
| 用語 | 意味 | 
|---|---|
| QUBO | 0-1のバイナリ変数で記述された最適化問題。Q行列に従い目的関数を最小化。 | 
| Isingモデル | ±1のスピン変数を用いた物理モデル。QUBOと等価な形式に変換可能。 | 
| QAOA | Ising形式の最適化問題を量子回路で近似的に解くアルゴリズム。QUBO→Isingを経て使用。 | 
[組合せ問題]
  ↓ QUBO化
[QUBO: xᵀ Q x]   →   [Isingモデル: H_C]
            ↓
       [QAOA(量子回路)]
            ↓
       [最適または準最適解]
QUBO → Ising変換とQAOA回路設計
2. QUBO → Ising変換
量子アルゴリズム(特にQAOA)は スピン変数 s ∈ {-1, +1} を使うため、QUBOをIsingモデルに変換する必要がある。
変換式
x ∈ {0,1} → s ∈ {-1, +1}
x = (1 + s) / 2
✅ 変換用Pythonコード(QUBO→Ising)
import numpy as np
def qubo_to_ising(Q):
    n = Q.shape[0]
    h = np.zeros(n)
    J = np.zeros((n, n))
    offset = 0
    for i in range(n):
        for j in range(n):
            q = Q[i, j]
            if i == j:
                offset += q / 4
                h[i] += q / 4
            else:
                offset += q / 4
                h[i] += q / 4
                h[j] += q / 4
                J[i, j] += q / 4
    return h, J, offset
例:QUBO定義と変換
Q = np.array([
    [2, -2],
    [-2, 1]
])
h, J, offset = qubo_to_ising(Q)
print("h =", h)
print("J =", J)
print("offset =", offset)
- QAOA(量子近似最適化アルゴリズム)
 QAOAは、Isingモデルの最小値を量子回路で近似的に求めるアルゴリズム。
QAOAの基本ステップ(深さ p=1)
初期状態 |+⟩ を用意(各量子ビットにHゲート)
コスト演算(Z演算子をベースにした位相回転)
ミキサー演算(X演算子をベースにした回転)
測定
パラメータ β, γ を最適化
QAOA量子回路のPythonコード(Qiskit)
from qiskit import QuantumCircuit
from qiskit.circuit import Parameter
# パラメータ定義
beta = Parameter('β')
gamma = Parameter('γ')
# Isingパラメータ(例)
h = [0.25, 0.25]
J = {(0, 1): -0.5}
# QAOA回路作成
qc = QuantumCircuit(2)
qc.h([0, 1])  # 初期状態
# コストユニタリ(Z演算)
qc.rz(2 * gamma * h[0], 0)
qc.rz(2 * gamma * h[1], 1)
qc.cx(0, 1)
qc.rz(2 * gamma * J[(0, 1)], 1)
qc.cx(0, 1)
# ミキサーユニタリ(X演算)
qc.rx(2 * beta, 0)
qc.rx(2 * beta, 1)
qc.draw('mpl')
- 結果の評価(エネルギー期待値の計算)
from qiskit import Aer
from qiskit.opflow import Z, I, StateFn, CircuitStateFn
# Hamiltonian定義(Z演算子で構築)
H = h[0]*Z^I + h[1]*I^Z + J[(0,1)]*Z^Z
# パラメータを固定
param_values = {gamma: np.pi/4, beta: np.pi/8}
bound_qc = qc.bind_parameters(param_values)
# 状態とエネルギー評価
backend = Aer.get_backend('aer_simulator_statevector')
state = CircuitStateFn(bound_qc)
energy = (~state @ H @ state).eval().real
print("エネルギー期待値 =", energy)
まとめ
| 項目 | 説明 | 
|---|---|
| QUBO | 0-1変数の2次最適化問題 | 
| Isingモデル | ±1変数によるスピン物理モデル | 
| QAOA | Ising形式の目的関数を量子回路で最適化 | 
| 変換 | x = (1 + s) / 2を用いてQUBO→Ising変換 | 
| 回路構成 | 初期状態 + コスト演算 + ミキサー演算 | 
参考
Qiskit Optimization
Farhi et al. (QAOA original paper)
D-Wave QUBO/Ising変換解説



Discussion