주 콘텐츠로 건너뛰기

Iskay Quantum Optimizer - Kipu Quantum의 Qiskit Function

참고
  • Qiskit Functions는 IBM Quantum® Premium Plan, Flex Plan, 및 On-Prem(IBM Quantum Platform API를 통한) Plan 사용자만 사용할 수 있는 실험적 기능입니다. 미리보기 릴리스 상태이며 변경될 수 있습니다.

개요

Kipu Quantum의 Iskay Quantum Optimizer를 사용하면 IBM® 양자 컴퓨터를 사용하여 복잡한 최적화 문제를 해결할 수 있습니다. 이 솔버는 Kipu의 최첨단 bf-DCQO 알고리즘을 활용하며, 목적 함수만 입력으로 필요하여 문제 솔루션을 자동으로 제공합니다. 최대 156개의 Qubit를 포함하는 최적화 문제를 처리할 수 있어, IBM 양자 장치의 모든 Qubit를 사용할 수 있습니다. Optimizer는 고전적 변수와 Qubit 간 1:1 매핑을 사용하므로 최대 156개의 이진 변수가 있는 최적화 문제를 해결할 수 있습니다.

Optimizer는 비제약 이진 최적화 문제의 해결을 가능하게 합니다. 일반적으로 사용되는 QUBO(이차 비제약 이진 최적화) 공식 외에도 고차(HUBO) 최적화 문제도 지원합니다. 솔버는 비변분 양자 알고리즘을 활용하여 대부분의 계산을 양자 장치에서 수행합니다.

다음에서는 사용된 알고리즘에 대한 자세한 내용과 함수 사용 방법에 대한 간략한 가이드, 그리고 다양한 크기와 복잡도의 문제 인스턴스에 대한 벤치마킹 결과를 제공합니다.

설명

Optimizer는 최첨단 양자 최적화 알고리즘의 즉시 사용 가능한 구현입니다. 양자 하드웨어에서 고도로 압축된 양자 회로를 실행하여 최적화 문제를 해결합니다. 이 압축은 양자 시스템의 기본 시간 진화에 반단열(counterdiabatic) 항을 도입하여 달성됩니다. 알고리즘은 최종 솔루션을 얻기 위해 여러 번의 하드웨어 실행 반복을 수행하고 후처리와 결합합니다. 이러한 단계들은 Optimizer의 워크플로에 원활하게 통합되어 자동으로 실행됩니다.

Quantum Optimizer는 어떻게 작동하나요?

이 섹션에서는 구현된 bf-DCQO 알고리즘의 기본 사항을 설명합니다. 알고리즘에 대한 소개는 Qiskit YouTube 채널에서도 찾을 수 있습니다.

이 알고리즘은 시간에 따라 변환되는 양자 시스템의 시간 진화를 기반으로 하며, 진화 끝에서 양자 시스템의 기저 상태에 문제 솔루션이 인코딩됩니다. 단열 정리에 따르면, 시스템이 기저 상태를 유지하려면 이 진화가 느려야 합니다. 이 진화를 디지털화하는 것이 디지털화된 양자 단열 계산(DQA)과 유명한 QAOA 알고리즘의 기초입니다. 그러나 필요한 느린 진화는 회로 깊이가 증가하므로 문제 크기가 커질수록 실현 가능하지 않습니다. 반단열 프로토콜을 사용하면 기저 상태를 유지하면서 짧은 진화 시간 동안 발생하는 원하지 않는 여기를 억제할 수 있습니다. 여기서 이 짧은 진화 시간을 디지털화하면 더 짧은 깊이와 더 적은 얽힘 Gate를 가진 양자 회로가 됩니다.

