Решение задачи в 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}