Skip to main content
IBM Quantum Platform

Iskay Quantum Optimizer - Kipu QuantumによるQiskit関数

APIリファレンスを参照してください

  • Qiskit 関数は、 IBM Quantum® Premium Plan、Flex Plan、およびオンプレム ( IBM Quantum Platform API 経由) Plan ユーザーだけが利用できる実験的な機能です。 これらはプレビューリリースの状態であり、変更される可能性がある。

概要

Kipu Quantum社のIskay Quantum Optimizerを使えば、 IBM® 量子コンピュータを使って複雑な最適化問題に取り組むことができる。 このソルバーは、キプの最先端の bf-DCQOアルゴリズムを活用し、目的関数のみを入力として問題の解を自動的に提供します。 最大156量子ビットを含む最適化問題を扱うことができ、 IBM 量子デバイスのすべての量子ビットを使用することができる。 オプティマイザーは、古典的変数と量子ビット間の 1-to-1 マッピングを使用し、最大156個のバイナリ変数を持つ最適化問題に取り組むことができます。

オプティマイザーは、制約のない2値最適化問題を解くことができます。 一般的に使用されているQUBO(2次制約なし2値最適化)定式化に加え、高次(HUBO)最適化問題もサポートしています。 ソルバーは非変数量子アルゴリズムを利用し、計算のほとんどを量子デバイス上で実行する。

以下では、使用したアルゴリズムの詳細と、関数の使用方法に関する簡単なガイド、およびサイズや複雑さの異なる様々な問題インスタンスに関するベンチマーク結果を提供する。


説明

オプティマイザーは、最先端の量子最適化アルゴリズムをすぐに使えるように実装したものです。 量子ハードウェア上で高度に圧縮された量子回路を実行することで、最適化問題を解決する。 この圧縮は、量子系の基本的な時間発展に対断熱項を導入することで達成される。 このアルゴリズムは、最終的な解を得るためにハードウェアの実行を何度か繰り返し、後処理と組み合わせる。 これらのステップは、オプティマイザーのワークフローにシームレスに統合され、自動的に実行される。

量子オプティマイザーはどのように機能しますか?

このセクションでは、実装されたbf-DCQOアルゴリズムの基本概要を説明する。 アルゴリズムの概要は、Qiskitの YouTube チャンネルでもご覧いただけます。

このアルゴリズムは、時間と共に変換される量子系の時間発展に基づいており、問題解決は、時間発展の終わりにおける量子系の基底状態に符号化される。 断熱定理によれば、系が基底状態に留まるためには、この進化はゆっくりでなければならない。 この進化をデジタル化することが、デジタル化量子断熱計算(DQA)と悪名高いQAOAアルゴリズムの基礎となっている。 しかし、問題サイズが大きくなると、回路の深さが大きくなるため、必要な低速進化は実現不可能である。 対断熱プロトコルを使用することで、基底状態を維持したまま、短い進化時間で発生する不要な励起を抑制することができる。 ここでは、この短い進化時間をデジタル化することで、量子回路の奥行きが短くなり、エンタングルゲートの数が少なくなる。

bf-DCQOアルゴリズムの回路は、通常、DQAよりも最大10倍、標準的なQAOA実装よりも3~4倍少ないエンタングルゲートを使用する。 ゲート数が少ないため、ハードウェア上での回路実行中に発生するエラーは少ない。 したがって、オプティマイザはエラー抑制やエラー緩和のような技術を使う必要がない。 将来のバージョンでこれらを実装すれば、ソリューションの質をさらに高めることができる。

bf-DCQOアルゴリズムは反復を用いるが、非変数的である。 アルゴリズムの各反復の後、状態の分布が測定される。 得られた分布は、いわゆるバイアス磁場を計算するのに使われる。 バイアス・フィールドは、次の反復を、以前に発見された解に近いエネルギー状態から開始することを可能にする。 このようにして、アルゴリズムは反復するごとに、よりエネルギーの低い解へと移動する。 通常、解に収束するには約10回の反復で十分であり、合計で約100回の反復を必要とする変分アルゴリズムよりもはるかに少ない反復回数で済む。

