Chapter 04無料公開

【rej:03】BQMに制約条件を仕込む(dimod版)【Python/D-Wave】

fz5050
fz5050
2022.02.24に更新

【はじめに】

BQMに制約条件を仕込む場合は

  • pyqubo版オブジェクト(pyquboの制約チェック機能利用可)
  • dimod版オブジェクト+制約チェックサポートなし
  • dimod版オブジェクト+「dwavebinarycspパッケージ」で制約チェック

等の組み合わせがある。

pyquboを使わずにBQMに制約事項を仕込む+制約チェックする場合は「dwavebinarycsp」を使う。

【例題】

目的関数:x + 2y - 3z
制約条件:x + y + z = 2

を満たす(x, y, z)の組み合わせを求めよう

【解答例】

import dwavebinarycsp
import dimod

from dwave.system.samplers import DWaveSampler
from dwave.system.composites import EmbeddingComposite


# トークン設定(テスト用設定)
from dwave.cloud import Client

MY_DWAVE_TOKEN = "xxxxx ... ... xxxxx"

# 接続確認のため、使用するsolverを確認
client = Client.from_config(token=MY_DWAVE_TOKEN)
print(client.get_solvers())



# dimod.Binaryオブジェクトの生成
q3 = dimod.Binary('q3')
q4 = dimod.Binary('q4')
q5 = dimod.Binary('q5')

# 目的関数の生成(x +2y -3z)
f2 = q3 + 2*q4 -3*q5
f2


# 制約条件の設定
# CSPオブジェクトを作成する
my_csp = dwavebinarycsp.ConstraintSatisfactionProblem(dwavebinarycsp.BINARY)
my_csp.add_constraint(lambda a, b, c: (a + b + c == 2), ['q3', 'q4', 'q5'])

# CSPオブジェクトをBQM化する
g_bqm = dwavebinarycsp.stitch(my_csp)


# エネルギー式を作成する(重みは1)
h2 = f2 + g_bqm


# Samplerオブジェクトを生成して計算する
sampler = EmbeddingComposite(DWaveSampler(token=MY_DWAVE_TOKEN))
response = sampler.sample(h2,num_reads=1000)


# 結果の確認
for sample, energy, num_occurrences, chain_break_fraction in list(response.data()):
  print(sample, "Energy:", energy, "Occurrences:", num_occurrences, my_csp.check(sample))

コメント

このコードは、note側のD-WaveでBQMへの制約条件を仕込む方法のdimod版。

Colab上のpipだと「dwavebinarycsp」が内部でコールしている別パッケージのパスが見えないようで、一部ランタイムエラーを起こしていた。(「.stitch()」部分で発生)

「venv」による仮想環境上では動作を確認していた。

しかしながら、
「note側の記事は実行環境構築は「Colab」上でやっていく」としていたので、突然ここだけローカル上の実行としては変だったので没にした。