tocdepth

2

Решение задачи в 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 free tier
для Dev & Test
Получить