このオプティマイザは、bf-DCQOアルゴリズムと古典的な後処理を組み合わせたものである。 状態の分布を測定した後、局所的な探索が行われる。 局所探索の間、測定された解のビットはランダムに反転される。 フリップの後、新しいビット列のエネルギーが評価される。 エネルギーが小さければ、そのビット列は新しい解として保存される。 局所探索は量子ビット数に対して線形にスケールするだけである。 後処理は局所的なビット反転を修正するため、ハードウェアの不完全性や読み出しエラーに起因するビット反転エラーを補正することができる。

ワークフロー

量子オプティマイザーのワークフローの概略図を以下に示す。

ワークフロー
量子オプティマイザーのワークフロー

量子オプティマイザーを使用することで、量子ハードウェア上で最適化問題を解くのは以下のようになります

  • 問題の目的関数を定式化する
  • Qiskitファンクションからオプティマイザにアクセスする
  • オプティマイザを実行し、結果を収集する

ベンチマーク

以下のベンチマーク・メトリクスは、オプティマイザーが最大156量子ビットを含む問題に効果的に対処していることを示しており、さまざまな問題タイプにおけるオプティマイザーの精度とスケーラビリティの概要を示しています。 実際の性能指標は、変数の数、目的関数の項の密度や局所性、多項式の次数など、特定の問題特性によって異なる可能性があることに注意してください。

以下の表には、以下のように定義された指標である近似比(AR)が含まれている:

AR=CCmaxCminCmax,AR = \frac{C^{*} - C_\textrm{max}}{C_{\textrm{min}} - C_{\textrm{max}}},

ここで、 CC は目的関数、 CminC_{\textrm{min}}CmaxC_{\textrm{max}} はその最小値と最大値、 CC^{*} はそれぞれ見つかった最適解のコストである。 したがって、 AR=100%、問題の基底状態が得られたことを意味する。

量子ビット数
近似比
合計回数
ランタイム使用量 (s)
合計ショット数
反復数
加重なし MaxCut28100%18030時間まで30k5
加重なし MaxCut30時間まで100%18030時間まで30k5
加重なし MaxCut32100%18030時間まで30k5
加重なし MaxCut80100%4806090k9
加重なし MaxCut100100%3306060k6
加重なし MaxCut120100%3706060k6
ヒューボ1156100%60070100k10
ヒューボ2156100%60070100k10
  • 28、30、32量子ビットの MaxCut インスタンスがibm_sherbrookeで実行された。 80、100、120のインスタンスがHeron r2 プロセッサで実行された。
  • HUBOインスタンスもHeron r2 プロセッサ上で実行された。

すべてのベンチマーク・インスタンスは GitHub ( Kipu benchmark instancesを参照)でアクセスできる。 これらのインスタンスを実行する例は、 例3:ベンチマーク・インスタンスにある。


使用を開始する

このドキュメントでは、Iskay Quantum Optimizerの使用手順について説明します。 この過程で、カタログから関数をロードする方法と、問題を有効な入力に変換する方法を素早く示しつつ、さまざまなオプションパラメータを試す方法も説明します。

より詳細な例については、チュートリアル 「Kipu QuantumのIskay Quantum Optimizerで市場分割問題を解決する 」をご覧ください。ここでは、Iskay Solverを使用して市場分割問題に取り組む全プロセスを解説します。この問題は、需要目標を正確に満たすために市場をバランスの取れた販売地域に分割しなければならないという、現実世界の資源配分課題を表現しています。

IBM Quantum PlatformダッシュボードにあるAPIキーを使用して認証し、以下のようにQiskit Functionを選択します:

Note

以下のコードは、認証情報を保存済みであることを前提としています。 まだ行っていない場合は、「 IBM Cloud アカウントの保存 」の手順に従って、APIキーによる認証を行ってください。

from qiskit_ibm_catalog import QiskitFunctionsCatalog

catalog = QiskitFunctionsCatalog(
    channel="ibm_quantum_platform",
    instance="INSTANCE_CRN",
    # For `token`, use the 44-character API_KEY you created
    # and saved from the IBM Quantum Platform Home dashboard
    token="YOUR_API_KEY",
)

# verify that you have access to the function
catalog.list()

Output:

[QiskitFunction(qunova/hivqe-chemistry),
 QiskitFunction(global-data-quantum/quantum-portfolio-optimizer),
 QiskitFunction(algorithmiq/tem),
 QiskitFunction(qedma/qesem),
 QiskitFunction(multiverse/singularity),
 QiskitFunction(ibm/circuit-function),
 QiskitFunction(q-ctrl/optimization-solver),
 QiskitFunction(colibritd/quick-pde),
 QiskitFunction(q-ctrl/performance-management),
 QiskitFunction(kipu-quantum/iskay-quantum-optimizer)]
