制約充足問題
簡単な制約充足問題を解く例として、次の条件を満たす整数の組み合わせを見つける問題を考えましょう。
条件:
- 3つの整数$ ( x, y, z ) $を見つける。
- $ ( x, y, z ) $は 1 から 10 までの整数。
- $ ( x + y + z = 20 ) $の条件を満たす。
これをpython-constraint
を使って解きます。
1 | from constraint import Problem |
このコードは、1から10までの整数$ (x, y, z) $の組み合わせを見つけて、条件$ (x + y + z = 20) $を満たす解を見つけます。
解が見つかれば、整数の組み合わせが出力されます。
[実行結果]
整数の組み合わせ: x: 10, y: 9, z: 1 x: 10, y: 8, z: 2 x: 10, y: 7, z: 3 x: 10, y: 6, z: 4 x: 10, y: 5, z: 5 x: 10, y: 4, z: 6 x: 10, y: 3, z: 7 x: 10, y: 2, z: 8 x: 10, y: 1, z: 9 x: 9, y: 10, z: 1 x: 9, y: 9, z: 2 x: 9, y: 8, z: 3 x: 9, y: 7, z: 4 x: 9, y: 6, z: 5 x: 9, y: 5, z: 6 x: 9, y: 4, z: 7 x: 9, y: 3, z: 8 x: 9, y: 2, z: 9 x: 9, y: 1, z: 10 x: 8, y: 10, z: 2 x: 8, y: 9, z: 3 x: 8, y: 8, z: 4 x: 8, y: 7, z: 5 x: 8, y: 6, z: 6 x: 8, y: 5, z: 7 x: 8, y: 4, z: 8 x: 8, y: 3, z: 9 x: 8, y: 2, z: 10 x: 7, y: 10, z: 3 x: 7, y: 9, z: 4 x: 7, y: 8, z: 5 x: 7, y: 7, z: 6 x: 7, y: 6, z: 7 x: 7, y: 5, z: 8 x: 7, y: 4, z: 9 x: 7, y: 3, z: 10 x: 6, y: 10, z: 4 x: 6, y: 9, z: 5 x: 6, y: 8, z: 6 x: 6, y: 7, z: 7 x: 6, y: 6, z: 8 x: 6, y: 5, z: 9 x: 6, y: 4, z: 10 x: 5, y: 10, z: 5 x: 5, y: 9, z: 6 x: 5, y: 8, z: 7 x: 5, y: 7, z: 8 x: 5, y: 6, z: 9 x: 5, y: 5, z: 10 x: 4, y: 10, z: 6 x: 4, y: 9, z: 7 x: 4, y: 8, z: 8 x: 4, y: 7, z: 9 x: 4, y: 6, z: 10 x: 3, y: 10, z: 7 x: 3, y: 9, z: 8 x: 3, y: 8, z: 9 x: 3, y: 7, z: 10 x: 2, y: 10, z: 8 x: 2, y: 9, z: 9 x: 2, y: 8, z: 10 x: 1, y: 10, z: 9 x: 1, y: 9, z: 10
ソースコード解説
このコードは、Pythonのpython-constraint
ライブラリを使用して、特定の制約を満たす整数の組み合わせを見つける例です。
1. ライブラリのインポートと関数定義:
from constraint import Problem
:constraint
ライブラリからProblem
クラスをインポートします。find_numbers()
関数:制約充足問題を解くための関数を定義します。
2. 制約充足問題の定義:
problem = Problem()
:制約充足問題を定義するためのProblem
オブジェクトを作成します。problem.addVariable('x', range(1, 11))
:変数x
を1から10の整数の範囲で定義します。problem.addVariable('y', range(1, 11))
:変数y
を1から10の整数の範囲で定義します。problem.addVariable('z', range(1, 11))
:変数z
を1から10の整数の範囲で定義します。
3. 制約の設定:
constraint_function()
関数:x + y + z = 20
となるような条件を満たす制約関数を定義します。problem.addConstraint(constraint_function, ['x', 'y', 'z'])
:constraint_function
を使用して、x + y + z = 20
の制約を追加します。
4. 問題の解決:
problem.getSolutions()
:Problem
オブジェクトを解き、条件を満たす整数の組み合わせを探します。
5. 解の表示:
solutions
リストに解が含まれている場合は、各解のx
,y
,z
の値を表示します。- 解が見つからなかった場合は、条件を満たす組み合わせが見つからなかったことを通知します。