bf-DCQO 알고리즘의 회로는 일반적으로 DQA보다 최대 10배 더 적은 얽힘 Gate를, 표준 QAOA 구현보다 3~4배 더 적은 얽힘 Gate를 사용합니다. Gate 수가 적기 때문에 하드웨어에서 회로 실행 중 오류가 적게 발생합니다. 따라서 옵티마이저는 오류 억제나 오류 완화와 같은 기술을 사용할 필요가 없습니다. 향후 버전에서 이를 구현하면 솔루션 품질을 더욱 향상시킬 수 있습니다.

bf-DCQO 알고리즘은 반복을 사용하지만 비변분입니다. 알고리즘의 각 반복 후, 상태의 분포가 측정됩니다. 얻어진 분포는 소위 바이어스 필드를 계산하는 데 사용됩니다. 바이어스 필드는 이전에 발견된 솔루션 근처의 에너지 상태에서 다음 반복을 시작할 수 있게 합니다. 이런 방식으로 알고리즘은 각 반복마다 더 낮은 에너지의 솔루션으로 이동합니다. 일반적으로 약 10번의 반복이 솔루션에 수렴하기에 충분하며, 총적으로 약 100번 반복이 필요한 변분 알고리즘보다 훨씬 적은 수의 반복이 필요합니다.

옵티마이저는 bf-DCQO 알고리즘과 고전적 후처리를 결합합니다. 상태의 분포를 측정한 후, 로컬 탐색이 수행됩니다. 로컬 탐색 중 측정된 솔루션의 비트가 무작위로 뒤집힙니다. 뒤집기 후 새 비트스트링의 에너지가 평가됩니다. 에너지가 낮으면 비트스트링이 새 솔루션으로 유지됩니다. 로컬 탐색은 Qubit 수에 따라 선형적으로만 확장되므로 계산 비용이 저렴합니다. 후처리가 로컬 비트 뒤집기를 수정하므로, 하드웨어 불완전성과 판독 오류의 결과인 비트 뒤집기 오류를 보상합니다.

워크플로

다음은 Quantum Optimizer의 워크플로 개략도입니다.

워크플로

Quantum Optimizer를 사용하면 양자 하드웨어에서 최적화 문제 해결이 다음으로 줄어듭니다:

  • 문제의 목적 함수 공식화
  • Qiskit Functions를 통해 Optimizer에 접근
  • Optimizer를 실행하고 결과 수집

벤치마크

아래 벤치마크 지표는 Optimizer가 최대 156개의 Qubit를 포함하는 문제를 효과적으로 처리하며, 다양한 문제 유형에 걸쳐 옵티마이저의 정확도와 확장성에 대한 일반적인 개요를 제공합니다. 실제 성능 지표는 변수 수, 목적 함수의 항의 밀도 및 지역성, 다항식 차수와 같은 특정 문제 특성에 따라 다를 수 있습니다.