# Access Function
optimizer = catalog.load("kipu-quantum/iskay-quantum-optimizer")

カスタム設定の例

Iskayをさまざまな設定で構成する方法は以下の通りです:

custom_options = {
    "shots": 15_000,  # Higher shot count for better statistics
    "num_iterations": 12,  # More iterations for solution refinement
    "preprocessing_level": 1,  # Light preprocessing for problem simplification
    "postprocessing_level": 2,  # Maximum postprocessing for solution quality
    "transpilation_level": 3,  # Use higher transpilation level to optimize circuit
    "seed_transpiler": 42,  # Fixed seed for reproducible results
    "job_tags": ["custom_config"],  # Custom tracking tags
}

シード最適化 : 注記: はデフォルト seed_transpiler``None で に設定されています。 これによりトランスパイラの自動最適化プロセスが可能になります。 システムは複数のシードで試行を開始し None、各トランスパイレーションレベルにおいてパラメータ max_trials の全能力を活用しながら、最適な回路深さを生み出すシードを選択します。

トランスパイル時のパフォーマンス : の値を高く設定して max_trials の数を増やすと transpilation_level 、トランスパイル時間は必然的に増加しますが、最終的な回路が必ずしも変化するとは限りません。これは回路の構造と複雑さに大きく依存します。 ただし、一部の回路や問題では、10回の試行(レベル1)と50回の試行(レベル5)の差が劇的になる場合があり、これらのパラメータを探索することが解決策を成功裏に見つける鍵となる可能性があります。


例1: 単純なコスト関数

スピン定式化のコスト関数を考えてみよう:

C(x0,x1,x2,x3,x4)=1+1.5x0+2x1+1.3x2+2.5x0x3+3.5x1x4+4x0x1x2C(x_0, x_1, x_2, x_3, x_4) = 1 + 1.5x_0 + 2x_1 + 1.3x_2 + 2.5x_0x_3 + 3.5x_1x_4 + 4x_0x_1x_2

ここで (x0,...,x4){1,1}5(x_0, ..., x_4) \in \{-1, 1\}^5

この単純なコスト関数の解は

(x0,x1,x2,x3,x4)=(1,1,1,1,1)(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1)

最小値 C=6C^{*} = -6

1. 目的関数を作成する

まず、目的関数の係数を持つ辞書を以下のように作成する:

objective_func = {
    "()": 1,
    "(0,)": 1.5,
    "(1,)": 2,
    "(2,)": 1.3,
    "(0, 3)": 2.5,
    "(1, 4)": 3.5,
    "(0, 1, 2)": 4,
}

2. オプティマイザを実行する

オプティマイザーを実行することで問題を解決する。 (x0,...,x4){1,1}5(x_0, ..., x_4) \in \{-1, 1\}^5 なので、 problem_type=spin を設定しなければならない。

# Setup options to run the optimizer
options = {"shots": 5000, "num_iterations": 5, "use_session": True}

arguments = {
    "problem": objective_func,
    "problem_type": "spin",
    "backend_name": backend_name,  # such as "ibm_fez"
    "options": options,
}

job = optimizer.run(**arguments)

# Print the ID so you can use it later, if necessary
print(job.job_id)

3. 結果を取得する

最適化問題の解は、オプティマイザーから直接提供される。

print(job.result())

これで辞書が表示される:

{'solution': {'0': -1, '1': -1, '2': -1, '3': 1, '4': 1},
 'solution_info': {'bitstring': '11100',
  'cost': -13.8,
  'seed_transpiler': 42,
  'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}},
 'prob_type': 'spin'}

辞書 solution は、結果ベクトル (x0,x1,x2,x3,x4)=(1,1,1,1,1)(x_0, x_1, x_2, x_3, x_4) = (-1, -1, -1, 1, 1) を表示していることに注目されたい。


例2: MaxCut

MaxCut や最大独立集合のような多くのグラフ問題はNP困難問題であり、量子アルゴリズムやハードウェアのテストに理想的な候補である。 この例では、3-正則グラフの MaxCut 問題を Quantum Optimizer で解く例を示します。

この例を実行するには、 qiskit-ibm-catalog に加えて、 networkx パッケージをインストールする必要があります。 インストールするには、以下のコマンドを実行します。

# %pip install networkx numpy

1. 目的関数を作成する

ランダムな3-正則グラフを生成することから始める。 このグラフについて、 MaxCut 問題の目的関数を定義する。

import networkx as nx

# Create a random 3-regular graph
G = nx.random_regular_graph(3, 10, seed=42)


# Create the objective function for MaxCut in Ising formulation
def graph_to_ising_maxcut(G):
    """
    Convert a NetworkX graph to an Ising Hamiltonian for the max-cut problem.
    Args:
        G (networkx.Graph): The input graph.
    Returns:
        dict: The objective function of the Ising model
    """
    # Initialize the linear and quadratic coefficients
    objective_func = {}
    # Populate the coefficients
    for i, j in G.edges:
        objective_func[f"({i}, {j})"] = 0.5
    return objective_func


objective_func = graph_to_ising_maxcut(G)

2. オプティマイザを実行する

オプティマイザを実行して問題を解決する。

options = {"shots": 5000, "num_iterations": 5, "use_session": True}

arguments = {
    "problem": objective_func,
    "problem_type": "spin",
    "backend_name": backend_name,  # such as "ibm_fez"
    "options": options,
}

job = optimizer.run(**arguments)

3. 結果を取得する

結果を取得し、解のビット列を元のグラフ・ノードにマップする。

print(job.result())

マックスカット問題の解は、結果オブジェクトの solution サブディクショナリに直接含まれる

maxcut_solution = job.result()["solution"]

例3: ベンチマークインスタンス

ベンチマークインスタンスは、 GitHub: Kipu benchmark instances で利用可能です。

インスタンスは、 pygithub ライブラリを使ってロードできる。 インストールするには、以下のコマンドを実行します。

# %pip install pygithub

ベンチマーク・インスタンスのパスは以下の通り:

マックスカット

  • 'maxcut/maxcut_regular_3_100_nodes_weighted.json'
  • 'maxcut/maxcut_regular_3_140_nodes_weighted.json'
  • 'maxcut/maxcut_regular_3_150_nodes_weighted.json'
  • 'maxcut/maxcut_regular_4_130_nodes_weighted.json'

HUBO

  • 'HUBO/hubo1_marrakesh.json'
  • 'HUBO/hubo2_marrakesh.json'

HUBOインスタンスのベンチマークのパフォーマンスを再現するには、バックエンド ibm_marrakesh を選択し、 options サブディクショナリで direct_qubit_mappingTrue に設定する。

次の例では、150ノードのMaxcutインスタンスを実行します。

from github import Github
import urllib
import json
import ast

repo = "Kipu-Quantum-GmbH/benchmark-instances"
path = "maxcut/maxcut_regular_3_150_nodes_weighted.json"
gh = Github()
repo = gh.get_repo(repo)
branch = "main"
file = repo.get_contents(urllib.parse.quote(path), ref=branch)

# load json file with benchmark problem
problem_json = json.loads(file.decoded_content)

# convert objective function to compatible format
objective_func = {
    key: ast.literal_eval(value) for key, value in problem_json.items()
}


# Setup configuration to run the optimizer
options = {
    "shots": 5_000,
    "num_iterations": 5,
    "use_session": True,
    "direct_qubit_mapping": False,
}

arguments = {
    "problem": objective_func,
    "problem_type": "spin",
    "backend_name": "<BACKEND-NAME>",
    "options": options,
}

job = optimizer.run(**arguments)

result = job.result()

ユース・ケース

Optimizationソルバーの典型的な使用例は、組み合わせ最適化問題です。 金融、製薬、物流など、さまざまな業界の問題を解決することができます。 いくつか例を挙げよう。

特定のユースケースに取り組み、専用のマッピングを開発することにご興味があれば、当社が支援いたします。 お問い合わせください


サポートの利用

サポートに関するお問い合わせ [email protected].


次のステップ


詳細情報

イスカイ」は、私たちの社名「キプ・クァンタム」と同じく、ペルーの言葉だ。 私たちはドイツ発のスタートアップですが、この言葉は共同創業者の一人の祖国に由来しています。クイップーは紀元前2000年に人類が開発した最初の計算機のひとつです。

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。