You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Qiskit VQE工作流中使用scikit-quant优化器的问题及解决诉求

适配scikit-quant优化器到Qiskit Nature VQE工作流的解决方案

scikit-quant的BOBYQA、IMFIL、SNOBFIT并非Qiskit原生优化器,无法直接通过VQE(optimizer=XXX())的语法调用,需针对每个优化器的特性调整适配逻辑,以下是具体解决方法:

BOBYQA优化器适配

常见报错原因

未传入参数边界、目标函数未返回纯标量值。

解决步骤

  1. 手动构建VQE目标函数,提取标量结果:
from qiskit_nature.second_q.circuit.library import UCCSD
from qiskit_nature.second_q.mappers import ParityMapper
from qiskit.primitives import Estimator
from qiskit.algorithms.minimum_eigensolvers import VQE
from skquant.opt import minimize as skq_minimize
from skquant.opt import BOBYQA

# 假设已初始化electronic_structure_problem
mapper = ParityMapper(num_particles=electronic_structure_problem.num_particles)
ansatz = UCCSD(
    electronic_structure_problem.num_spatial_orbitals,
    electronic_structure_problem.num_particles,
    mapper,
    reps=1
)
estimator = Estimator()

# 定义标量输出的目标函数
def objective(params):
    return estimator.run(
        ansatz,
        electronic_structure_problem.second_q_ops()[0],
        params
    ).result().values[0]

# 生成初始参数
initial_params = ansatz.random_initial_point()
# 设置参数边界(可根据ansatz调整范围,示例为[-2,2])
bounds = [(-2, 2)] * len(initial_params)

# 执行BOBYQA优化
optim_result = skq_minimize(objective, initial_params, method=BOBYQA, bounds=bounds)

# 用优化后的参数获取VQE最终结果
vqe = VQE(estimator, ansatz)
final_result = vqe.compute_minimum_eigenvalue(
    electronic_structure_problem,
    initial_point=optim_result.x
)

IMFIL优化器适配

常见报错原因

默认尝试调用梯度但未提供梯度函数、参数格式不匹配。

解决步骤

IMFIL支持无梯度模式,若无需梯度可直接关闭;若需要梯度则需扩展目标函数返回梯度值:

无梯度模式适配

from skquant.opt import IMFIL

# 复用之前的objective函数、initial_params、bounds
optim_result = skq_minimize(
    objective,
    initial_params,
    method=IMFIL,
    bounds=bounds,
    options={"gradient": False}
)

# 后续VQE结果获取同BOBYQA

带梯度模式适配

def objective_with_grad(params):
    job = estimator.run(
        ansatz,
        electronic_structure_problem.second_q_ops()[0],
        params,
        gradient=True
    )
    res = job.result()
    return res.values[0], res.gradients[0]

optim_result = skq_minimize(
    objective_with_grad,
    initial_params,
    method=IMFIL,
    bounds=bounds
)

SNOBFIT优化器适配

常见报错原因

初始点数量不足(SNOBFIT要求至少参数维度+1个初始样本点)。

解决步骤

生成足够的初始样本点并预计算函数值,再传入优化器:

from skquant.opt import SNOBFIT
import numpy as np

param_dim = len(initial_params)
# 生成参数维度+1个初始样本点
initial_points = np.random.uniform(-2, 2, (param_dim + 1, param_dim))
# 预计算所有初始点的函数值
initial_values = [objective(p) for p in initial_points]

# 执行SNOBFIT优化
optim_result = skq_minimize(
    objective,
    initial_params,
    method=SNOBFIT,
    bounds=bounds,
    options={"x0": initial_points, "f0": initial_values}
)

# 后续VQE结果获取同BOBYQA

通用注意事项

  • 所有scikit-quant优化器需手动处理参数优化流程,无法直接作为VQE的optimizer参数传入。
  • 参数边界需根据UCCSD ansatz的参数合理设置,通常可选(-2π, 2π)或(-2, 2)。
  • 目标函数必须返回纯标量,需从Qiskit Estimator的结果中提取.values[0]。

内容的提问来源于stack exchange,提问作者Giuliana Siddi Moreau

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 16:35:30