Эквивалент «Hello World» в мире D-Wave является примером 2D шахматной доски. В этом примере вам дан следующий квадратный граф с 4 узлами:
Давайте определим, что мы окрашиваем вершину черный цвет, если и в белый цвет, если . Цель состоит в том, чтобы создать шаблон шахматной доски с четырьмя вершинами на графике. Существуют различные способы определения
и для достижения этого результата. Прежде всего, есть два возможных решения этой проблемы: σ i = - 1 σ i = + 1 ч Jσяσя= - 1σя= + 1часJ
Квантовый отжиг D-Wave минимизирует определяемый нами гамильтониан Изинга, и важно понимать влияние различных настроек соединителя. Рассмотрим, например, ответвитель:J0 , 1
Если мы установим его в , гамильтониан будет минимизирован, если оба кубита принимают одно и то же значение. Мы говорим, что негативные сцепки коррелируют . Принимая во внимание, что если мы установим его в , гамильтониан будет минимизирован, если два кубита принимают противоположные значения. Таким образом, положительные сцепки антикоррелируют .J 0 , 1 = + 1J0 , 1= - 1J0 , 1= + 1
В примере шахматной доски мы хотим антикоррелировать каждую пару соседних кубитов, что приводит к следующему гамильтониану:
ЧАС= σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Для демонстрации мы также добавляем смещающий член в кубит так, что мы получаем только решение № 1. Это решение требует и поэтому мы устанавливаем его смещение . Окончательный гамильтониан теперь:σ 0 = - 1 ч 0 = 10σ0= - 1час0= 1
ЧАС= σ0+ σ0σ1+ σ0σ2+ σ1σ3+ σ2σ3
Итак, давайте закодируем это!
ПРИМЕЧАНИЕ. Вам НУЖЕН доступ к облачной службе D-Wave, чтобы все работало.
Прежде всего, убедитесь, что у вас установлен пакет Python 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
Чтобы подключиться к API D-Wave Solver, вам потребуется действительный токен 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'
Я рекомендую использовать D-Wave 2000Q Virtual Full Yield Chimera (VFYC), который является полностью функциональным чипом без мертвых кубитов! Вот расположение чипов Chimera:
На данный момент я делю учебник на две отдельные части. В первом разделе мы вручную встраиваем проблему в граф аппаратного обеспечения Chimera, а во втором разделе мы используем эвристику встраивания D-Wave для поиска аппаратного встраивания.
Ручное встраивание
Элементарная ячейка в левом верхнем углу на схеме чипа D-Wave 2000Q выше выглядит следующим образом:
010 → 01 → 42 → 73 → 3часJ
J = {(0,4): 1, (4,3): 1, (3,7): 1, (7,0): 1}
h = [-1,0,0,0,0,0,0,0,0]
час имеет 8 записей, так как мы используем кубиты от 0 до 7. Теперь мы устанавливаем соединение с Solver API и запрашиваем решатель D-Wave 2000Q VFYC:
connection = RemoteConnection(DWAVE_SAPI_URL, DWAVE_TOKEN)
solver = connection.get_solver(DWAVE_SOLVER)
Теперь мы можем определить количество показаний и выбрать answer_mode
«гистограмму», которая уже сортирует результаты по количеству появлений для нас. Теперь мы готовы решить проблему Изинга с помощью квантового отжига 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.030 → 04 → 17 → 23 →3[ 1 , - 1 , - 1 , 1 ]
Эвристическое встраивание
Jчас
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, возможно, вы захотите найти вложения в несколько потоков (распараллеленных на нескольких процессорах), а затем выбрать вложение с наименьшей длиной цепочки! Цепь , когда несколько кубитов вынуждены действовать как единый кубит в целях повышения степени связности. Однако чем длиннее цепь, тем больше вероятность ее разрыва. И сломанные цепи дают плохие результаты!
Теперь мы готовы встроить нашу проблему в график:
[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
не будет иметь смысла для нас, если мы не решим проблему. В случае разрыва некоторых цепочек мы фиксируем их большинством голосов, как это определено необязательным аргументом 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
.