跳转至

让实验结论与基准证据相符

运行一个两变量 QUBO,查看 Algorithm 报告,判断单次实验究竟能说明什么。请先完成 QAOA、VQE和实验设计,使用安装好的环境。

这个问题与之前的 QUBO 略有不同:f(x) = 0.1 − x0 − 0.6 x1 + 1.2 x0 x1。按 00、01、10、11 排列,四个值为 0.1、−0.5、−0.9、−0.3,穷举可知最小值对应 10。

分别解释三类结果

"""结合有界 baseline 解释变分算法输出。

分析时要分清 best objective evaluation、sampled candidate 和 classical baseline。
标准 Algorithm report 会保留来源和历史,但有限范围内的比较不能当作最优性证明。
"""

from __future__ import annotations

import json

from cascaqit import QAOA, LocalBackend, OptimizerConfig, QUBOProblemIR, visualize


def main() -> None:
    """运行一个小型 QUBO,并比较不同种类的结果事实。"""
    problem = QUBOProblemIR.from_terms(
        problem_id="lesson.optimization.analysis",
        variables=("x0", "x1"),
        linear_terms={"x0": -1.0, "x1": -0.6},
        quadratic_terms={("x0", "x1"): 1.2},
        offset=0.1,
    )
    result = QAOA(problem, layers=1).run(
        backend=LocalBackend(seed=503),
        optimizer=OptimizerConfig(
            method="COBYLA", max_iterations=6, max_evaluations=5, seed=503
        ),
        initial_parameters=(0.2, -0.2),
        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
    report = visualize(result)

    payload = {
        "track": "optimization_researcher",
        "level": "expert",
        "lesson": "baseline_analysis",
        "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,
            "best_energy": round(result.best_evaluation.energy, 10),
            "sampled_candidate": candidate.bitstring,
            "candidate_value": candidate.objective_value,
            "baseline_bitstring": baseline.bitstring,
            "baseline_value": baseline.objective_value,
            "optimality_claim": candidate.optimality_claim,
            "report_profile": report.profile,
            "report_section_count": len(report.sections),
        },
        "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/05_expert_baseline_analysis_zh.py
{
  "boundaries": {
    "cloud_execution": false,
    "credentials_loaded": false,
    "hardware_execution": false,
    "network_accessed": false
  },
  "facts": {
    "backend_executions": 6,
    "baseline_bitstring": "10",
    "baseline_value": -0.9,
    "best_energy": -0.5609248776,
    "candidate_count": 28,
    "candidate_value": -0.9,
    "final_counts": {
      "00": 6,
      "01": 16,
      "10": 28,
      "11": 14
    },
    "final_probabilities": {
      "00": 0.10462979564428168,
      "01": 0.32777336608607827,
      "10": 0.39537020435571835,
      "11": 0.17222663391392173
    },
    "objective_estimator": "exact_state",
    "objective_total_shots": 0,
    "optimality_claim": "not_claimed",
    "report_profile": "algorithm",
    "report_section_count": 7,
    "sampled_candidate": "10",
    "workflow_total_shots": 64
  },
  "lesson": "baseline_analysis",
  "level": "expert",
  "track": "optimization_researcher"
}
数值 回答的问题
best_energy 搜索过程中求值过的最低期望能量是多少?
sampled_candidate、candidate_value 实际采样到的比特串中,哪一个目标值最好?
baseline_bitstring、baseline_value 有规模上限的经典比较找到了什么?

最佳期望能量可以仍在 −0.56 附近,而采样候选达到 −0.9。两者并不矛盾,期望值还包含更差的比特串。分别用期望能量、候选值减去基准值,会得到两个不同的差值:候选差值可以为零,期望差值仍为正。

对这个两变量问题,穷举覆盖了全部四种赋值。候选与其最小值一致,足以说明观察到的候选解出了这个具体实例,但不能说明 QAOA 总能成功、已经收敛或优于经典搜索。SDK 的候选字段仍为 not_claimed,不会把比较结果自动升级为一般性的最优性声明。问题增大后,应先检查 baseline.status、method、limit 和 unavailable_reason,不能默认基准始终可用。

visualize(result) 根据保存的结果创建报告,不会重新运行优化。要保存文件,可改为 visualize(result, output='artifacts/qubo-analysis.html', language='zh')。输出中的报告类型和章节数仅说明结构,图表和标题不会增强实验结论。

用明确的成本比较重复运行

保持目标、初始参数、层数和预算不变,以种子 503、504、505、506、507 重复运行。用表格记录种子、最佳能量、候选值、候选次数、停止原因、后端执行次数和总采样次数,保留没有找到最优解的运行。既报告五次运行中有几次观察到 10,也报告每次运行内部的频率,两者是不同统计量。

本例使用精确目标值和明确的初始向量,优化过程是确定性的。改变种子主要改变最终采样,因此这个练习观察的是采样可靠性,不是优化器对初值的敏感性。研究后者时,应另做一组实验,改变并记录初始参数向量。五次重复适合教学练习,尚不足以精确估计可靠性。

示例包含五次目标求值和一次最终采样任务,目标求值不消耗 shots,总采样为 64 次。经典穷举的四次赋值计算另计。后端调用与经典函数求值的成本不同,不能拿次数直接比较速度。

练习写出一句有依据的结论,再写一句当前证据不支持的结论。可以说明某次运行观察到了与完整四态基准一致的候选;若要声称加速或在更大 QUBO 上可靠,需要更多实验、计时和合适的经典算法对照。MIS 三路线项目进一步说明了比较时需要交代的条件。

English version

SDK 1.0.8a · `6eff6362`