다음 표에는 근사 비율(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%는 문제의 기저 상태를 얻었음을 의미합니다.

ExampleNumber of qubitsApproximation RatioTotal time (s)Runtime usage (s)Total Number of shotsNumber of iterations
Unweighted MaxCut28100%1803030k5
Unweighted MaxCut30100%1803030k5
Unweighted MaxCut32100%1803030k5
Unweighted MaxCut80100%4806090k9
Unweighted MaxCut100100%3306060k6
Unweighted MaxCut120100%3706060k6
HUBO 1156100%60070100k10
HUBO 2156100%60070100k10
  • 28, 30, 32 Qubit의 MaxCut 인스턴스는 ibm_sherbrooke에서 실행되었습니다. 80, 100, 120 인스턴스는 Heron r2 프로세서에서 실행되었습니다.
  • HUBO 인스턴스도 Heron r2 프로세서에서 실행되었습니다.

모든 벤치마크 인스턴스는 GitHub에서 접근할 수 있습니다(Kipu benchmark instances 참조). 이러한 인스턴스를 실행하는 예제는 예제 3: 벤치마크 인스턴스에서 찾을 수 있습니다.

입력 및 출력

입력

Quantum Optimizer가 허용하는 모든 입력 매개변수에 대해서는 다음 표를 참조하세요. 후속 옵션 섹션에서 사용 가능한 options에 대해 더 자세히 설명합니다.

NameTypeDescriptionRequiredDefaultExample
problemDict[str, float]The coefficients of the optimization problem formulated as QUBO/HUBO or spin format. For more information on the problem specification, see Accepted problem formatsYesN/A{"()": -21.0, "(0, 4)": 0.5,"(0, 2)": 0.5,"(0, 1)": 0.5,"(1, 3)": 0.5}
problem_typestrSpecify whether the problem coefficients are in binary (QUBO/HUBO) or spin format. The two possibilities are "spin" or "binary"YesN/A"spin"
backend_namestrName of the backend to make the queryYesN/A"ibm_fez"
optionsDict[str, Any]Options to handle the hardware submission, such as number of shots. For further details on the options configuration, see the Options sectionNoTo see the default values of the options configuration see the Options section{"shots": 5000, "num_iterations": 3, "use_session": True, "seed_transpiler": 42}

허용되는 문제 형식

problemproblem_type 인수는 다음 형식의 최적화 문제를 인코딩합니다

min(x1,x2,,xn)DC(x1,x2,,xn)\begin{align} \min_{(x_1, x_2, \ldots, x_n) \in D} C(x_1, x_2, \ldots, x_n) \nonumber \end{align}

where

C(x1,...,xn)=a+ibixi+i,jci,jxixj+...+k1,...,kmgk1,...,kmxk1...xkmC(x_1, ... , x_n) = a + \sum_{i} b_i x_i + \sum_{i, j} c_{i, j} x_i x_j + ... + \sum_{k_1, ..., k_m} g_{k_1, ..., k_m} x_{k_1} ... x_{k_m}
  • problem_type = "binary"를 선택하면 비용 함수가 binary 형식임을 지정하며, 이는 D={0,1}nD = \{0, 1\}^{n}, 즉 비용 함수가 QUBO/HUBO 공식으로 작성되었음을 의미합니다.
  • 반면에 problem_type = "spin"을 선택하면 비용 함수가 Ising 공식으로 작성되며, 여기서 D={1,1}nD = \{-1, 1\}^{n}입니다.

문제의 계수는 다음과 같이 딕셔너리에 인코딩해야 합니다:

{"()":a,"(i,)":bi,"(i, j)":ci,j,"(k1,...,km)":gk1,...,km,}\begin{align} \nonumber &\texttt{\{} \\ \nonumber &\texttt{"()"}&: \quad &a, \\ \nonumber &\texttt{"(i,)"}&: \quad &b_i, \\ \nonumber &\texttt{"(i, j)"}&: \quad &c_{i, j}, \\ \nonumber &\quad \vdots \\ \nonumber &\texttt{"(} k_1, ..., k_m \texttt{)"} &: \quad &g_{k_1, ..., k_m}, \\ \nonumber &\texttt{\}} \end{align}
  • 딕셔너리의 키는 반복되지 않는 정수의 유효한 튜플을 포함하는 문자열이어야 합니다.

옵션

Iskay는 선택적 매개변수를 통해 세밀한 조정 기능을 제공합니다. 기본값은 대부분의 문제에 잘 작동하지만, 특정 요구 사항에 맞게 동작을 사용자 정의할 수 있습니다:

ParameterTypeDefaultDescription
shotsint10000Quantum measurements per iteration (higher = more accurate)
num_iterationsint10Algorithm iterations (more iterations can improve solution quality)
use_sessionboolTrueUse IBM sessions for reduced queue times
seed_transpilerintNoneSet for reproducible quantum circuit compilation
direct_qubit_mappingboolFalseMap virtual qubits directly to physical qubits
job_tagsList[str]NoneCustom tags for job tracking
preprocessing_levelint0Problem preprocessing intensity (0-3) - see details below
postprocessing_levelint2Solution refinement level (0-2) - see details below
transpilation_levelint0Transpiler optimization trials (0-5) - see details below
transpile_onlyboolFalseAnalyze circuit optimization without running full execution

전처리 레벨 (0-3): 현재 하드웨어의 결맞음 시간에 맞지 않는 큰 문제에 특히 중요합니다. 높은 전처리 레벨은 문제 트랜스파일레이션의 근사를 통해 더 얕은 회로 깊이를 달성합니다:

  • 레벨 0: 정확하지만 더 긴 회로
  • 레벨 1: 정확도와 근사 간의 좋은 균형, 가장 낮은 10번째 백분위수의 각도를 가진 Gate만 제거
  • 레벨 2: 약간 높은 근사, 가장 낮은 20번째 백분위수의 각도를 가진 Gate를 제거하고 트랜스파일레이션에서 approximation_degree=0.95 사용
  • 레벨 3: 최대 근사 레벨, 가장 낮은 30번째 백분위수의 Gate를 제거하고 트랜스파일레이션에서 approximation_degree=0.90 사용

트랜스파일레이션 레벨 (0-5): 양자 회로 컴파일을 위한 고급 Transpiler 최적화 시도를 제어합니다. 이는 고전적 오버헤드의 증가로 이어질 수 있으며, 일부 경우 회로 깊이가 변하지 않을 수 있습니다. 기본값 2는 일반적으로 가장 작은 회로를 생성하며 비교적 빠릅니다.

  • 레벨 0: 분해된 DCQO 회로의 최적화 (레이아웃, 라우팅, 스케줄링)
  • 레벨 1: PauliEvolutionGate 최적화 후 분해된 DCQO 회로 최적화 (max_trials=10)
  • 레벨 2: PauliEvolutionGate 최적화 후 분해된 DCQO 회로 최적화 (max_trials=15)
  • 레벨 3: PauliEvolutionGate 최적화 후 분해된 DCQO 회로 최적화 (max_trials=20)
  • 레벨 4: PauliEvolutionGate 최적화 후 분해된 DCQO 회로 최적화 (max_trials=25)
  • 레벨 5: PauliEvolutionGate 최적화 후 분해된 DCQO 회로 최적화 (max_trials=50)

후처리 레벨 (0-2): 로컬 탐색의 서로 다른 수의 그리디 패스로 비트 뒤집기 오류를 보상하는 고전적 최적화의 정도를 제어합니다:

  • 레벨 0: 1 패스
  • 레벨 1: 2 패스
  • 레벨 2: 3 패스

트랜스파일 전용 모드: 전체 양자 알고리즘 실행 없이 회로 최적화를 분석하려는 사용자에게 제공됩니다.

사용자 정의 구성 예제: 다음은 다양한 설정으로 Iskay를 구성하는 방법입니다:

# Added by doQumentation — required packages for this notebook
!pip install -q PyGithub networkx qiskit-ibm-catalog
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, # Using higher transpilation level for circuit optimization
"seed_transpiler": 42, # Fixed seed for reproducible results
"job_tags": ["custom_config"], # Custom tracking tags
}

