Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Constraint Solving Problem resolver for Python

License

NotificationsYou must be signed in to change notification settings

python-constraint/python-constraint

PyPI - LicenseBuild StatusDocumentation StatusPyPI - Python VersionsPyPI - DownloadsPyPI - StatusCode Coverage

python-constraint

This software is now back to active development / maintainance status.
IMPORTANT: the new version can be installed with pip install python-constraint2, as the original pip release will not be updated.
For an overview of recent changes, visit theChangelog.
The complete documentation can be foundhere.
New: writing constraints in the new string format is preferable over functions and lambdas.
These strings, even as compound statements, are automatically parsed to faster built-in constraints, are more concise, and do not require constraint solving familiarity by the user to be efficient.
For example,problem.addConstraint(["50 <= x * y < 100"]) is parsed to[MinProdConstraint(50, ["x", "y"]), MaxProdConstraint(100, ["x", "y"])].
Similarly,problem.addConstraint(["x / y == z"]) is parsed to[ExactProdConstraint("x", ["z", "y"])].
This feature is in beta and subject to possible change, please provide feedback.

Thepython-constraint module offers efficient solvers forConstraint Satisfaction Problems (CSPs) over finite domains in an accessible Python package.CSP is class of problems which may be represented in terms of variables (a, b, ...), domains (a in [1, 2, 3], ...), and constraints (a < b, ...).

Basics

This interactive Python session demonstrates basic operations:

>>>fromconstraintimport*>>>problem=Problem()>>>problem.addVariable("a", [1,2,3])>>>problem.addVariable("b", [4,5,6])>>>problem.getSolutions()# doctest: +NORMALIZE_WHITESPACE[{'a':3,'b':6}, {'a':3,'b':5}, {'a':3,'b':4}, {'a':2,'b':6}, {'a':2,'b':5}, {'a':2,'b':4}, {'a':1,'b':6}, {'a':1,'b':5}, {'a':1,'b':4}]>>>problem.addConstraint("a*2 == b")# string constraints are preferable over the black-box problem.addConstraint(lambda a, b: a*2 == b, ("a", "b"))>>>problem.getSolutions()[{'a':3,'b':6}, {'a':2,'b':4}]>>>problem=Problem()>>>problem.addVariables(["a","b"], [1,2,3])>>>problem.addConstraint(AllDifferentConstraint())>>>problem.getSolutions()# doctest: +NORMALIZE_WHITESPACE[{'a':3,'b':2}, {'a':3,'b':1}, {'a':2,'b':3}, {'a':2,'b':1}, {'a':1,'b':2}, {'a':1,'b':3}]

Rooks problem

The following example solves the classical Eight Rooks problem:

>>>problem=Problem()>>>numpieces=8>>>cols=range(numpieces)>>>rows=range(numpieces)>>>problem.addVariables(cols,rows)>>>forcol1incols:...forcol2incols:...ifcol1<col2:...problem.addConstraint(lambdarow1,row2:row1!=row2, (col1,col2))>>>solutions=problem.getSolutions()>>>solutions# doctest: +NORMALIZE_WHITESPACE +ELLIPSIS[{0:7,1:6,2:5,3:4,4:3,5:2,6:1,7:0}, {0:7,1:6,2:5,3:4,4:3,5:2,6:0,7:1}, {0:7,1:6,2:5,3:4,4:3,5:1,6:2,7:0}, {0:7,1:6,2:5,3:4,4:3,5:1,6:0,7:2}, ... {0:7,1:5,2:3,3:6,4:2,5:1,6:4,7:0}, {0:7,1:5,2:3,3:6,4:1,5:2,6:0,7:4}, {0:7,1:5,2:3,3:6,4:1,5:2,6:4,7:0}, {0:7,1:5,2:3,3:6,4:1,5:4,6:2,7:0}, {0:7,1:5,2:3,3:6,4:1,5:4,6:0,7:2}, ...]

Magic squares

This example solves a 4x4 magic square:

>>>problem=Problem()>>>problem.addVariables(range(0,16),range(1,16+1))>>>problem.addConstraint(AllDifferentConstraint(),range(0,16))>>>problem.addConstraint(ExactSumConstraint(34), [0,5,10,15])>>>problem.addConstraint(ExactSumConstraint(34), [3,6,9,12])>>>forrowinrange(4):...problem.addConstraint(ExactSumConstraint(34), [row*4+iforiinrange(4)])>>>forcolinrange(4):...problem.addConstraint(ExactSumConstraint(34), [col+4*iforiinrange(4)])>>>solutions=problem.getSolutions()# doctest: +SKIP

The following solvers are available:

  • OptimizedBacktrackingSolver (default)
  • BacktrackingSolver
  • RecursiveBacktrackingSolver
  • MinConflictsSolver
  • ParallelSolver

Predefined constraint types currently available (use the parsing for automatic conversion to these types):

  • FunctionConstraint
  • AllDifferentConstraint
  • AllEqualConstraint
  • ExactSumConstraint
  • MinSumConstraint
  • MaxSumConstraint
  • MinProdConstraint
  • ExactProdConstraint
  • MaxProdConstraint
  • VariableExactSumConstraint
  • VariableMinSumConstraint
  • VariableMaxSumConstraint
  • VariableMinProdConstraint
  • VariableExactProdConstraint
  • VariableMaxProdConstraint
  • InSetConstraint
  • NotInSetConstraint
  • SomeInSetConstraint
  • SomeNotInSetConstraint

Documentation for the module is available at:http://python-constraint.github.io/python-constraint/.It can be built locally by runningmake clean html from the docs folder.For viewing RST files locally,restview is recommended.

$ pip install python-constraint2

Runnox (tests for all supported Python versions in own virtual environment).

To test against your local Python version: make sure you have the development dependencies installed.Runpytest (optionally add--no-cov if you have the C-extensions enabled).

Feel free to contribute bysubmitting pull requests oropening issues.Please refer to thecontribution guidelines before doing so.

This GitHub organization and repository is a global effort to help to maintainpython-constraint, which was written by Gustavo Niemeyer and originaly located athttps://labix.org/python-constraint.For an overview of recent changes, visit theChangelog.

Planned development:

  • Support constant modifiers on parsed (variable) constraints instead defaulting to FunctionConstraint, e.g.problem.addConstraint("a+2 == b") orproblem.addConstraint("x / y == 100")
  • Parse using Abstract Syntax Trees (AST) instead of the current parser to be more robust and support decomposing lambdas
  • Rewrite hotspots in C / Pyx instead of pure python mode
  • Improvements to make the ParallelSolver competitive (experiments reveal the freethreading mode to be promising)
  • Versioned documentation

But it's probably better toopen an issue.


[8]ページ先頭

©2009-2025 Movatter.jp