跳转至

比较 VQE 期望能量与采样候选

用 VQE 最小化一个两自旋 Ising 模型。QAOA 交替施加代价演化和混合操作;默认 VQE 线路则使用参数化旋转和纠缠门。请先完成 QAOA 结果解释,并使用安装好的环境。

经典模型及其投影为:

E(s0,s1) = 0.1 − 0.8 s0 + 0.35 s1 + 0.6 s0 s1
s ∈ {−1,+1},s = 2x−1 = −Z
H = 0.1 I + 0.8 Z0 − 0.35 Z1 + 0.6 Z0 Z1

按 (q0,q1) 读取比特,00、01、10、11 的能量依次为 1.15、0.65、−1.65、0.25,因此 10 是这个对角算符的基态。任意归一化量子态的期望能量都不低于 −1.65,具体值由整个概率分布决定。

分开读取优化过程与最终采样

"""对带类型的双 spin Ising model 运行 VQE。

VQE 先把 model 转为 Pauli Hamiltonian,再为每个 objective point 执行 Backend Job,
使用 SciPy 优化,并单独提交 final-sampling Job。有界 baseline 只校验当前小案例。
"""

from __future__ import annotations

import json

from cascaqit import VQE, IsingModelIR, LocalBackend, OptimizerConfig


def main() -> None:
    """使用确定性输入优化一个小型 Ising energy。"""
    model = IsingModelIR.from_terms(
        problem_id="lesson.optimization.vqe",
        spins=("q0", "q1"),
        fields={"q0": -0.8, "q1": 0.35},
        couplings={("q0", "q1"): 0.6},
        offset=0.1,
    )
    result = VQE(model, layers=1).run(
        backend=LocalBackend(seed=502),
        optimizer=OptimizerConfig(
            method="Powell", max_iterations=6, max_evaluations=8, seed=502
        ),
        initial_parameters=(0.1, 0.0, -0.2, 0.0),
        final_shots=64,
    )
    candidate = result.best_observed_candidate
    baseline = result.baseline
    assert candidate is not None and baseline is not None
    assert result.final_result is not None

    payload = {
        "track": "optimization_researcher",
        "level": "advanced",
        "lesson": "vqe_workflow",
        "facts": {
            "objective_estimator": result.metadata["objective_estimator"],
            "objective_total_shots": result.metadata["objective_total_shots"],
            "workflow_total_shots": result.metadata["workflow_total_shots"],
            "backend_executions": result.metadata["workflow_backend_execution_count"],
            "final_counts": result.final_result.counts,
            "final_probabilities": result.final_result.probabilities,
            "candidate_count": candidate.count,
            "candidate_value": candidate.objective_value,
            "baseline_bitstring": baseline.bitstring,
            "evaluations": len(result.evaluations),
            "best_energy": round(result.best_evaluation.energy, 10),
            "counts_total": sum(result.final_result.counts.values()),
            "candidate_bitstring": candidate.bitstring,
            "baseline_value": baseline.objective_value,
            "termination_reason": result.termination.reason,
        },
        "boundaries": {
            "hardware_execution": False,
            "cloud_execution": False,
            "network_accessed": False,
            "credentials_loaded": False,
        },
    }
    print(json.dumps(payload, sort_keys=True))


if __name__ == "__main__":
    main()

下载完整脚本

python3 examples/user/tracks/optimization_researcher/04_advanced_vqe_workflow_zh.py

默认单层 Ansatz 在两个比特上分别施加 RY、RZ,再用线性 CX 连接产生纠缠。它有四个参数,初始向量按照线路声明的参数顺序提供。改变 Ansatz 或层数后,需要重新检查顺序和维数。

Powell 优化最多使用八次目标求值、六次迭代。每次目标求值直接计算状态的精确期望值,选出最低能量后,再单独运行一个任务,采样 64 次。这里没有请求有限采样目标估计或噪声模型。

{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "backend_executions": 9,
    "baseline_bitstring": "10",
    "baseline_value": -1.65,
    "best_energy": 0.231067983,
    "candidate_bitstring": "10",
    "candidate_count": 1,
    "candidate_value": -1.65,
    "counts_total": 64,
    "evaluations": 8,
    "final_counts": {
      "10": 1,
      "11": 63
    },
    "final_probabilities": {
      "00": 5.128156145191454e-06,
      "01": 5.162538597544479e-08,
      "10": 0.009966659453993207,
      "11": 0.9900281607644755
    },
    "objective_estimator": "exact_state",
    "objective_total_shots": 0,
    "termination_reason": "max_evaluations",
    "workflow_total_shots": 64
  },
  "lesson": "vqe_workflow",
  "level": "advanced",
  "track": "optimization_researcher"
}

解释能量前先读 termination_reason。这个短预算运行可能因为 max_evaluations 停止,能量仍明显高于基准。只要最终采样中出现过一个最优样本,候选就可能是 10。candidate_count 表示它出现了多少次:出现一次和出现 64 次,对输出分布的含义完全不同。

独立计算四个比特串的 P(bits) × E(bits) 之和,应在舍入误差内等于 best_energy。再用 count/64 代替概率计算一次。后者是采样估计,不一定等于精确期望值。

每次只改变一种误差来源

  1. 只提高 final_shots,精确目标求值的历史会改善吗?
  2. 允许 40 次求值和足够的迭代次数,比较最佳能量、停止原因和实际后端执行成本。
  3. 计算原始最终态相对 −1.65 的能量差,以及 10 的概率。能量差相同的两个状态,最优态概率一定相同吗?

更多最终采样只改善采样估计。更多求值让 Powell 有机会搜索更多参数,但不保证收敛或全局最优。在本例确定性配置下,扩大预算保留相同的初始搜索过程;仍应读取实际求值记录,不要假设预算一定用满。一个平均能量不足以确定全部四个概率,因此也不能唯一确定基态概率。

本例 Hamiltonian 在 Z 基下对角。对含 X 或 Y 项的一般 Pauli Hamiltonian,仅凭计算基计数不能还原能量,需要其他测量基。变分算法指南介绍了有限采样 VQE 和测量分组。比较算法前,继续阅读基准分析。

English version

SDK 1.0.8a · `6eff6362`