시드 최적화: seed_transpiler는 기본적으로 None으로 설정되어 있습니다. 이를 통해 Transpiler의 자동 최적화 프로세스가 활성화됩니다. None인 경우 시스템은 여러 시드로 시도를 시작하고 최적의 회로 깊이를 생성하는 시드를 선택하여, 각 트랜스파일레이션 레벨에 대한 max_trials 매개변수의 전체 기능을 활용합니다.

트랜스파일레이션 레벨 성능: transpilation_level의 높은 값으로 max_trials 수를 늘리면 트랜스파일레이션 시간이 불가피하게 증가하지만, 최종 회로가 항상 변하는 것은 아닙니다 - 이는 특정 회로 구조와 복잡성에 크게 의존합니다. 그러나 일부 회로/문제의 경우 10번 시도(레벨 1)와 50번 시도(레벨 5) 사이의 차이가 극적일 수 있으므로, 이러한 매개변수를 탐색하는 것이 솔루션을 성공적으로 찾는 핵심이 될 수 있습니다.

출력

NameTypeDescriptionExample
resultDict[str, Any]Solution and metadata. Structure varies based on transpile_only option.See "Result dictionary contents" below

결과 딕셔너리 내용

결과 딕셔너리 구조는 실행 모드에 따라 다릅니다:

