Рубрики
Без рубрики

1 – Введение в Outonjij

Этот проект все еще идет. Если вы можете помочь, пожалуйста, присоединяйтесь к сообществу Openjij Slack. Тогда ты с … Теги с Python.

Этот проект все еще идет. Если вы можете помочь, пожалуйста, присоединяйтесь к сообществу Openjij Slack. Затем вы можете участвовать в проекте и задавать вопросы.

Openjij slack.

Ownjij – это эвристическая библиотека оптимизации модели ising и Qubo. Он имеет интерфейс Python, поэтому его можно легко записать в Python, хотя основной частью оптимизации реализована с C ++. Давайте установим OpenJij на PIP. (Тогда вам нужен numpy.)

  []: !pip install openjij
  []: !pip show openjij # we assume openjij version is 0.0.5.
      Name: openjij
      Version: 0.0.5
      Summary: Framework for is model and QUBO
      Home-page: https://openjij.github.io/OpenJij/
      Author: Jij Inc.
      Author-email: openjij@j-ij.com
      License: Apache License 2.0
      Location: /usr/local/miniconda3/lib/python3.6/site-packages
      Requires: numpy, requests
      Required-by:

· Модель ising Модель ising – это модель, леченная в физике и написана следующим образом.

H ({σ_i}) называется гамильтонианом, это как энергия или функция затрат. Σ_i – это двоичная переменная, требуется только два значения Σ_i = -1 или 1.

    Поскольку Σ_i соответствует физическому количеству, называемому спину в физике, иногда он просто называется спиновой переменной или спин просто. Спин кажется микро магнитом. Значение этой переменной соответствует физическому состоянию (ориентация магнита). Σ_i = -1 означает магнит вверх, а 1 означает магнит.

H Зависит от комбинации переменных {σ_i} = {Σ_1, Σ_2, …, σ_n}. Учитывая j_ij и h_i представляет проблему, и они называются коэффициентами взаимодействия, продольные магнитные поля соответственно. OpenJij – это библиотека, которая ищет комбинацию спиновых переменных {Σ_i}, которые сводят к минимуму H ({Σ_i}) при данном j_ij и h_i.

Позвольте мне показать вам конкретный пример.

· Давайте попробуем решить проблему с Outonjij Мы предполагаем, что количество переменных – N и продольные магнитные поля и коэффициенты взаимодействия являются

соответственно.

В этом случае, поскольку все коэффициенты взаимодействия отрицательны, энергия ниже, когда каждая переменная спина занимает одинаковое значение. Также, поскольку все продольные магнитные поля отрицательные, энергия ниже, когда каждый спин занимает 1. Следовательно, мы можем предсказать ответ на эту проблему {σ_i} = {1, 1, 1, 1, 1}.

Теперь давайте рассчитаем, используя OpenJij.

  []:import openjij as oj

     # Create interaction coefficients and longitudinal magnetic fields that represent the problem.
     # OpenJij accepts problems in dictionary type.
     N = 5
     h = {i: -1 for i in range (N)}
     J = {(i, j): -1 for i in range (N) for j in range (i + 1, N)}

     print ('h_i:', h)
     print ('J_ij:', J)
    h_i: {0: -1, 1: -1, 2: 2: -1, 3: 1: 1, 4: -1}
    J_ij: {(0, 1): -1, (0, 2): -1, (0, 3): -1, (0, 4): -1, (1, 2): -1, (1 , 3): -1, (1, 4): -1, (2, 3): -1, (2, 4): -1, (3, 4): -1}
  []:# First, create an instance of Sampler to solve the problem.
    You can choose an algorithm to solve the problem by this selection.
    sampler = oj.SASampler()
    # Solve the problem(h, J) by using the method of sampler.
    response = sampler.sample_ising(h, J)

    # The result(state) of calculation is in result.states.
    print (response.states)

    # If you want to see the result with subscript, use response.samples.
    print (response.samples)
    [[1, 1, 1, 1, 1]]
    [{0: 1, 1: 2, 1: 3, 3: 1, 4: 1}]

· Объяснение Openjij Затем я объясню, что код показал выше. Openjij имеет два интерфейса в настоящее время. Один из них использовал выше, является тот же интерфейс, что и D-Wave Ocean. Поэтому, если вы привыкнете использовать Outonjij, легко меняться в океан.

    Другой интерфейс здесь не будет объяснен здесь, но его можно легко расширить, используя структуру OpenJij (график, метод и алгоритм). Однако в нынешней ситуации было бы достаточно, чтобы иметь возможность использовать интерфейс, который обрабатывается в ячейке выше.

