制約プログラミング(CP)[1]は、人工知能、コンピュータサイエンス、オペレーションズリサーチの幅広い技術を活用した組み合わせ問題を解決するためのパラダイムです。制約プログラミングでは、ユーザーは一連の決定変数の実行可能なソリューションに対する制約を宣言的に記述します。制約は、実行するステップやステップのシーケンスを指定するのではなく、見つけるべきソリューションの特性を指定するという点で、命令型プログラミング言語の一般的なプリミティブと異なります。制約に加えて、ユーザーはこれらの制約を解決するための方法も指定する必要があります。これは通常、時系列バックトラッキングや制約伝播などの標準的な方法を利用しますが、問題固有の分岐ヒューリスティックなどのカスタマイズされたコードを使用することもできます。
制約プログラミングは、制約を論理プログラムに埋め込む制約論理プログラミングに由来し、その形で表現されます。この論理プログラミングの派生は、JaffarとLassez [2]によるもので、彼らは1987年にProlog IIで導入された特定の制約クラスを拡張しました。制約論理プログラミングの最初の実装は、Prolog III、CLP(R)、およびCHIPでした。
制約は、論理プログラミングの代わりに、関数型プログラミング、項書き換え、命令型言語と組み合わせることができます。制約を組み込んだプログラミング言語には、Oz(関数型プログラミング)やKaleidoscope (命令型プログラミング)などがあります。多くの場合、制約は命令型言語では制約解決ツールキットを介して実装されます。これは、既存の命令型言語用の独立したライブラリです。
制約プログラミングとは、ホスト言語に制約を埋め込むことです。最初に使用されたホスト言語は論理プログラミング言語であったため、この分野は当初「制約論理プログラミング」と呼ばれていました。この2つのパラダイムは、論理変数やバックトラッキングなど、多くの重要な機能を共有しています。今日では、ほとんどのProlog実装には、制約論理プログラミング用のライブラリが1つ以上含まれています。
両者の違いは、主にそのスタイルと世界をモデル化するアプローチにあります。問題によっては、論理プログラムとして記述する方が自然(つまり単純)である一方、制約プログラムとして記述する方が自然なものもあります。
制約プログラミングのアプローチは、多数の制約が同時に満たされる世界の状態を探索することです。問題は通常、多数の未知の変数を含む世界の状態として表現されます。制約プログラムは、すべての変数の値を探します。
時間的同時制約プログラミング (TCC) と非決定性時間的同時制約プログラミング (MJV) は、時間を処理できる制約プログラミングのバリエーションです。
制約とは、複数の変数が同時に取ることができる値を制限する、複数の変数間の関係です。
定義—有限領域上の制約充足問題 (または CSP) は、次の 3 つの条件で定義されます。
制約には 3 つのカテゴリがあります。
定義— CSP の割り当て (またはモデル)は、次の組み合わせによって定義されます。
代入とは、変数をその定義域の値に関連付けることです。部分代入とは、問題の変数の一部に代入することです。全代入とは、問題の変数すべてに代入することです。
特性- CSP の割り当て(部分的または全体的)と、などの制約が与えられた場合、制約の変数のすべての値が に属する場合にのみ、割り当ては制約を満たします。
定義— CSP のソリューションは、問題のすべての制約を満たす全体的な割り当てです。
CSP のソリューションを検索する際に、ユーザーは次のことを希望できます。
制約最適化問題 (COP) は、目的関数に関連付けられた制約満足問題です。
最小化(最大化)COP の最適解は、目的関数の値を最小化(最大化)する解です。
COP のソリューションを検索中に、ユーザーは次のことを希望できます。
制約ベースプログラミング言語は、2つのアプローチのいずれかに従います。[3]
制約充足問題における制約伝播は改良モデルの典型的な例であり、スプレッドシートにおける数式評価は摂動モデルの典型的な例です。
洗練モデルは変数が単一の値を持つことを制限しないため、より汎用性が高く、同じ問題に対して複数の解を導くことができます。しかし、混合命令型制約のオブジェクト指向言語を使用するプログラマーにとっては、摂動モデルの方が直感的です。[4]
制約プログラミングで使用される制約は、通常、特定の領域に限定されます。制約プログラミングでよく使用される領域には、以下のようなものがあります。
有限領域は、制約プログラミングの最も成功した領域の一つです。一部の分野(オペレーションズ・リサーチなど)では、制約プログラミングは有限領域における制約プログラミングと同一視されることがよくあります。
局所整合性条件は、制約充足問題における変数または制約のサブセットの整合性に関連する特性です。これらは探索空間を縮小し、問題の解決を容易にするために利用できます。ノード整合性、アーク整合性、パス整合性など、様々な種類の局所整合性条件が活用されます。
あらゆる局所整合性条件は、問題の解を変えずに問題自体を変える変換によって強制することができます。このような変換は制約伝播と呼ばれます。[6]制約伝播は、変数のドメインを縮小したり、制約を強化したり、新しい制約を作成したりすることで機能します。これにより探索空間が縮小され、一部のアルゴリズムによって問題が解きやすくなります。制約伝播は、一般には不完全ですが、特定の場合には完全な充足不可能性チェッカーとしても使用できます。
制約充足問題を解決するための主なアルゴリズム手法には、バックトラッキング探索、局所探索、動的計画法の3つがあります。[1]
バックトラッキング検索は、いくつかの計算問題、特に制約充足問題に対するすべての(または一部の)解決策を見つけるための一般的なアルゴリズムであり、解決策の候補を段階的に構築し、候補が有効な解決策に完了する可能性がないと判断するとすぐに候補を放棄(「バックトラック」)します。
局所探索は、問題の解を見つけるための不完全な手法です。これは、すべての制約が満たされるまで変数の割り当てを反復的に改善していくことに基づいています。特に、局所探索アルゴリズムは通常、割り当ての各ステップで変数の値を変更します。新しい割り当ては、割り当て空間において以前の割り当てに近いため、局所探索と呼ばれます。
動的計画法は、数学的最適化手法であると同時に、コンピュータプログラミング手法でもあります。複雑な問題を再帰的に分割することで、問題を単純化することを指します。一部の意思決定問題はこの方法では分解できませんが、複数の時点にまたがる意思決定は、多くの場合再帰的に分割されます。同様に、コンピュータサイエンスでは、問題を部分問題に分割し、それらの部分問題の最適解を再帰的に見つけることで最適に解決できる場合、その問題は最適な部分構造を持っていると言われます。
有限領域における制約を表現する構文はホスト言語によって異なります。以下は、制約論理プログラミングにおける古典的なアルファベットパズル「SEND+MORE=MONEY」 を解くPrologプログラムです。
% このコードは、環境提供の
CLPFD 制約ソルバーライブラリを使用することで、YAP と SWI-Prolog の両方で動作します。他の Prolog 環境や他の制約ソルバーを使用するには、若干の修正が必要になる場合があります
。
:- use_module ( library ( clpfd )).
sendmore ( Digits ) :-
Digits = [ S , E , N , D , M , O , R , Y ], % 変数
Digits ins 0..9を作成、 % 変数にドメインを関連付けます
S #\= 0 、 % 制約: S は0 と異なる必要があります
M #\= 0 、
all_different ( Digits )、 %すべての要素は異なる値を取る必要があり
ます1000 * S + 100 * E + 10 * N + D %その他 の 制約 + 1000 *
M + 1000 * O + 100 * N + 10 * E + Y 、label ( Digits ) 。%検索を開始します
インタープリタはパズルの各文字に対して変数を作成します。演算子はinsこれらの変数のドメインを指定するために使用され、変数は{0,1,2,3, ..., 9}の値の集合に収まるようにします。制約S#\=0と は、M#\=0これら2つの変数が0を取らないことを意味します。インタープリタがこれらの制約を評価する際、2つの変数のドメインから0を削除することで、ドメインを縮小します。次に、制約がall_different(Digits)検討されます。制約はドメインを縮小しないため、そのまま保存されます。最後の制約は、文字に割り当てられる数字は、各文字を対応する数字に置き換えたときに「SEND+MORE=MONEY」が成立するように指定されます。この制約から、ソルバーはM=1と推論します。変数Mを含む保存済みのすべての制約が有効化されます。この場合、制約の制約伝播all_differentにより、残りのすべての変数のドメインから値1が削除されます。制約伝播は、すべての定義域を単一の値に縮約することで問題を解決する場合もあれば、定義域を空集合に縮約することで問題に解が存在しないことを証明する場合もありますが、充足可能性や充足不可能性を証明することなく終了する場合もあります。ラベルリテラルは、実際に解の探索を行うために使用されます。