Tương đương 'Hello World' trong thế giới D-Wave là ví dụ về trình kiểm tra 2D. Trong ví dụ này, bạn được cung cấp biểu đồ hình vuông sau với 4 nút:
Hãy xác định rằng chúng ta tô màu đỉnh đen nếu σ i = - 1 và trắng nếu σ i = + 1 . Mục tiêu là tạo ra một mô hình bàn cờ với bốn đỉnh trong biểu đồ. Có nhiều cách định nghĩa
h và J để đạt được kết quả này. Trước hết, có hai giải pháp khả thi cho vấn đề này:σtôiσtôi= - 1σtôi= + 1hJ
Công cụ xác định lượng tử D-Wave giảm thiểu Ising Hamiltonian mà chúng ta xác định và điều quan trọng là phải hiểu tác động của các cài đặt bộ ghép khác nhau. Hãy xem xét ví dụ về bộ ghép :J0 , 1
Nếu chúng ta đặt nó thành , Hamilton sẽ được giảm thiểu nếu cả hai qubit có cùng giá trị. Chúng tôi nói các khớp nối tiêu cực tương quan . Trong khi đó, nếu chúng ta đặt nó thành J 0 , 1 = + 1 , Hamilton sẽ được giảm thiểu nếu hai qubit có giá trị ngược nhau. Do đó, các khớp nối tích cực chống tương quan .J0 , 1= - 1J0 , 1= + 1
Trong ví dụ về bàn cờ, chúng tôi muốn chống tương quan từng cặp qubit lân cận, điều này dẫn đến Hamiltonian sau:
H= σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
0σ0= - 1h0= 1
H= σ0+ σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Vì vậy, hãy mã hóa nó lên!
LƯU Ý: Bạn KHÔNG CẦN truy cập Dịch vụ đám mây của D-Wave để mọi thứ hoạt động.
Trước hết, hãy đảm bảo bạn đã cài đặt gói dwave_sapi2
( https://cloud.dwavesys.com/qubist/doads/ ). Mọi thứ sẽ là Python 2.7 vì D-Wave hiện không hỗ trợ bất kỳ phiên bản Python nào cao hơn. Điều đó đang được nói, hãy nhập các yếu tố cần thiết:
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
Để kết nối với API Bộ giải sóng D, bạn sẽ cần mã thông báo API hợp lệ cho bộ giải SAPI của họ, URL SAPI và bạn cần quyết định bộ xử lý lượng tử nào bạn muốn sử dụng:
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
Tôi khuyên bạn nên sử dụng D-Wave 2000Q Virtual Full Yield Chimera (VFYC), đây là một con chip đầy đủ chức năng mà không có bất kỳ qubit chết nào! Đây là cách bố trí chip Chimera:
Tại thời điểm này tôi đang chia hướng dẫn thành hai phần riêng biệt. Trong phần đầu tiên, chúng tôi đang nhúng thủ công sự cố vào biểu đồ phần cứng Chimera và trong phần thứ hai, chúng tôi đang sử dụng phương pháp phỏng đoán nhúng của D-Wave để tìm cách nhúng phần cứng.
Hướng dẫn nhúng
Ô đơn vị ở góc trên cùng bên trái trên bố trí chip D-Wave 2000Q ở trên trông như thế này:
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)
Bây giờ, chúng ta có thể xác định số lượng bài đọc và chọn answer_mode
là "biểu đồ" đã sắp xếp kết quả theo số lần xuất hiện cho chúng ta. Bây giờ chúng tôi đã sẵn sàng để giải quyết trường hợp Ising với công cụ xác định lượng tử D-Wave:
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
Bạn sẽ nhận được kết quả sau:
{
'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.030 → 04 → 17 → 23 → 3[ 1 , - 1 , - 1 , 1 ]
Heuristic nhúng
Jh
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
Chúng tôi lại thiết lập kết nối từ xa và lấy phiên bản của bộ giải D-Wave 2000Q VFYC:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
Để tìm ra sự nhúng của vấn đề của chúng tôi, trước tiên chúng tôi cần lấy ma trận kề của biểu đồ phần cứng hiện tại:
adjacency = get_hardware_adjacency(solver)
Bây giờ chúng ta hãy cố gắng tìm ra sự nhúng vào vấn đề của chúng ta:
embedding = find_embedding(J.keys(), adjacency)
Nếu bạn đang xử lý các trường hợp Ising lớn, bạn có thể muốn tìm kiếm các nhúng trong nhiều luồng (song song trên nhiều CPU) và sau đó chọn nhúng với độ dài chuỗi nhỏ nhất! Một chuỗi là khi nhiều qubit buộc phải hoạt động như một qubit duy nhất để tăng mức độ kết nối. Tuy nhiên, chuỗi càng dài thì càng dễ bị hỏng. Và chuỗi bị hỏng cho kết quả xấu!
Bây giờ chúng tôi đã sẵn sàng để nhúng vấn đề của chúng tôi vào biểu đồ:
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
jc
J
J = j0.copy()
J.update(jc)
Bây giờ, chúng tôi đã sẵn sàng để giải quyết vấn đề nhúng:
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'])
Điều đó raw_results
sẽ không có ý nghĩa với chúng tôi trừ khi chúng tôi giải quyết vấn đề. Trong trường hợp, một số chuỗi bị hỏng, chúng tôi đang sửa chúng thông qua một cuộc bỏ phiếu đa số như được xác định bởi đối số tùy chọn broken_chains
:
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
Nếu bạn chạy cái này, bạn sẽ nhận được kết quả chính xác trong tất cả các bài đọc:
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
Tôi hy vọng điều này đã trả lời câu hỏi của bạn và tôi khuyên bạn nên kiểm tra tất cả các tham số bổ sung mà bạn có thể chuyển đến solve_ising
hàm để cải thiện chất lượng của các giải pháp của bạn như num_spin_reversal_transforms
hoặc postprocess
.