FieldTypeModeDescriptionExample
solutionDict[str, int]StandardThe sorted mapped solution where keys are variable indices (as strings) sorted numerically and values are the corresponding variable values (1/-1 for spin problems, 1/0 for binary problems).{'0': -1, '1': -1, '2': -1, '3': 1, '4': 1}
solution_infoDict[str, Any]StandardDetailed information about the solution (see details below){'bitstring': '11100', 'cost': -13.8, 'seed_transpiler': 42, 'mapping': {0: 0, 1: 1, 2: 2, 3: 3, 4: 4}}
prob_typestrStandardThe type of optimization problem ('spin' or 'binary')'spin'
transpilation_infoDict[str, Any]Transpile-onlyCircuit analysis and transpilation details (see details below){'best_seed': 42, 'transpilation_time_seconds': 50.06, 'transpiled_circuit': {'depth': 576, 'gate_count': 4177, 'num_qubits': 156, 'width': 176, 'operations': {'sx': 1325, 'rx': 891, 'cz': 783, 'rz': 650, 'rzz': 466, 'x': 42, 'measure': 20}}}

표준 실행

선택적 매개변수 transpile_only=False인 경우:

solution_info 딕셔너리:

  • "bitstring" (str): 솔루션의 원시 비트스트링 표현.
  • "cost" (float): 솔루션과 관련된 비용/에너지 값.
  • "seed_transpiler" (int): 이 결과를 생성한 Transpiler에 사용된 랜덤 시드.
  • "mapping" (Dict[int, int]): 계산에 사용된 원래 Qubit-변수 매핑.
  • "qpu_time" (float, 선택): 초 단위의 QPU 실행 시간.

변수 매핑 참고:

  • solution 딕셔너리는 변수 인덱싱을 위해 mapping 객체를 사용하여 솔루션 비트스트링에서 얻어집니다.
  • problem_type=spin일 때 11,011 \rightarrow -1, \quad 0 \rightarrow 1 할당을 사용합니다.
  • 솔루션 딕셔너리의 키는 문자열로 숫자순으로 정렬된 변수 인덱스입니다.

트랜스파일레이션 분석

선택적 매개변수 transpile_only=True인 경우:

transpilation_info 딕셔너리:

  • "best_seed" (int): 트랜스파일레이션에서 찾은 최적 시드
  • "transpilation_time_seconds" (float): 트랜스파일레이션 프로세스에 소요된 시간
  • "transpiled_circuit" (Dict): 다음을 포함하는 회로 분석:
    • "depth" (int): 회로 깊이 (레이어 수)
    • "gate_count" (int): 회로의 총 Gate 수
    • "num_qubits" (int): 사용된 Qubit 수
    • "width" (int): 회로 너비
    • "operations" (Dict[str, int]): 사용된 각 Gate 유형의 수

트랜스파일 전용 모드 사용법:

  • 전체 양자 알고리즘 실행 없이 회로 최적화를 분석하려는 사용자에게 제공됩니다.
  • 회로 분석, 깊이 최적화 연구, 전체 실행을 수행하기 전에 트랜스파일레이션 효과를 이해하는 데 유용합니다.

시작하기

이 문서에서는 Iskay Quantum Optimizer를 사용하는 단계를 안내합니다. 그 과정에서 카탈로그에서 함수를 로드하는 방법과 문제를 유효한 입력으로 변환하는 방법을 빠르게 보여주며, 다양한 선택적 매개변수로 실험하는 방법을 보여줍니다.

