common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Contact
Event
Project
Research

Terms of service (Web service)

Terms of service (Quantum and ML Cloud service)

Privacy policy


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