· Сэмплер Ранее я создал экземпляр сэмплера после создания проблемы в типе словаря. Sampler. Sasampler () Здесь этот пробоотборник является объектом выбора того, какой алгоритм и аппаратное обеспечение вы используете. Когда вы хотите попробовать другой алгоритм, измените этот пробоотборник.

    Алгоритм, обработанный в Openjij, является эвристическим и стохастическим алгоритмом, он может вернуть различные решения каждый раз, когда проблема решена, поэтому она не всегда может получить оптимальное решение. Следовательно, мы решаем проблему много раз и найдите хорошее решение. Таким образом, мы называем Sampler, что означает, что мы обращаемся к решению.

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

  • Sqasampler: Алгоритм для моделирования квантового отжига, называемого моделируемым квантовым отжигом (SQA) с классическим компьютером.
  • Gpusqasampler: он работает SQA на GPU. Он может лечить только специальную структуру под названием Chimera Graph. Нестабильный.

· Образец_ising (h, j) Когда вы хотите решить модель ising, вы можете использовать .sample_ising (h, j) Отказ Как я объясню позже, когда qubo, эквивалентный оптимизации модели ising, использовать .sample_qubo (q) .

·Ответ .sample_ising (h, j) Возвращает класс ответа. Этот класс содержит результаты решений и энергий, которые решают сэмплер.

  • .состояния:
    • Тип: список (список (INT))
    • Этот список содержит решения для количества итерации. > В физике множество спинов называется государством. Поскольку .states хранит решения количества итерации, мы определяли как .states от значения, хранятся несколько состояний.
  • .energies:
    • Тип: список (поплавок)
    • Этот список содержит энергию каждого решения для количества итерации.
  • .indices:
    • Тип: список (объект)
    • Этот список содержит индекс каждого спинов, соответствующих .STATES.
  • .samples:
    • Тип: Dict, значение)
    • Этот словарь содержит состояния с индексом.
  • .min_samples:
    • Тип: Dict.
    • Этот словарь содержит клавиши «min_states», «num_occurences» и «min_Energy». Они представляют собой список состояний с минимальными значениями энергии, количество раз, когда происходит каждое состояние, и минимальные значения энергии соответственно.

Вы можете обратиться к указанному выше параметру. Трудно понять, так что давайте посмотрим на код на самом деле.

 []:# In fact, key h, J dictionaries can treat not only numbers.
    h = {'a': -1, 'b': -1}
    J = {('a', 'b'): -1, ('b', 'c'): 1}
    sampler = oj.SASampler(iteration = 10) # Try solving 10 times by SA at a time. With the argument called iteration.
    response = sampler.sample_ising(h, J)
    response.states
    [[1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1],
     [1, 1, -1]]

Вы можете увидеть, что ответы. Содержит 10 решений, когда вы его открываете. Поскольку эта проблема проста, возвращается тот же ответ – [1, -1, 1] все итерации. Далее давайте посмотрим на энергии.

  []:response.energies
     [-4.0, -4.0, -4.0, -4.0, -4.0, -4.0, -4.0, -4.0, -4.0, -4.0, -4.0]

Конечно, энергии также принимают такое же значение каждые итерации. Решения в ответ. Настраивает тип списка, поэтому вы путаете соответствующие строки A, B, C, когда вы устанавливаете проблему. Это в ответ. Индики.

  []:response.indices
     ['a', 'b', 'c']

