제약 조건이 있는 양자 최적화기 - Aqarios의 Qiskit 함수
API 참조 보기
Qiskit Functions IBM Quantum® Premium Plan, Flex Plan 및 On-Prem ( IBM Quantum Platform API를 통해 이용) Plan 사용자만 이용할 수 있는 실험적 기능입니다. 이 기능들은 현재 미리보기 버전 상태이며, 변경될 수 있습니다.
개요
Aqarios의 ‘제약 조건이 있는 양자 최적화기(Constrained Quantum Optimizer)’를 사용하면, 수동으로 문제를 재구성하거나 회로 매핑을 수행할 필요 없이 IBM® 의 양자 하드웨어에서 제약 조건이 있는 이진 최적화 문제를 해결할 수 있습니다. 문제를 LP 파일, MPS 파일 또는 Luna 모델 형식으로 제출하기만 하면 됩니다. 이 함수는 재구성, 회로 합성, 트랜스파일링 및 하드웨어 실행을 자동으로 처리합니다. 이 솔버는 양자 근사 최적화 알고리즘(QAOA)의 제약 조건 기반 확장인 양자 최적화 알고리즘( FlexQAOA )의 반복적 웜 스타팅 [1] 기법을 활용합니다.
이 최적화기는 제약 조건이 있는 이진 문제를 대상으로 합니다. 특히, 원-핫 제약 조건과 세트-패킹 제약 조건은 XY-믹서를 사용하여 기본적으로 적용할 수 있다. 다른 제약 조건 유형은 자동으로 벌칙 항으로 재구성됩니다.
이 함수는 이산 문제만 해결합니다. 모든 의사결정 변수는 큐비트로 인코딩될 수 있도록 이진형이거나, 명시적인 하한과 상한을 갖는 정수형이어야 합니다. 연속(실수형) 변수는 지원되지 않습니다. 이러한 변수가 포함된 모델은 오류 코드와 함께 거부됩니다 4710.
설명
성능은 문제 사례와 그 후의 처리 단계 모두에 따라 달라질 수 있습니다. 경우에 따라, 고전적 샘플과 양자 생성 샘플은 동등한 후처리를 거친 후 유사한 최종 솔루션 품질을 달성할 수도 있다. 따라서 평가 시에는 최적화 워크플로우 전체를 고려해야 한다.
제약 조건이 있는 양자 최적화기(Constrained Quantum Optimizer)는 반복적 웜스타트 XY-믹서 QAOA(IWS-QAOA) [1] 를 구현합니다. 이 알고리즘은 양자 하드웨어에서 고정 각도 QAOA 회로를 구동하며, 이전 반복 단계의 측정 결과를 활용하여 각 회로의 초기 웜스타트 확률을 업데이트합니다. 변분 매개변수 학습이 필요하지 않으며, 대신 고정된 선형 램프 매개변수화가 선택됩니다.
XY-믹서를 사용하여 원-핫 제약 조건을 적용하면, 탐색 공간이 실질적으로 더 작은 실행 가능한 부분 공간으로 축소되기 때문에 제약 조건이 있는 문제의 해의 품질을 획기적으로 향상시킬 수 있으며, 최적화 경로에서 페널티 항으로 인한 추가적인 복잡성이 발생하지 않습니다.
워크플로우
이 함수의 처리 흐름은 다음과 같습니다:
- 전처리 : 회로 합성 전에, 최적화기는 입력 문제의 제약 조건을 분석합니다:
- 그래프 전처리: 문제에 적용 가능한 경우, 변수 간의 관계를 나타내는 간선이 포함된 그래프로 분석합니다. 이 그래프 분석을 통해 두 가지 전처리 문제 개선이 가능해집니다. 먼저, 클리크 병합을 통해 개별 제약 조건을 하나의 큰 제약 조건으로 통합할 수 있으므로, 이를 단일 XY-믹서로 표현할 수 있다. 둘째, 인접한 변수가 단 하나뿐인 변수는 결정론적으로 고정할 수 있어, 문제의 규모와 복잡도를 줄일 수 있다.
- 제약 조건 해결: 전처리기에서는 각 제약 조건을 개별적으로 처리합니다. 제약 조건이 원-핫(one-hot) 제약 조건인 경우, XY-믹서를 통해 이를 적용할 수 있습니다. 세트 패킹 제약 조건인 경우, 먼저 원-핫 제약 조건으로 변환됩니다. 등식 제약 조건은 2차 페널티를 통해 처리되며, 부등식 제약 조건은 비대칭 페널티를 통해 처리됩니다.
- 페널티 도출: 원-핫 등가 제약 조건으로 표현할 수 없는 제약 조건은 페널티 항으로 변환됩니다. 최적화기는 문제 구조로부터 페널티 강도를 자동으로 도출합니다.
- 반복적 웜스타트 : 최적화기는 여러 개의 웜스타트 체인을 병렬로 실행합니다. 각 체인은 변수 할당에 대한 확률 분포를 포함하고 있으며, 이는 QAOA 회로의 초기 확률(웜스타트 상태)로 사용된다. 각 반복 단계에서 체인은 양자 회로에서 샘플을 추출하고, 고전적 사후 처리를 적용한 뒤, 샘플의 발생 여부에 따라 분포를 업데이트합니다. 반복 과정을 거치면서, 이 방법은 변분 최적화 루프 없이도 고품질의 해를 중심으로 탐색을 집중시킵니다.
체인 수 (num_parallel), 체인당 총 샷 예산 (total_shots), QAOA 반복 횟수 (reps)는 솔루션 품질과 실행 시간 간의 균형을 조절하는 주요 제어 요소입니다.
벤치마크
아래 벤치마크 결과는 Qiskit의 ‘Constrained Quantum Optimizer’ 함수가 100개 이상의 이진 변수를 가진 제약 최적화 문제에 대해 고품질의 실행 가능한 해를 도출할 수 있음을 보여줍니다. 정확도는 구해진 목표값과 알려진 최적값의 비율이다. 실행 시간은 함수 호출부터 결과 반환까지의 실제 경과 시간입니다. QPU 사용량은 과금 대상인 양자 컴퓨팅 시간입니다.
본 연구에서는 최대 독립 집합 (MIS) 문제와 Max Cut 문제, 두 가지 범주로 확장된 잘 알려진 MaxCut 문제를 검토하였다. Max- -Cut은 또한 그래프 채색 결정 문제와 동등한 최적화 문제이기도 합니다(모든 간선이 잘려나갔을 때, 해당 그래프는 -색칠 가능합니다).
문제 | 변수 | 제한조건 | 큐비트 | 정확도 | 실행 가능성 | 총 실행 시간 (초) | QPU 사용 시간 (초) | 총 슛 횟수 |
|---|---|---|---|---|---|---|---|---|
| MIS es60fst02 | 186 | 280 | 124 | 100.0% | 예 | 940.2 | 147.0 | 25.0k |
| MIS sloane_2dc_128 | 128 | 5173 | 74 | 100.0% | 예 | 347.6 | 106.0 | 12.5k |
| Max-3-Cut 가라테 동아리 | 99 | 33 | 99 | 98.7% | 예 | 279.5 | 166.0 | 25.0k |
| Max-4-Cut 가라테 동아리 | 132 | 33 | 132 | 100.0% | 예 | 258.3 | 200.0 | 25.0k |
벤치마크 참고
- 위의 결과는
ibm_marrakeshHeron r2 프로세서에서 기본 옵션을 적용하고 를 활성화한use_session상태에서 얻어진 것입니다. 예를sloane_2dc_128들어,total_shots=12500가 사용되었습니다. - MIS 사례에서 큐비트 수가 감소한 것(변수 74개 및 124개 대 128개 및 186개)은 전처리 단계에서 변수를 고정했기 때문인 것으로 나타납니다.
- MIS에 대한 문제 인스턴스는 양자 최적화 벤치마킹 라이브러리 (Quantum Optimization Benchmarking Library)에서 가져왔습니다. - 최대- -컷(Max--Cut) 문제에 대한 인스턴스는 색수(chromatic number)가 5인 ‘Zachary Karate Club’ 그래프입니다.
시작하기
이 가이드에서는 Constrained Quantum Optimizer 함수를 불러오는 방법과 간단한 문제를 실행하는 방법을 통해 이 도구의 기본적인 사용법을 설명합니다. 더 심도 있는 튜토리얼을 보려면 “Aqarios 제약 조건 기반 양자 최적화기를 사용하여 최대 독립 집합 찾기”를 참조하십시오.
IBM Quantum API 키와 인스턴스 CRN 로 인증한 다음, 카탈로그에서 함수를 불러오세요.
다음 코드는 사용자가 인증 정보를 저장해 두었다고 가정합니다. 설정하려면 ‘ IBM Cloud 계정 인증 정보 저장’에 있는 지침을 따르세요.
from qiskit_ibm_catalog import QiskitFunctionsCatalog
catalog = QiskitFunctionsCatalog(channel="ibm_quantum_platform")
# Verify that you have access to the function
catalog.list()Output:
[QiskitFunction(aqarios/constrained-quantum-optimizer)]
# Load the function
optimizer = catalog.load("aqarios/constrained-quantum-optimizer")# Check the list of backends you have access to
catalog.backends()Output:
[<IBMBackend('ibm_pittsburgh')>,
<IBMBackend('ibm_boston')>,
<IBMBackend('ibm_phoenix')>,
<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_miami')>,
<IBMBackend('ibm_marrakesh')>,
<IBMBackend('ibm_kingston')>]
# Select the backend you want to use
backend = catalog.backend("ibm_phoenix")예 1: 간단한 제약 조건이 있는 문제
첫 번째 예제는 운영 연구 분야에서 흔히 사용되는 최적화 문제 사양인 LP 파일을 사용하여 이 함수를 활용하는 방법을 보여줍니다. 다음과 같은 5개의 이진 변수 로 구성된 임의의 최적화 문제를, 두 가지 제약 조건 하에 수립하십시오:
1. 문제 정의하기
수학적 식을 다음과 같은 LP 문자열 형식으로 직접 표기하십시오:
lp_str = """\\Problem name: Example
Minimize
obj: [ 2 x_1 x_2 + 4 x_2 x_3 - 2 x_3 x_4 - 4 x_4 x_5 - 4 x_1 x_3 - 8 x_2 x_5 ] / 2
Subject To
c1: x_1 + x_2 + x_3 <= 1
c2: x_3 - x_4 + x_5 = 0
Binaries
x_1 x_2 x_3 x_4 x_5
End
"""LP 표준에 따라, 는 2차 목적 함수에 대해 필수적으로 사용해야 [...] / 2 하는 표기법임을 유의하십시오.
2. 최적화기를 실행합니다
최적화기를 사용하여 문제를 해결하십시오.
# Set up low-resource options for the simple problem
options = {"total_shots": 2000, "num_parallel": 5, "use_session": True}
# Dispatch the job
job_1 = optimizer.run(
problem=lp_str, backend_name=backend.name, options=options
)
print(f"Job ID: {job_1.job_id}")Output:
Job ID: 2e06a3a8-7c29-4c76-94d7-194293363f4a
# Monitor the job status
job_1.status()Output:
'RUNNING: WAITING_FOR_QPU'
3. 결과 가져오기
변수 이름을 해당 할당값에 대응시키는 이 해결책은 결과에서 확인할 수 있습니다.
result = job_1.result()
resultOutput:
{'solutions': [{'x_1': 0, 'x_2': 1, 'x_3': 0, 'x_4': 1, 'x_5': 1}],
'solution_bitstrings': ['01011'],
'raw_energy': -6.0,
'objective_value': -6.0,
'feasible': True,
'metadata': {'resource_usage': {'RUNNING: MAPPING': {'CPU': 5.405},
'RUNNING: OPTIMIZING_FOR_HARDWARE': {'CPU': 9.902},
'RUNNING: WAITING_FOR_QPU': {'CPU': 25.456},
'RUNNING: EXECUTING_QPU': {'CPU': 25.202},
'RUNNING: POST_PROCESSING': {'CPU': 6.481}},
'circuit_metrics': {'before_transpilation': {'num_qubits': 6,
'gate_count': 42,
'depth': 15,
'two_qubit_gate_count': 12,
'two_qubit_gate_depth': 7,
'operations': {'rz': 12,
'p': 8,
'ry': 7,
'rzz': 4,
'cx': 3,
'xx_plus_yy': 3,
'global_phase': 2,
'cry': 2,
'x': 1}},
'after_transpilation': {'num_qubits': 6,
'gate_count': 254,
'depth': 100,
'two_qubit_gate_count': 48,
'two_qubit_gate_depth': 33,
'operations': {'rz': 78, 'sx': 122, 'cz': 48, 'measure': 6, 'x': 0}}},
'solver_info': {'variable_mapping': {'x_1': 0,
'x_2': 1,
'x_3': 2,
'x_4': 3,
'x_5': 4}}}}
반환 사전의 solutions 필드에는 발견된 모든 퇴화 최적 해가, 각 변수 이름을 해당 할당값에 매핑하는 사전 형태로 포함되어 있습니다. 동일한 해답들은 비트열로도 반환되며 solution_bitstrings, 는 비트열의 어느 문자 위치가 어느 변수에 해당하는지 알려줍니다 metadata.solver_info.variable_mapping . 해답 데이터와 함께, objective_value, 플래그 feasible , 그리고 추가적인 가 metadata 제공됩니다.
예 2: 최대 독립 집합
최대 독립 집합(MIS) 문제는, 그래프 내에서 어떤 두 정점도 서로 변을 공유하지 않는 정점들의 최대 부분집합을 구하는 문제입니다. 이 예제는 12개의 정점을 가진 정규 그래프에서 MIS 문제를 해결합니다. 이 문제에 대한 자세한 내용과 더 자세한 예제는 튜토리얼을 참조하십시오.
이 문제는 qiskit-addon-opt-mapper를 사용하여 구축되었습니다. 필요한 경우 필요한 패키지를 설치하십시오:
# %pip install networkx qiskit-addon-opt-mapper1단계: 문제 정의하기
무작위로 3-정규 그래프를 생성하고 MIS 최적화 문제를 설정하십시오. 각 그래프 노드는 이진 변수가 되며, 각 간선은 한쪽 끝점만 선택되도록 보장하는 제약 조건을 도입합니다.
import networkx as nx
from qiskit_addon_opt_mapper.applications import IndependentSet
from qiskit_addon_opt_mapper.translators import to_docplex_mp
# 12-node random 3-regular graph
G = nx.random_regular_graph(3, 12, seed=7)
# Build MIS problem and export as LP string
mis = IndependentSet(G)
mis_problem = mis.to_optimization_problem()
lp_str = to_docplex_mp(mis_problem).export_as_lp_string()
print(lp_str)Output:
\ This file has been generated by DOcplex
\ ENCODING=ISO-8859-1
\Problem name: Independent set
Maximize
obj: x_0 + x_1 + x_2 + x_3 + x_4 + x_5 + x_6 + x_7 + x_8 + x_9 + x_10 + x_11
Subject To
c0: x_0 + x_4 <= 1
c1: x_0 + x_9 <= 1
c2: x_0 + x_8 <= 1
c3: x_1 + x_2 <= 1
c4: x_1 + x_7 <= 1
c5: x_1 + x_3 <= 1
c6: x_2 + x_4 <= 1
c7: x_2 + x_11 <= 1
c8: x_3 + x_10 <= 1
c9: x_3 + x_11 <= 1
c10: x_4 + x_5 <= 1
c11: x_5 + x_10 <= 1
c12: x_5 + x_6 <= 1
c13: x_6 + x_8 <= 1
c14: x_6 + x_7 <= 1
c15: x_7 + x_9 <= 1
c16: x_8 + x_11 <= 1
c17: x_9 + x_10 <= 1
Bounds
0 <= x_0 <= 1
0 <= x_1 <= 1
0 <= x_2 <= 1
0 <= x_3 <= 1
0 <= x_4 <= 1
0 <= x_5 <= 1
0 <= x_6 <= 1
0 <= x_7 <= 1
0 <= x_8 <= 1
0 <= x_9 <= 1
0 <= x_10 <= 1
0 <= x_11 <= 1
Binaries
x_0 x_1 x_2 x_3 x_4 x_5 x_6 x_7 x_8 x_9 x_10 x_11
End
2단계: 최적화 도구 실행
최적화기를 사용하여 문제를 해결하십시오.
options = {"total_shots": 2000, "use_session": True}
# Dispatch the job
job_2 = optimizer.run(
problem=lp_str, backend_name=backend.name, options=options
)
print(f"Job ID: {job_2.job_id}")Output:
Job ID: f041431c-b42e-4627-afe5-522fea61faf6
# Monitor the job status
job_2.status()Output:
'QUEUED'
3단계: 결과 확인 및 해석
마지막으로 해를 구한 뒤 그 정답 여부를 확인합니다.
result = job_2.result()
print(f"Feasible: {result['feasible']}")
print(f"Independent set size: {int(result['objective_value'])}")
# Extract the selected nodes
solution = result["solutions"][0]
independent_set = [
int(k.split("_")[1]) for k, v in solution.items() if v == 1
]
print(f"Selected nodes: {sorted(independent_set)}")
# Verify no two selected nodes share an edge
conflicts = [
(u, v)
for u, v in G.edges()
if u in independent_set and v in independent_set
]
print(f"Edge conflicts: {conflicts}")Output:
Feasible: True
Independent set size: 5
Selected nodes: [1, 4, 6, 9, 11]
Edge conflicts: []
예 3: 그래프 3색 채색 ( Max-3-Cut )
Max- -Cut 문제는 그래프의 정점을 개의 그룹으로 나누어, 양 끝점이 서로 다른 그룹에 속하는 변의 개수를 최대화하는 문제입니다. 의 경우, 이는 색 간 에지를 최대화하는 3-채색을 찾는 것과 동일합니다.
형식적으로, 각 노드 를 이진 변수 를 가진 그룹 중 하나에 할당하며, 이 변수들은 색상 을 나타냅니다. 각 노드에 대한 원-핫 제약 조건 은 고유한 할당을 보장합니다. 이 목표 함수는 그룹 간 에지를 최대화합니다:
원-핫 제약 조건은 XY-믹서에 이상적이며, 최적화기는 이를 기본적으로 처리합니다.
이 예제에서는 Zachary Karate Club 그래프 (노드 34개, 간선 78개)를 사용하여 Luna Model로 모델을 구축합니다. 필요한 경우 필요한 패키지를 설치하십시오:
# %pip install networkx matplotlib luna-model1단계: 문제 정의하기
먼저, 패키지를 luna-model 사용하여 이진 변수를 생성합니다. 그런 다음, 목표를 정의하고 모델에 제약 조건을 추가하십시오.
import networkx as nx
from luna_model import Model, quicksum
k = 3
G = nx.karate_club_graph()
# Instantiate the Model object
model = Model(name="Max-3-Cut")
# Add binary variables
x = model.add_variables("x", shape=(G.number_of_nodes(), k))
# Add the objective by using the numpy dot abstraction
model.objective = quicksum(x[i].dot(x[j]) for i, j in G.edges)
# Bulk-add the one-hot constraints
model.add_constraints(x.sum(axis=1) == 1)
# Encode the model to send via API
model_enc = model.encode_b64()2단계: 최적화 도구 실행
최적화기를 사용하여 문제를 해결하십시오.
options = {"use_session": True}
# Dispatch the job
job_3 = optimizer.run(
problem=model_enc, backend_name=backend.name, options=options
)
print(f"Job ID: {job_3.job_id}")Output:
Job ID: df911d83-9df7-44a1-bfad-5d66e08676c3
# Monitor the job status
job_3.status()Output:
'RUNNING: WAITING_FOR_QPU'
3단계: 결과 가져오기 및 시각화
결과를 가져와 시각화합니다.
result = job_3.result()
solution = result["solutions"][0]
# Map each node to its assigned color group
node_group = {}
for i in G.nodes:
for c in range(k):
if solution[f"x{i},{c}"] == 1:
node_group[i] = c
print(f"Feasible: {result['feasible']}")
print(f"Violations: {int(result['objective_value'])}")
# Visualize the partition
colors = ["tab:blue", "tab:orange", "tab:green"]
node_colors = [colors[node_group[i]] for i in G.nodes()]
nx.draw(G, nx.kamada_kawai_layout(G), node_color=node_colors, node_size=200)Output:
Feasible: True
Violations: 4
변경 로그
[0.4.0] - 2026년 9월 22일
중요 변경사항
- 입력 매개변수의 이름을 로
model변경했습니다problem. - 출력 필드의 이름을 로
obj_value변경했습니다objective_value. - 옵션을
postprocessing로 대체했는데postprocessing_level, 이 옵션은 문자열 대신[0, 3]범위의 정수를 입력값으로 받습니다. 이전 값들은"off"->0,"weak"->1,"medium"->2,"strong"-> 로 매핑되며3, 기본값은 로 변경되지 않습니다3. - 재구성되었습니다
metadata.circuit_metrics. 이제 평균 게이트 수를 담은 단일 평면 사전 대신after_transpilation, 와before_transpilation에 대해num_qubits,gate_count,depth,two_qubit_gate_count,two_qubit_gate_depth, 및 을 각각 별도로operations보고합니다. 이 필드는 전처리 단계에서 문제가 해결되었고 회로 실행이 수행되지 않은 경우None(오류 코드4712)에 표시됩니다.
기능
- 실행 간에 회로 합성 및 배선 결과를 재현할 수 있도록 하는 옵션을
seed_transpiler추가했습니다. - 이 함수가 제출하는 모든 Qiskit Runtime 작업에 사용자 정의 태그를 추가할 수 있는
job_tags옵션이 추가되었습니다. - 출력 필드를 추가하여
solution_bitstrings, 와 동일한 해를 비트 문자열 형태로solutions반환합니다. - 각 변수 이름을 의 항목 내에서의 문자 위치에 매핑하는 를 추가했습니다
metadata.solver_info.variable_mapping``solution_bitstrings.
문서
- 연속형(실수형) 변수는 지원되지 않으며, 정수형 변수의 경우 명시적인 범위를 지정해야 한다는 점이 문서화되었습니다. 이러한 모델은 오류 코드 와 함께 오류가 발생합니다
4710.
지원 받기
질문이나 문제가 있는 경우, 작업 ID를 기재하여 [email protected] 으로 문의해 주십시오.
다음 단계
- Aqarios의 Constrained Quantum Optimizer에 대한 액세스 권한을 요청하세요.
- 전체 매개변수 및 출력 관련 문서를 보려면 API 참조 문서를 확인하세요.
- Aqarios 제약 조건 기반 양자 최적화기를 활용한 ‘최대 독립 집합 찾기 ’ 튜토리얼을 통해 실제 QOBLIB 벤치마크 인스턴스를 심층적으로 살펴보세요.
- “반복적 웜스타트 XY-믹서를 이용한 제약 조건 하의 양자 최적화(Constrained Quantum Optimization via Iterative Warm-Start XY-Mixers)” 논문을 검토해 보십시오.
참조
- Bucher 외 (2026), *반복적 웜스타트 XY-믹서를 이용한 제약 조건이 있는 양자 최적화 *10.1088/1367-2630/ae8ea2