a sudoku solver using integer linear programming with optlang
, made for fun.
the SudokuProblem
class in solpoku.py
handles the problem formulation. variables are bounded between 0 and 1, and encoded as vRCN
, where R
and C
represent the number of the row and column (respectively) from 1 to 9, and N
represents the digit. if a digit n
is present at row r
, column c
, then vrcn
is set to be maximized. maximizing the sum of variables that refer to posed digits renders a feasible sudoku solution.
the from_csv
and from_json
class methods are provided to facilitate handling of input files. from_array
handles input numpy
arrays. the solve
method performs the optimization and builds a 9x9 numpy
array with the proposed solution.
the gui.py
script provides a simple GUI using tkinter
. run it to launch it. click on the grid to change the numbers; click on "Solve" to fill the sudoku.
empty tiles are represented with zeros.
a pre-made environment can be set up with:
mamba env create -p .env -f environment.yaml
other versions may work too. however, Python ≥3.10 is required.
run solpoku.py
to solve the following sudoku three times:
a) hard-coded in the script, b) read from a CSV file
and c) read from a JSON file:
- | - | - | - | 6 | - | - | - | - |
- | - | 5 | 2 | 1 | 3 | 8 | - | - |
- | 2 | - | - | - | - | - | 4 | - |
4 | - | - | 9 | - | 1 | - | - | 8 |
- | - | 6 | 4 | 8 | 5 | 3 | - | - |
1 | - | - | 7 | - | 6 | - | - | 4 |
- | 6 | - | - | - | - | - | 2 | - |
- | - | 1 | 3 | 4 | 9 | 7 | - | - |
- | - | - | - | 7 | - | - | - | - |