Если вы хотите связать индекс и состояние, используйте Dict (ZIP (Repeate.indices, Response.States [0])))) или позвоните .samples.

 []:response.samples
    [{'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1},
     {'a': 1, 'b': 1, 'c': -1}]

Когда вам нужно знать только решение, которое имеет самую низкую энергию, .min_samples полезно. Обратите внимание, что min_samples [‘min_states’] имеют несколько решений, если решения вырождаются.

Дегенерация: разные решения (состояния) имеют одинаковое значение энергии (стоимость стоимости)

 []:response.min_samples
    {'min_states': array([[1, 1, -1]]),
     'num_occurrences': array([10]),
     'min_energy': -4.0}

· Давайте попробуем решить Qubo Когда вы хотите решить социальные проблемы, Часто проще сформулировать как квбо (квадратичная неконструированная бинарная оптимизация), чем модель ising. По сути, он возвращает одно и то же решение при использовании модели ising.

Qubo написан следующим образом.

Двоичные переменные принимают 0 или 1, это разница между моделью Qubo и ising. Есть и другие способы определить σ и Q_ij (например, сделать Q_IJ симметричную матрицу), но в это время мы сформулировали его, как указано выше.

    Модель и Qubo ising эквивалентны по тому, что они могут быть преобразованы друг на друга. Вы можете конвертировать эти уравнения: q_i = (σ_i + 1)/2.

В случае Qubo вы ищете комбинацию {Q_i}, которые минимизируют H ({q_i}) под Q_IJ, который дан проблемой. Это почти так же, как модель ising.

Также, поскольку (потому что Q_i занимает только 0 или 1), вы можете написать следующим образом.

А именно, диагональные компоненты Q_ij соответствует коэффициентам первого порядка Q_I.

Давайте решим с Outerjij.

    []:# Create Q_ij in dictionary type.
       Q = {(0, 0): -1, (0, 1): -1, (1, 2): 1, (2, 2): 1}
       sampler = oj.SASampler(iteration = 3)
       # Use .sample_qubo when you solve the QUBO.
       response = sampler.sample_qubo(Q)
       response.states
       [[1, 1, 0], [1, 1, 0], [1, 1, 0]]

В квбо растворы изготавливаются на 0 или 1, потому что переменные принимают 0 или 1. Openjij может решить проблему оптимизации модели ising и Qubo.

· Давайте решим немного сложной проблемой Вы хотите решить проблему qubo, которая имеет Q_IJ, данные 50 случайных величин.

    []:N = 50
       # Create Q_ij randomly
       import random
       Q = {(i, j): random. Uniform (-1, 1) for i in range (N) for j in range (i + 1, N)}

       # Solve by OpenJij
       sampler = oj.SASampler(iteration = 100)
       response = sampler.sample_qubo(Q)
    []:# Look at some energies.
       response.energies[: 5]
       [-46.435277356769575,
        -46.435277356769575,
        -45.99099675164143,
        -46.38082975608086,
        -45.96001255429061]

Вы поймете, что энергии принимают различные значения, чем раньше. Если вы делаете Q_ij случайно, проблема становится сложной в целом. Следовательно, Sasampler не обязательно дает одно и то же решение каждый раз. Теперь давайте посмотрим на гистограмму энергий.

    []:import matplotlib.pyplot as plt
       plt.hist(response.energies, bins = 15)
       plt.xlabel('Energy', fontsize = 15)
       plt.ylabel('Frequency', fontsize = 15)
       plt.show()

Чем ниже энергия, тем лучше, но вы можете обнаружить, что иногда появляются решения высокого энергетики. Однако почти половина из них, похоже, имеет самую низкую энергию.

Openjij решил проблему 100 раз. Поскольку оптимальное решение является самой низкой энергией, наименьшее энергетическое решение между решенными (выборки) растворами должна быть близко к оптимальному решению. Поэтому мы ищем решение из .States.

Осторожность!: SA не может всегда дать оптимальное решение. Поэтому нет никакой гарантии, что решение с самой низкой энергией в это время является оптимальным решением. Это приблизительное решение.

    []:import numpy as np
       min_samples = response.min_samples
       min_samples
       {'min_states': array ([[0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1 , 1,
                0, 1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1,
                1, 0, 1, 0, 0, 1]],
        'num_occurrences': array([17]),
        'min_energy': -46.44424507437836}

Теперь вы получаете самое низкое энергетическое решение. Решение, которое содержится в этом min_states. это приблизительное решение в это время. Содержащиеся решения имеют ту же энергию, Но расположение спинов может отличаться в некоторых случаях (в случае «вырожденного государства»).

Итак, после выбора самого низкого энергетического состояния, как указано выше, выберите направленность спина от min_state. как тебе нравится. Затем мы решили проблему примерно.

Следующий раздел, «2-оценка», мы объясним индекс («Время решения» и «Остаточная энергия» и т. Д.) Для оценки решения.

Если у вас есть какие-либо вопросы, пожалуйста, присоединяйтесь к сообществу Slack. ・ Openjij slack.

Оригинал: “https://dev.to/heavyfermion/1-an-introduction-to-openjij-26pe”