Getting the D-Wave quantum computer to solve a maze!
The following code takes a simple and familiar problem---solving a maze---and demonstrates the steps of submitting such problems to the quantum computer.
#|#######
#._._. .#
# # | #
#. . ._.#
# |#
#. .#. ._
#########The above ASCII figure is a visualization of a maze and a maze path returned as samples from the QPU. The hashes (#) represent maze walls, the pipes (|) and underscores (_) mark the maze path, and the periods (.) act as gridpoints for this maze.
python demo.pyReturns ASCII visual of the maze and a QPU sampled maze path. As well, there is a printout of the path segments and their associated boolean value (see Code Specifics - Result Interpretation for details).
The solution technique is to construct a set of constraints that enforces the rules of moving through a maze. These constraints are then converted by Ocean software tools to a binary quadratic model (BQM) that can then be solved with a D-Wave quantum computer. The solution that gets returned by the quantum computer is the path needed to get through the maze.
There are several constraints involved with a maze:
- Valid path movements (i.e., if the path enters a grid point, it must also leave said grid point)
- Path has a specific start and end position
- Path cannot pass maze borders
- Path cannot pass through the internal walls of the maze
Each of these constraints get implemented when the user calls Maze's
get_bqm().
The maze is a rectangular grid. The path segments (aka edges) that can be
formed in this grid are described with respect to a grid point. For example,
the edge labelled '1,0w':
1,0refers to a grid point on row 1, column 0wrefers to "west"
Hence, if you imagine a compass that is centered at position 1,0, the edge
'1,0w' is the path segment that sits along the western direction of this
compass.
Note that the code only accepts edge inputs in the north direction
('<row>,<col>n') and the west direction ('<row>,<col>w'). Edges in
south or east directions can be restated as edges in north and west directions:
'<row>,<col>s' == '<row+1>,<col>n'
'<row>,<col>e' == '<row>,<col+1>w'Consider the following 2 by 2 maze with
- start =
'0,0n' - end =
'1,0w' - walls =
['1,1n']
This can be visualized as the following maze. Note that the periods (.) act as gridpoints, which means that the maze below has 2 rows and 2 columns.
#|### <-- start location ('0,0n'); the path "north" of coordinate 0,0
#. .#
# ## <-- wall ('1,1n'); blocks the path "north" of coordinate 1,1
_. .# <-- end location; the path "west" of coordinate 1,0
#####When running the demo code and submitting this problem, the following result would be produced:
#|###
#. .#
#| ##
_. .#
#####
1,0n 0,1w 1,1w energy num_occ. chain_b.
0 1 0 0 -3.5 1000 0.0Comments on the printed result:
- The 1s and 0s beneath each path segment indicate whether or not the segment is included in the path. Specifically, 1 indicates that the segment contributes to the path, while 0 indicates otherwise.
- As shown above,
'1,0n'is a segment that is needed in our tiny maze path - Hence, the path from start to end is
'0,0n' -> '1,0n' -> '1,0w'
Released under the Apache License 2.0. See LICENSE file.