Решение задачи в QUBO при помощи сэмплера Dwave
В инструкции рассмотрен пример решения задачи в формулировке в QUBO. Для решения используется образ виртуальной машины «Квантовый симулятор» на мощностях CPU и предустановленный в образе сэмплер Dwave. Вы запустите сэмплер Dwave, решите задачу с применением алгоритма имитации отжига , получите результаты решений и интерпретируете их.
Перед началом работы
Получите доступ к сэмплерам Dwave удобным способом:
удаленно в Jupiter Server с помощью инструкции;
локально с помощью команды в терминале:
pip install dwave-samplers
Запустите сэмплер
Чтобы запустить сэмплер DWave, отправьте в терминал команду:
sampler = SimulatedAnnealingSampler ()num_reads = 10num_sweeps = 10 ** 5beta_range = [ 0.1 , 4.2 ]beta_schedule_type = 'geometric'sample_set = sampler . sample_qubo ( Q , num_reads = num_reads , num_sweeps = num_sweeps , beta_range = beta_range , beta_schedule_type = beta_schedule_type )
Где:
sampler — объект решателя.
num_reads — количество запусков алгоритма.
num_sweep — максимальное количество итераций алгоритма.
beta_range — расписание отжига, последовательность обратных температуре величин.
beta_schedule_type — тип интерполяции между точками.
Подробнее о параметрах функции можно узнать в документации Dwave SimulatedAnnealingSampler.
Получите результаты
Отправьте в терминал команду:
print ( sample_set )В результате отобразится таблица:
0 1 2 3 4 5 6 7 8 9 energy num_oc .0 0 1 0 0 1 0 1 0 1 1 - 62.625568 11 0 1 0 0 1 0 1 0 1 1 - 62.625568 12 0 1 0 0 1 0 1 0 1 1 - 62.625568 13 0 1 0 0 1 0 1 0 1 1 - 62.625568 14 0 1 0 0 1 0 1 0 1 1 - 62.625568 15 0 1 0 0 1 0 1 0 1 1 - 62.625568 16 0 1 0 0 1 0 1 0 1 1 - 62.625568 17 0 1 0 0 1 0 1 0 1 1 - 62.625568 18 0 1 0 0 1 0 1 0 1 1 - 62.625568 19 0 1 0 0 1 0 1 0 1 1 - 62.625568 1[ 'BINARY' , 10 rows , 10 samples , 10 variables ]Где:
Столбцы от 0 до 9 показывают полученные решения. Каждое число в строке, 0 или 1, соответствует одной из переменных в векторе решения.
Столбец energy показывает значение функции
. Это число указывает, насколько эффективно решение с точки зрения достижения минимального значения функции — чем меньше число, тем лучше.\(E(x)\)Столбец num_oc показывает, сколько раз конкретное решение было найдено.
Каждая строка в таблице представляет одну попытку решения задачи.
Выберите решение
Выберите решение одним из двух методов:
Чтобы получить конкретное решение, используйте метод record, отправив команду:
n = 9E = sample_set . record [ n ][ 1 ]x = sample_set . record [ n ][ 0 ]print ( "Energy is " , E )print ( "Solution is " , x )Где:
n — номер решения.
E — значение энергии, связанное с решением.
x — бинарный вектор, представляющий решение.
В результате отобразятся значения выбранного решения:
Energy is - 62.625567961557635Solution is [ 0 1 0 0 1 0 1 0 1 1 ]Чтобы получить эффективное решение, используйте метод first, отправив команду:
x = sample_set . first [ 0 ]print ( "Energy is " , E )print ( "Solution is " , x )В результате отобразятся значения эффективного решения с точки зрения достижения минимального значения функции:
Energy is - 62.625567961557635Solution is { 0 : 0 , 1 : 1 , 2 : 0 , 3 : 0 , 4 : 1 , 5 : 0 , 6 : 1 , 7 : 0 , 8 : 1 , 9 : 1 }
- Перед началом работы
- Запустите сэмплер
- Получите результаты
- Выберите решение