在Qiskit VQE工作流中使用scikit-quant优化器的问题及解决诉求
适配scikit-quant优化器到Qiskit Nature VQE工作流的解决方案
scikit-quant的BOBYQA、IMFIL、SNOBFIT并非Qiskit原生优化器,无法直接通过VQE(optimizer=XXX())的语法调用,需针对每个优化器的特性调整适配逻辑,以下是具体解决方法:
BOBYQA优化器适配
常见报错原因
未传入参数边界、目标函数未返回纯标量值。
解决步骤
- 手动构建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
相关产品推荐
相关产品推荐

