Evolution
Тема интерфейса
Практические руководства Evolution

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

Эта статья полезна?

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

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

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

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

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

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

Шаги:

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

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

  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.