D-Wave dünyasında 'Hello World' eşdeğeri 2B dama tahtası örneğidir. Bu örnekte, 4 düğümlü aşağıdaki kare grafiği verilmiştir:
Şimdi σ i = - 1 ise siyahını ve σ i = + 1 ise beyazı verdiğimizi tanımlayalım . Amaç, grafikteki dört köşeli bir dama tahtası deseni oluşturmaktır. H tanımlamanın çeşitli yolları vardır
σbenσben= - 1σben= + 1hBu sonucu elde etmek için ve . Her şeyden önce, bu sorunun iki olası çözümü vardır:J
D-Wave kuantum tavlayıcısı, tanımladığımız Ising Hamiltonian'ı minimize eder ve farklı kupler ayarlarının etkisini anlamak önemlidir. Örneğin düşünün bağlaştırıcısını:J0 , 1
ayarlarsak , her iki litre de aynı değeri alırsa Hamiltonian simge durumuna küçültülür. Negatif kuplörlerin korele olduğunu söylüyoruz . J 0 , 1 = + 1 olarak ayarlarsak , iki litre ters değerleri alırsa Hamiltonian simge durumuna küçültülür. Böylece, pozitif bağlaştırıcılar korelasyon yapmazlar .J0 , 1= - 1J0 , 1= + 1
Dama Tahtası örneğinde, aşağıdaki Hamiltonian'a yol açan her bir çift komşu çiftinin anti-korelasyonunu yapmak istiyoruz:
'H= σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Gösteri uğruna, biz de bir önyargı kelimesini ekle biz sadece çözüm 1. olsun öyle ki -th QuBit. Bu çözüm σ 0 = - 1 gerektirir ve bu nedenle önyargısını h 0 olarak belirleriz.0σ0= - 1 . Son Hamiltonian şimdi:h0= 1
'H= σ0+ σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Öyleyse kodlayalım!
NOT: Çalışması için D-Wave'in Bulut Hizmeti'ne erişmeniz GEREKİR.
Her şeyden önce, elinizde olduğundan emin olun. dwave_sapi2
( https://cloud.dwavesys.com/qubist/downloads/ ) Python paketinin kurulu . Her şey Python 2.7 olacak çünkü D-Wave şu anda daha yüksek bir Python sürümünü desteklemiyor. Olduğu söyleniyor, hadi şartları ithal edelim:
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 Çözücü API'sine bağlanmak için kendi SAPI çözücüsü, SAPI URL'si için geçerli bir API belirtecine ve hangi kuantum işlemciyi kullanmak istediğinize karar vermeniz gerekir:
DWAVE_SAPI_URL = 'https://cloud.dwavesys.com/sapi'
DWAVE_TOKEN = [your D-Wave API token]
DWAVE_SOLVER = 'DW_2000Q_VFYC_1'
D-Wave 2000Q Sanal Tam Verimli Chimera'yı (VFYC) kullanmanızı öneririz; İşte Chimera yonga düzeni:
Bu noktada öğreticiyi iki ayrı parçaya böldüm. Birinci bölümde, sorunu Chimera donanım grafiğine manüel olarak yerleştiriyoruz ve ikinci bölümde donanım gömme bulmak için D-Wave'in gömme sezgisini kullanıyoruz.
Manuel gömme
Yukarıdaki D-Wave 2000Q yonga düzeninde sol üst köşedeki birim hücre şöyle görünür:
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)
Artık okuma sayısını tanımlayabiliriz ve answer_mode
sonuçları bizim için oluşum sayısına göre sıralayan "histogram" olmayı seçebiliriz . Şimdi Ising örneğini D-Wave quantum annealer ile çözmeye hazırız:
params = {"answer_mode": 'histogram', "num_reads": 10000}
results = solve_ising(solver, h, J, **params)
print results
Aşağıdaki sonucu almalısınız:
{
'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}]]}
Gördüğünüz gibi biz doğru taban durumu enerjisi var ( energies
) ait- 5.030 → 04 → 17 → 23 → 3[ 1 , - 1 , - 1 , 1 ]
Sezgisel yerleştirme
Jh
J = {(0,1): 1, (0,2): 1, (1,3): 1, (2,3): 1}
h = [-1,0,0,0]
Uzaktan bağlantıyı tekrar kurar ve D-Wave 2000Q VFYC çözücü örneğini alırız:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
Sorunumuzu yerleştirmek için önce mevcut donanım grafiğinin bitişik matrisini almamız gerekir:
adjacency = get_hardware_adjacency(solver)
Şimdi sorunumuza bir yer bulmaya çalışalım:
embedding = find_embedding(J.keys(), adjacency)
Büyük Ising örnekleriyle uğraşıyorsanız, birden fazla iş parçacığı içindeki gömmeleri (birden fazla CPU'ya paralel olarak) aramak ve ardından en küçük zincir uzunluğuna sahip gömmeyi seçmek isteyebilirsiniz! bir zincir , bağlantı derecesini arttırmak için birden fazla litrenin tek bir litre gibi davranmaya zorlanmasıdır. Bununla birlikte, zincir ne kadar uzun olursa, kırılma olasılığı o kadar yüksektir. Ve kırılmış zincirler kötü sonuçlar veriyor!
Şimdi sorunumuzu grafiğe yerleştirmeye hazırız:
[h, j0, jc, embeddings] = embed_problem(h, J, embedding, adjacency)
j0
jc
J
J = j0.copy()
J.update(jc)
Şimdi, gömülü sorunu çözmeye hazırız:
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
Biz sorunu unembed sürece bize mantıklı olmayacaktır. Bazı zincirler kırıldıysa, isteğe bağlı argüman tarafından tanımlanan çoğunluk oyu ile bunları düzeltiyoruz broken_chains
:
unembedded_results = unembed_answer(raw_results['solutions'],
embedding, broken_chains='vote')
print 'Solution string: {}'.format(unembedded_results)
Bunu çalıştırırsanız, tüm okumalarda doğru sonucu almalısınız:
Lowest energy found: [-5.0]
Number of occurences: [10000]
Solution string: [[1, -1, -1, 1]]
Umarım bu sorunuza cevap verdi ve ya da solve_ising
gibi çözümlerin kalitesini artırmak için işleve geçebileceğiniz tüm ek parametreleri kontrol etmenizi şiddetle tavsiye ederim .num_spin_reversal_transforms
postprocess