Evolution
Тема интерфейса

Решение задач с помощью квантового симулятора

«Квантовый симулятор» — это усовершенствованная реализация алгоритма имитации отжига. Симулятор предназначен для решения задач в постановке матрицы Quadratic Unconstrained Binary Optimization (QUBO). С его помощью вы можете решать сложные оптимизационные задачи, например: оптимизировать маршруты, логистические процессы, энергопотребление, планирование производственных процессов.

Для решения используется образ виртуальной машины «Квантовый симулятор» на мощностях CPU и предустановленный в образе сэмплер D-Wave. Вы запустите сэмплер D-Wave, решите задачу с применением алгоритма имитации отжига, получите результаты решений и интерпретируете их.

Перед началом работы

  1. Если вы уже зарегистрированы, войдите под своей учетной записью.

  2. Убедитесь, что для вашей учетной записи достаточно прав на проект. При необходимости настройте права или запросите их у администратора.

  3. Запросите в технической поддержке пароль для квантового симулятора.

Создайте виртуальную машину

На виртуальной машине будет развернут Jupyter Server для работы с jupyter-ноутбуками.

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Инфраструктура → Виртуальные машины.

  2. Нажмите Создать виртуальную машину.

  3. Введите название ВМquantum-server.

  4. Укажите настройки:

    • Зона доступности — «ru.AZ-1».

    • Образ — на вкладке Маркетплейс выберите «Квантовый симулятор».

    • Гарантированная доля vCPU — 30%.

    • vCPU, шт — 2.

    • RAM, ГБ — 4.

  5. Нажмите Продолжить.

  6. Назначьте ВМ публичный IP-адрес:

    1. Оставьте включенной опцию Подключить публичный IP.

    2. В поле Тип IP выберите Прямой.

    3. Нажмите Арендовать новый.

  7. Настройте параметры авторизации пользователя:

    1. В поле Имя пользователя введите логин пользователя виртуальной машины: например, «cloud-user».

    2. Выберите пароль в качестве метода аутентификации.

    3. Укажите пароль пользователя.

  8. Нажмите Создать.

  9. В строке созданной ВМ скопируйте и сохраните адрес из столбца Публичный IP: он потребуется для дальнейшей настройки.

Добавьте правило входящего трафика

В группу безопасности по умолчанию необходимо добавить правило, разрешающее входящий трафик через порт 8888.

  1. На верхней панели слева нажмите Кнопка с изображением девяти точек и выберите Сеть → Группы безопасности.

  2. Нажмите на название группы «SSH-access_ru.AZ-1».

  3. Перейдите на вкладку Правила.

  4. В разделе Правила входящего трафика нажмите Добавить правило.

  5. Укажите параметры правила:

    • Протокол — «TCP».

    • Порт — «8888».

    • Тип источника — IP-адрес.

    • Источник — «0.0.0.0/0».

  6. Нажмите Создать.

Подключитесь к Jupyter Server

Jupyter Server станет доступен через 5–7 минут после запуска виртуальной машины.

  1. Откройте браузер и перейдите по адресу https://<public_ip>:8888, где <public_ip> — публичный IP-адрес ВМ quantum-server.

    Если появится предупреждение о том, что подключение не защищено, добавьте сертификат сайта в доверенные по инструкции для вашего браузера.

  2. В поле Password введите пароль, полученный в технической поддержке Cloud.ru.

  3. Нажмите Log in.

    Откроется страница с файлами симулятора.

  4. Смените пароль Jupyter Server:

    1. Откройте терминал: на верхней панели нажмите File → New → Terminal.

    2. В терминале введите команду:

      jupyter notebook password
    3. Дважды введите новый пароль.

  5. Создайте новый ноутбук:

    1. На верхней панели нажмите File → New → Notebook.

    2. В открывшемся окне выберите ядро Python 3.

Создайте матрицу

  1. Импортируйте в проект библиотеки. Вставьте в ячейку ноутбука указанный ниже код и нажмите Shift + Enter.

    import numpy as np
    from dwave.samplers import SimulatedAnnealingSampler
    import matplotlib.pyplot as plt

    Где:

    • numpy — библиотека для работы с массивами данных.

    • dwave.samplers — пакет с сэмплером D-Wave, в котором доступно несколько алгоритмов решения.

    • SimulatedAnnealingSampler — алгоритм имитации отжига из пакета D-Wave.

    • matplotlib — библиотека для визуализации.

  2. Создайте матрицу со случайными значениями:

    N = 10
    M = 10
    Q = np.random.uniform(low=-M, high=M, size=(N, N))

    Где:

    • N — размер матрицы;

    • M — диапазон значений;

    • Q — объект матрицы.

  3. Чтобы убедиться, что матрица случайная, получите ее изображение:

    plt.matshow(Q)
    ../_images/screen__quantum-simulator__matrix.svg

Запустите сэмплер

  1. Запустите сэмплер D-Wave:

    sampler = SimulatedAnnealingSampler()
    num_reads = 10
    num_sweeps = 10**3
    beta_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 — тип интерполяции между точками.

  2. Получите результаты:

    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 1
    1 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    2 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    3 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    4 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    6 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    8 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    9 1 1 1 0 1 0 0 0 0 1 -50.046614 1
    5 0 1 0 0 1 1 0 0 1 1 -46.860889 1
    7 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 = 9
    E = 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.046614387554584
    Solution 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.046614387554584
    Solution is {0: 1, 1: 1, 2: 1, 3: 0, 4: 1, 5: 0, 6: 0, 7: 0, 8: 0, 9: 1}