Решение задач с помощью квантового симулятора
«Квантовый симулятор» — это усовершенствованная реализация алгоритма имитации отжига. Симулятор предназначен для решения задач в постановке матрицы Quadratic Unconstrained Binary Optimization (QUBO). С его помощью вы можете решать сложные оптимизационные задачи, например: оптимизировать маршруты, логистические процессы, энергопотребление, планирование производственных процессов.
Для решения используется образ виртуальной машины «Квантовый симулятор» на мощностях CPU и предустановленный в образе сэмплер D-Wave. Вы запустите сэмплер D-Wave, решите задачу с применением алгоритма имитации отжига, получите результаты решений и интерпретируете их.
Перед началом работы
-
Если вы уже зарегистрированы, войдите под своей учетной записью.
-
Убедитесь, что для вашей учетной записи достаточно прав на проект. При необходимости настройте права или запросите их у администратора.
-
Запросите в технической поддержке пароль для квантового симулятора.
Создайте виртуальную машину
На виртуальной машине будет развернут Jupyter Server для работы с jupyter-ноутбуками.
-
На верхней панели слева нажмите
и выберите Инфраструктура → Виртуальные машины.
-
Нажмите Создать виртуальную машину.
-
Введите название ВМ — quantum-server.
-
Укажите настройки:
-
Зона доступности — «ru.AZ-1».
-
Образ — на вкладке Маркетплейс выберите «Квантовый симулятор».
-
Гарантированная доля vCPU — 30%.
-
vCPU, шт — 2.
-
RAM, ГБ — 4.
-
-
Нажмите Продолжить.
-
Назначьте ВМ публичный IP-адрес:
-
Оставьте включенной опцию Подключить публичный IP.
-
В поле Тип IP выберите Прямой.
-
Нажмите Арендовать новый.
-
-
Настройте параметры авторизации пользователя:
-
В поле Имя пользователя введите логин пользователя виртуальной машины: например, «cloud-user».
-
Выберите пароль в качестве метода аутентификации.
-
Укажите пароль пользователя.
-
-
Нажмите Создать.
-
В строке созданной ВМ скопируйте и сохраните адрес из столбца Публичный IP: он потребуется для дальнейшей настройки.
Добавьте правило входящего трафика
В группу безопасности по умолчанию необходимо добавить правило, разрешающее входящий трафик через порт 8888.
-
На верхней панели слева нажмите
и выберите Сеть → Группы безопасности.
-
Нажмите на название группы «SSH-access_ru.AZ-1».
-
Перейдите на вкладку Правила.
-
В разделе Правила входящего трафика нажмите Добавить правило.
-
Укажите параметры правила:
-
Протокол — «TCP».
-
Порт — «8888».
-
Тип источника — IP-адрес.
-
Источник — «0.0.0.0/0».
-
-
Нажмите Создать.
Подключитесь к Jupyter Server
Jupyter Server станет доступен через 5–7 минут после запуска виртуальной машины.
-
Откройте браузер и перейдите по адресу https://<public_ip>:8888, где <public_ip> — публичный IP-адрес ВМ quantum-server.
Если появится предупреждение о том, что подключение не защищено, добавьте сертификат сайта в доверенные по инструкции для вашего браузера.
-
В поле Password введите пароль, полученный в технической поддержке Cloud.ru.
-
Нажмите Log in.
Откроется страница с файлами симулятора.
-
Смените пароль Jupyter Server:
-
Откройте терминал: на верхней панели нажмите File → New → Terminal.
-
В терминале введите команду:
jupyter notebook password -
Дважды введите новый пароль.
-
-
Создайте новый ноутбук:
-
На верхней панели нажмите File → New → Notebook.
-
В открывшемся окне выберите ядро Python 3.
-
Создайте матрицу
-
Импортируйте в проект библиотеки. Вставьте в ячейку ноутбука указанный ниже код и нажмите Shift + Enter.
import numpy as npfrom dwave.samplers import SimulatedAnnealingSamplerimport matplotlib.pyplot as pltГде:
-
numpy — библиотека для работы с массивами данных.
-
dwave.samplers — пакет с сэмплером D-Wave, в котором доступно несколько алгоритмов решения.
-
SimulatedAnnealingSampler — алгоритм имитации отжига из пакета D-Wave.
-
matplotlib — библиотека для визуализации.
-
-
Создайте матрицу со случайными значениями:
N = 10M = 10Q = np.random.uniform(low=-M, high=M, size=(N, N))Где:
-
N — размер матрицы;
-
M — диапазон значений;
-
Q — объект матрицы.
-
-
Чтобы убедиться, что матрица случайная, получите ее изображение:
plt.matshow(Q)
Запустите сэмплер
-
Запустите сэмплер D-Wave:
sampler = SimulatedAnnealingSampler()num_reads = 10num_sweeps = 10**3beta_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_sweeps — максимальное количество итераций алгоритма.
-
beta_range — расписание отжига, последовательность обратных температуре величин.
-
beta_schedule_type — тип интерполяции между точками.
-
-
Получите результаты:
print(sample_set)В результате отобразится таблица:
0 1 2 3 4 5 6 7 8 9 energy num_oc.0 1 1 1 0 1 0 0 0 0 1 -50.046614 11 1 1 1 0 1 0 0 0 0 1 -50.046614 12 1 1 1 0 1 0 0 0 0 1 -50.046614 13 1 1 1 0 1 0 0 0 0 1 -50.046614 14 1 1 1 0 1 0 0 0 0 1 -50.046614 16 1 1 1 0 1 0 0 0 0 1 -50.046614 18 1 1 1 0 1 0 0 0 0 1 -50.046614 19 1 1 1 0 1 0 0 0 0 1 -50.046614 15 0 1 0 0 1 1 0 0 1 1 -46.860889 17 0 1 0 0 0 1 0 0 1 1 -46.729231 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 -50.046614387554584Solution is [1 1 1 0 1 0 0 0 0 1] -
-
Чтобы получить эффективное решение, используйте метод first, отправив команду:
x = sample_set.first[0]print("Energy is ",E)print("Solution is ",x)В результате отобразятся значения эффективного решения с точки зрения достижения минимального значения функции:
Energy is -50.046614387554584Solution is {0: 1, 1: 1, 2: 1, 3: 0, 4: 1, 5: 0, 6: 0, 7: 0, 8: 0, 9: 1}
- Перед началом работы
- Создайте виртуальную машину
- Добавьте правило входящего трафика
- Подключитесь к Jupyter Server
- Создайте матрицу
- Запустите сэмплер
- Выберите решение