common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


autoQAOA
Desktop RAG

Overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

blueqatでのvqeでscipyのoptimizerを変えて速度比較

Yuichiro Minato

2021/02/08 21:33

#量子ゲート

はじめに

blueqatをつかってVQEの最適化計算をしてみたいと思います。最適化といっても色々種類があるので、今回はscipyの最適化手法をみてみます。

optimizerを変えてみる

vqeには最適化ステップがあるので、最適化手法を変えてみます。

scipy.optimize.minimizeから読まれるみたいなので、変えてみましょう。

まずは何もやらずの、最適化のシードやステップによって結果が変わるので、10回計算した平均をとってみます。

import numpy as np

hamiltonian = q(0)*q(1)*q(2)
step = 5
res = []

for _ in range(10):
  start = time.time()
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 4.69558162689209
4.69558162689209
hamiltonian = q(0)*q(1)*q(2)
step = 5
res = []

#ここで最適化を決めます。
minimizer=vqe.get_scipy_minimizer(method="COBYLA")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 0.7651197671890259
0.7651197671890259
minimizer=vqe.get_scipy_minimizer(method="Nelder-Mead")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.2728466749191285
1.2728466749191285
minimizer=vqe.get_scipy_minimizer(method="Powell")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 2.5380529801050824
2.5380529801050824
minimizer=vqe.get_scipy_minimizer(method="CG")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 2.184863805770874
2.184863805770874
minimizer=vqe.get_scipy_minimizer(method="BFGS")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.90869873046875
1.90869873046875
minimizer=vqe.get_scipy_minimizer(method="L-BFGS-B")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.690256663163503
1.690256663163503
minimizer=vqe.get_scipy_minimizer(method="TNC")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.6919202498027257
1.6919202498027257
minimizer=vqe.get_scipy_minimizer(method="SLSQP")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.6168858793046739
1.6168858793046739
minimizer=vqe.get_scipy_minimizer(method="trust-constr")

for _ in range(10):
  start = time.time()

  #ここで指定します。
  result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run()
  end = time.time()
  res.append(end - start)

print(np.average(res))

#=> 1.7530574709177018
1.7530574709177018

まとめ

最適化といっても色々な種類があるので、それらを選ぶときにも基準が必要そうです。微分を使ったものが主流になりつつあるので、用途に合わせ見てみたいと思います。

© 2025, blueqat Inc. All rights reserved