Облачная платформаEvolution

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


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

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

Вы будете использовать следующие сервисы:

  • «Виртуальные машины» — сервис, в рамках которого предоставляется виртуальная машина для развертывания симулятора.

  • «Публичные IP» — сервис для организации доступа к виртуальной машине через интернет.

  • Jupyter Server — серверное приложение, позволяющее запускать командные графические оболочки для интерактивных вычислений Jupyter Notebook и JupyterLab.

Шаги:

  1. Разверните ресурсы в облаке.

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

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

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

  5. Выберите решение.

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

  1. Зарегистрируйтесь в личном кабинете Cloud.ru.

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

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

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

1. Разверните ресурсы в облаке

  1. Создайте виртуальную машину со следующими параметрами:

    • Названиеquantum-server.

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

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

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

    • vCPU, шт — 2.

    • RAM, ГБ: — 4.

    • Сетевой интерфейс — выберите тип Подсеть с публичным IP.

    • Публичный IP — оставьте Арендовать новый или выберите IP-адрес из списка арендованных.

    • Имя пользователяcloud-user.

    • Метод аутентификацииПароль.

    • Пароль — задайте пароль пользователя.

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

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

  3. Добавьте правило входящего трафика в группу безопасности SSH-access_ru.AZ-1:

    Протокол

    Порт

    Тип источника

    Источник

    TCP

    8888

    IP-адрес

    0.0.0.0/0

2. Подключитесь к 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.

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.png

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

  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 показывает, сколько раз конкретное решение было найдено.

    Каждая строка в таблице представляет одну попытку решения задачи.

5. Выберите решение

Выберите решение одним из двух методов:

  • Чтобы получить конкретное решение, используйте метод 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}

Результат

Вы научились применять алгоритм имитации отжига для решения задач в постановке матрицы QUBO.