'Hello World' ที่เทียบเท่ากันในโลก D-Wave เป็นตัวอย่างตารางหมากรุกแบบ 2 มิติ ในตัวอย่างนี้คุณจะได้รับกราฟสี่เหลี่ยมต่อไปนี้ที่มี 4 โหนด:
ให้กำหนดว่าเราสีจุดสุดยอดสีดำถ้าและสีขาวถ้า1 เป้าหมายคือการสร้างรูปแบบกระดานหมากรุกที่มีสี่จุดยอดในกราฟ มีหลายวิธีในการกำหนด
และเพื่อให้ได้ผลลัพธ์นี้ ก่อนอื่นมีวิธีแก้ไขสองวิธีที่เป็นไปได้สำหรับปัญหานี้:σiσi=−1σi=+1hJ
ตัวลดควอนตัม D-Wave ช่วยลด Ising Hamiltonian ที่เรากำหนดไว้และเป็นสิ่งสำคัญที่จะต้องเข้าใจผลกระทบของการตั้งค่าตัวเชื่อมต่อต่างๆ ลองพิจารณาตัวอย่างตัวเชื่อมต่อ :J0,1
หากเราตั้งค่าเป็นค่า Hamiltonian จะลดลงถ้า qubits ทั้งสองใช้ค่าเดียวกัน เราบอกว่าเพลาเชิงลบความสัมพันธ์ ในขณะที่ถ้าเราตั้งค่าเป็น , Hamiltonian จะถูกย่อให้เล็กสุดถ้าสอง qubits รับค่าตรงข้าม ดังนั้นเพลาบวกต่อต้านความสัมพันธ์J0,1=−1J0,1=+1
ในตัวอย่างตารางหมากฮอสเราต้องการต่อต้านความสัมพันธ์ของคู่ qubits ที่อยู่ใกล้เคียงซึ่งก่อให้เกิด Hamiltonian ต่อไปนี้:
H=σ0σ1+σ0σ2+σ1σ3+σ2σ3
เพื่อประโยชน์ในการสาธิตเรายังเพิ่มคำอคติบนควิบิตซึ่งเราได้ทางออกที่ 1 เท่านั้น วิธีการแก้ปัญหานี้ต้องและเราจึงตั้งอคติของ 1 มิลโตเนียนสุดท้ายคือตอนนี้:0σ0=−1h0=1
H=σ0+σ0σ1+σ0σ2+σ1σ3+σ2σ3
ดังนั้นให้รหัสมันขึ้นมา!
หมายเหตุ: คุณจำเป็นต้องเข้าถึงบริการคลาวด์ของ D-Wave เพื่อให้ทุกอย่างทำงาน
ก่อนอื่นตรวจสอบให้แน่ใจว่าคุณได้ติดตั้งแพคเกจหลามdwave_sapi2
( https://cloud.dwavesys.com/qubist/downloads/ ) ทุกอย่างจะเป็น Python 2.7 เนื่องจากปัจจุบัน D-Wave ไม่รองรับ Python เวอร์ชั่นที่สูงกว่า ที่ถูกกล่าวมาลองนำเข้าสิ่งจำเป็น:
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 คุณจะต้องใช้โทเค็น API ที่ถูกต้องสำหรับตัวแก้ SAPI ของพวกเขา, URL ของ SAPI และคุณต้องตัดสินใจว่าต้องการใช้โปรเซสเซอร์ตัวใด
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
ฉันขอแนะนำให้ใช้ Chimera เสมือนจริงให้ผลตอบแทนเต็มที่กับ D-Wave 2000Q (VFYC) ซึ่งเป็นชิปที่ทำงานได้อย่างสมบูรณ์โดยไม่มี qubits ที่ตายแล้ว! นี่คือเค้าโครงชิป Chimera:
ณ จุดนี้ฉันแยกการสอนออกเป็นสองส่วน ในส่วนแรกเราจะฝังปัญหาด้วยตนเองลงในกราฟฮาร์ดแวร์ Chimera และในส่วนที่สองเราใช้การวิเคราะห์พฤติกรรมการฝังตัวของ D-Wave เพื่อค้นหาการฝังฮาร์ดแวร์
คู่มือการฝัง
เซลล์หน่วยที่มุมซ้ายบนของโครงร่างชิพ D-Wave 2000Q ด้านบนมีลักษณะดังนี้:
โปรดทราบว่า couplers ทั้งหมดไม่สามารถมองเห็นได้ในภาพนี้ อย่างที่คุณเห็นไม่มีข้อต่อระหว่าง qubitและ qubitซึ่งเราจะต้องนำกราฟสแควร์ของเราไปใช้โดยตรง นั่นเป็นเหตุผลที่เรากำลังสร้างนิยามใหม่ , ,และ3จากนั้นเราจะดำเนินการต่อและกำหนดเป็นรายการและเป็นพจนานุกรม: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มี 8 รายการตั้งแต่เราใช้ qubits 0 ถึง 7 ตอนนี้เราสร้างการเชื่อมต่อกับ Solver API และขอ D-Wave 2000Q VFYC Solver:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
ตอนนี้เราสามารถกำหนดจำนวนการอ่านข้อมูลและเลือกanswer_mode
ให้เป็น "ฮิสโตแกรม" ซึ่งเรียงลำดับผลลัพธ์ตามจำนวนครั้งที่เกิดขึ้นกับเรา ตอนนี้เราพร้อมที่จะแก้ปัญหาอินสแตนซ์ Ising ด้วยเครื่องควอนตัม D-Wave:
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สตริงโซลูชันเต็มซึ่งเป็นผลลัพธ์เริ่มต้นสำหรับ qubits ที่ไม่ได้ใช้ / ไม่วัดและถ้าเราใช้การแปลงแบบย้อนกลับ - , ,และ - เราได้รับสตริงโซลูชันที่ถูกต้อง1] ทำ!−5.030→04→17→23→3[1,−1,−1,1]
ฮิวริสติกแบบฝัง
หากคุณเริ่มสร้างอินสแตนซ์ Ising ที่ใหญ่ขึ้นและใหญ่ขึ้นคุณจะไม่สามารถทำการฝังด้วยตนเองได้ ดังนั้นสมมติว่าเราไม่สามารถฝังตัวอย่างตารางหมากรุกของเราด้วยตนเองได้ และจากนั้นจะยังคงไม่เปลี่ยนแปลงจากคำจำกัดความเริ่มต้นของเรา: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 ของกราฟฮาร์ดแวร์ปัจจุบัน:
adjacency = get_hardware_adjacency(solver)
ตอนนี้ลองหาการฝังปัญหาของเรา:
embedding = find_embedding(J.keys(), adjacency)
หากคุณกำลังจัดการกับอินสแตนซ์ Ising ขนาดใหญ่คุณอาจต้องการค้นหา embeddings ในหลายเธรด (ขนานกับหลาย CPU) จากนั้นเลือกการฝังด้วยความยาวสายที่เล็กที่สุด! ห่วงโซ่คือเมื่อหลาย qubits ถูกบังคับให้ทำหน้าที่เป็นคิวบิตเดียวเพื่อเพิ่มระดับของการเชื่อมต่อ อย่างไรก็ตามยิ่งห่วงโซ่ยาวยิ่งมีโอกาสมาก และโซ่ที่แตกจะให้ผลที่ไม่ดี!
ตอนนี้เราพร้อมที่จะฝังปัญหาของเราลงบนกราฟ:
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
มีข้อต่อดั้งเดิมที่เรากำหนดและjc
มีข้อต่อที่บังคับใช้ความสมบูรณ์ของโซ่ (พวกมันสัมพันธ์กับ qubits ภายในกลุ่ม) ดังนั้นเราต้องรวมมันอีกครั้งในพจนานุกรมเล่มใหญ่: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