D-Wave 세계에서 'Hello World'에 해당하는 것은 2D 바둑판 예입니다. 이 예에서는 4 개의 노드가있는 다음 사각형 그래프가 제공됩니다.
하자 우리가 정점 색상되도록 정의 검은 경우 σ 전 = - 1 과 경우 흰색 σ 전 = + 1 . 목표는 그래프에 4 개의 정점이있는 바둑판 패턴을 만드는 것입니다. 이 결과를 얻기 위해 h 와 J 를 정의하는 다양한 방법
이 있습니다. 우선,이 문제에 대한 두 가지 가능한 해결책이 있습니다.σ나는σ나는= − 1σ나는= + 1hJ
D-Wave 양자 어 닐러는 우리가 정의한 Ising Hamiltonian을 최소화하며 다른 커플러 설정의 영향을 이해하는 것이 중요합니다. 예를 들어 커플러를 고려하십시오 .J0 , 1
우리로 설정하면 모두 큐 비트가 동일한 값을 가지고있는 경우, 해밀 토니안은 최소화된다. 우리는 부정적인 커플러가 서로 관련이 있다고 말합니다 . 우리로 설정하면 반면 J 0 , 1 = + 1 개의 큐빗 반대 값을 가질 경우, 해밀 토니안은 최소화된다. 따라서 포지티브 커플러는 상호 상관 됩니다.J0 , 1= − 1J0 , 1= + 1
바둑판 예제에서, 우리는 다음 해밀턴 인을 야기하는 각 인접 큐 비트 쌍을 반 상관 시키려고합니다.
H= σ0σ1+ σ0σ2+ σ1σ삼+ σ2σ삼
0σ0= − 1h0= 1
H= σ0+ σ0σ1+ σ0σ2+ σ1σ삼+ σ2σ삼
코드를 작성하겠습니다!
참고 : 모든 것이 작동하려면 D-Wave의 클라우드 서비스에 액세스해야합니다.
우선, dwave_sapi2
( https://cloud.dwavesys.com/qubist/downloads/ ) Python 패키지가 설치되어 있는지 확인하십시오 . D-Wave는 현재 더 높은 Python 버전을 지원하지 않기 때문에 모든 것이 Python 2.7이 될 것입니다. 즉, 필수 사항을 가져 오십시오.
from dwave_sapi2.core import solve_ising
from dwave_sapi2.embedding import find_embedding, embed_problem, unembed_answer
from dwave_sapi2.util import get_hardware_adjacency
from dwave_sapi2.remote import RemoteConnection
D-Wave Solver API에 연결하려면 SAPI 솔버, SAPI URL에 유효한 API 토큰이 필요하며 사용할 양자 프로세서를 결정해야합니다.
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
데드 큐 비트가없는 완전한 기능을 갖춘 칩인 D-Wave 2000Q VFYC (Virtual Full Yield Chimera)를 사용하는 것이 좋습니다! 키메라 칩 레이아웃은 다음과 같습니다.
이 시점에서 튜토리얼을 두 개의 별개의 조각으로 나눕니다. 첫 번째 섹션에서는 키메라 하드웨어 그래프에 문제를 수동으로 포함시키고 두 번째 섹션에서는 D-Wave의 내장 휴리스틱을 사용하여 하드웨어 임베딩을 찾습니다.
수동 임베딩
위의 D-Wave 2000Q 칩 레이아웃에서 왼쪽 상단의 단위 셀은 다음과 같습니다.
010 → 01 → 42 → 73 → 3hJ
J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]
h
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
이제 판독 횟수를 정의하고 answer_mode
결과를 이미 발생 횟수별로 정렬하는 "히스토그램"으로 선택할 수 있습니다. 이제 D-Wave 양자 어 닐러를 사용하여 Ising 인스턴스를 해결할 준비가되었습니다.
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
다음과 같은 결과가 나타납니다.
{
'timing': {
'total_real_time': 1655206,
'anneal_time_per_run': 20,
'post_processing_overhead_time': 13588,
'qpu_sampling_time': 1640000,
'readout_time_per_run': 123,
'qpu_delay_time_per_sample': 21,
'qpu_anneal_time_per_sample': 20,
'total_post_processing_time': 97081,
'qpu_programming_time': 8748,
'run_time_chip': 1640000,
'qpu_access_time': 1655206,
'qpu_readout_time_per_sample': 123
},
'energies': [-5.0],
'num_occurrences': [10000],
'solutions': [
[1, 3, 3, 1, -1, 3, 3, -1, {
lots of 3 's that I am omitting}]]}
energies
− 5.0삼0 → 04 → 17 → 23 → 3[ 1 , − 1 , − 1 , 1 ]
휴리스틱 임베딩
Jh
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
다시 원격 연결을 설정하고 D-Wave 2000Q VFYC 솔버 인스턴스를 얻습니다.
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
문제가 포함 된 것을 찾으려면 먼저 현재 하드웨어 그래프의 인접 행렬을 가져와야합니다.
adjacency = get_hardware_adjacency(solver)
이제 우리의 문제가 포함 된 것을 찾아 보자.
embedding = find_embedding(J.keys(), adjacency)
대규모 Ising 인스턴스를 처리하는 경우 여러 스레드에서 임베드를 검색하고 (여러 CPU에 대해 병렬로) 체인 길이가 가장 작은 임베딩을 선택하십시오! 체인 여러 큐빗 접속도를 증가시키기 위해 하나의 큐 비트의 역할을해야만하는 경우이다. 그러나 체인이 길수록 체인이 파손될 가능성이 높습니다. 그리고 깨진 사슬은 나쁜 결과를 낳습니다!
이제 그래프에 문제를 포함시킬 준비가되었습니다.
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
jc
J
J = j0.copy()
J.update(jc)
이제 임베디드 문제를 해결할 준비가되었습니다.
params = {"answer_mode": 'histogram', "num_reads": 10000}
raw_results = solve_ising(solver, h, J, **params)
print 'Lowest energy found: {}'.format(raw_results['energies'])
print 'Number of occurences: {}'.format(raw_results['num_occurrences'])
는 raw_results
우리가 문제를 unembed하지 않는 한 우리에게 이해가되지 않습니다. 경우에 따라 일부 체인이 끊어지면 선택적 인수로 정의 된 과반수의 투표로 고정합니다 broken_chains
.
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
이를 실행하면 모든 판독 값에서 올바른 결과를 얻을 수 있습니다.
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
나는이 질문에 대한 답변과 내가보기 엔 당신이에 통과 할 수있는 모든 추가 매개 변수를 체크 아웃하는 것이 좋습니다 희망 solve_ising
과 같은 솔루션의 품질을 향상시키기 위해 기능 num_spin_reversal_transforms
이나 postprocess
.