더 자세한 예제는 Kipu Quantum의 Iskay Quantum Optimizer로 Market Split 문제 해결 튜토리얼을 확인하세요. 이 튜토리얼에서는 Iskay Solver를 사용하여 시장을 정확한 수요 목표를 충족하도록 균형 잡힌 판매 지역으로 분할해야 하는 실제 자원 할당 문제인 Market Split 문제를 해결하는 전체 과정을 다룹니다.

IBM Quantum Platform 대시보드에서 찾을 수 있는 API 키를 사용하여 인증하고, 다음과 같이 Qiskit Function을 선택합니다:

# ruff: noqa: F821
참고

다음 코드는 자격 증명을 저장했다고 가정합니다. 아직 저장하지 않았다면, IBM Cloud 계정 저장 지침에 따라 API 키로 인증하세요.

from qiskit_ibm_catalog import QiskitFunctionsCatalog

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

# Access Function
optimizer = catalog.load("kipu-quantum/iskay-quantum-optimizer")

예제 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

where (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. Optimizer 실행

옵티마이저를 실행하여 문제를 해결합니다. (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)

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이나 Maximum independent set과 같은 많은 그래프 문제는 NP-hard 문제이며 양자 알고리즘과 하드웨어를 테스트하기 위한 이상적인 후보입니다. 이 예제는 Quantum Optimizer를 사용하여 3-정규 그래프의 MaxCut 문제를 해결하는 것을 시연합니다.

이 예제를 실행하려면 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. 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)

3. 결과 검색

결과를 검색하고 솔루션 비트스트링을 원래 그래프 노드에 다시 매핑합니다.

print(job.result())

Maxcut 문제의 솔루션은 결과 객체의 solution 하위 딕셔너리에 직접 포함되어 있습니다

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

예제 3: 벤치마크 인스턴스

벤치마크 인스턴스는 GitHub에서 사용할 수 있습니다: Kipu benchmark instances.

인스턴스는 pygithub 라이브러리를 사용하여 로드할 수 있습니다. 설치하려면 다음 명령을 실행하세요:

# %pip install pygithub

벤치마크 인스턴스의 경로는 다음과 같습니다:

Maxcut:

  • 'maxcut/maxcut_28_nodes.json'
  • 'maxcut/maxcut_30_nodes.json'
  • 'maxcut/maxcut_32_nodes.json'
  • 'maxcut/maxcut_80_nodes.json'
  • 'maxcut/maxcut_100_nodes.json'
  • 'maxcut/maxcut_120_nodes.json'

HUBO:

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

HUBO 인스턴스에 대한 벤치마크 성능을 재현하려면 Backend ibm_marrakesh를 선택하고 options 하위 딕셔너리에서 direct_qubit_mappingTrue로 설정하세요. 다음 예제는 32개 노드의 Maxcut 인스턴스를 실행합니다.

from github import Github
import urllib
import json
import ast

repo = "Kipu-Quantum-GmbH/benchmark-instances"
path = "maxcut/maxcut_32_nodes.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": "ibm_brisbane",
"options": options,
}

job = optimizer.run(**arguments)

result = job.result()

사용 사례

최적화 솔버의 일반적인 사용 사례는 조합 최적화 문제입니다. 금융, 제약, 물류 등 다양한 산업의 문제를 해결할 수 있습니다. 몇 가지 예는 다음과 같습니다.

특정 사용 사례를 해결하고 전용 매핑을 개발하는 데 관심이 있으시면 도와드릴 수 있습니다. 문의하세요.

지원 받기

지원이 필요하면 support@kipu-quantum.com으로 문의하세요.

다음 단계

추가 정보

Iskay는 회사 이름 Kipu Quantum과 마찬가지로 페루어입니다. 독일의 스타트업이지만, 이 단어들은 공동 창립자 중 한 명의 출신 국가에서 유래하며, 그곳에서 Quipu는 기원전 2000년에 인류가 개발한 최초의 계산 기계 중 하나였습니다.