Open arcondello opened 3 years ago
Example usage (tested with dwave-ocean-sdk==3.4.1):
import dimod
import numpy as np
from dwave.system import LeapHybridDQMSampler
# make simple tsp
num_cities = 5
distances = np.triu(np.random.uniform(size=(num_cities, num_cities)), 1)
penalty_strength = 2
bqm = dimod.BQM('BINARY') # variables are (city, time)
# enforce the "visit each city once" constraint with one-hots
one_hots = [[(c, t) for t in range(num_cities)] for c in range(num_cities)]
# bqm_to_dqm does not allow one-hots to overlap, so we enforce "one city at a
# time" with penalty models
# in dimod 0.10 we could use:
# bqm.add_linear_equality_constraint([((c, t), 1) for c in range(num_cities)], penalty_strength, 1)
for t in range(num_cities):
bqm.update(dimod.generators.combinations([(c, t) for c in range(num_cities)], 1, penalty_strength))
# costs of travelling between cities
for c0 in range(num_cities):
for c1 in range(c0+1, num_cities):
cost = distances[c0, c1]
for t0 in range(num_cities):
t1 = (t0 + 1) % num_cities
bqm.set_quadratic((c0, t0), (c1, t1), cost)
bqm.set_quadratic((c1, t0), (c0, t1), cost)
# construct the DQM, using the one-hots from above
dqm, mapping = bqm_to_dqm(bqm, one_hots)
# solve on LeapHybridDQMSampler
sampleset = LeapHybridDQMSampler().sample_dqm(dqm)
# convert the lowest-energy returned solution back to bqm
print(dqm_sample_to_bqm_sample(sampleset.first.sample, mapping))
Something like
some basic unittests
the first snippet should work with dimod 0.9 but the tests require 0.10.
Additional Context For
CaseLabelDQM
, we would not need to return the mapping.