Решение задачи в QUBO при помощи сэмплера Dwave

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

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

Получите доступ к сэмплерам Dwave удобным способом:

  • удаленно в Jupiter Server с помощью инструкции;

  • локально с помощью команды в терминале:

pip install dwave-samplers

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

Чтобы запустить сэмплер DWave, отправьте в терминал команду:

sampler = SimulatedAnnealingSampler ()
num_reads = 10
num_sweeps = 10 ** 5
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_sweep — максимальное количество итераций алгоритма.

  • beta_range — расписание отжига, последовательность обратных температуре величин.

  • beta_schedule_type — тип интерполяции между точками.

Подробнее о параметрах функции можно узнать в документации Dwave SimulatedAnnealingSampler.

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

  1. Отправьте в терминал команду:

    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 1
    1 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    2 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    3 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    4 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    5 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    6 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    7 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    8 0 1 0 0 1 0 1 0 1 1 - 62.625568 1
    9 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 = 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 - 62.625567961557635
    Solution 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.625567961557635
    Solution is { 0 : 0 , 1 : 1 , 2 : 0 , 3 : 0 , 4 : 1 , 5 : 0 , 6 : 1 , 7 : 0 , 8 : 1 , 9 : 1 }
Evolution