私はいくつかの理論的/実用的な問題を抱えており、管理方法については今のところ手がかりがありません。
SATソルバー モデルが存在する場合はモデルを見つけ、そうでない場合は矛盾を証明できる [〜#〜] cnf [〜#〜] を作成します。遺伝的アルゴリズムを使用したCの問題。
SAT問題は基本的にこの種の問題のように見えます: 私の目標は、このソルバーを使用して、さまざまな問題の解決策を見つけることです NP完全 問題。基本的に、私はさまざまな問題をSATに変換し、ソルバーでSATを解いてから、その解を元の問題に受け入れられる解に変換します。
私はすでにN * N数独問題とNクイーン問題で成功していますが、ここに私の新しい目標があります:クラススケジューリング問題をSATに減らすことですが、簡単に変換するためにクラススケジューリング問題を形式化する方法がわかりませんあとSATで。
目標は、明らかに、数か月以内に、次のようなスケジュールの画像を生成することです。
私はこれを見つけました source-code クラスのスケジュールを解決することができますが、残念ながらSATを減らすことはできません:/
また、一般的な計画に関する記事もいくつか見つかりました( http://www.cs.rochester.edu/users/faculty/kautz/papers/kautz-satplan06.pdf など)。
しかし、この記事で使用されている 計画ドメイン定義言語 は、クラススケジューリングの問題を表すには、非常に一般的すぎるようです。 :/
誰かがクラススケジューリングを効率的に形式化してSATに減らし、その後、SATソリューション(存在する場合は^^)をクラススケジュールに変換する方法について考えていますか?
私は基本的にどんな提案にもオープンです、私は今のところどのように表現するか、問題を減らす方法、SATソリューションをスケジュールに変換する方法についてはわかりません...
フォローアップの質問: ブール充足可能性へのクラススケジューリング[多項式時間短縮]パート2
最初に問題を形式化してから、SATに減らしてみます。
クラススケジューリング問題を次のように定義します:
_Input = { S1,S2,....,Sn | Si = {(x_i1, y_i1), (x_i2, y_i2) , ... , (x_ik, y_ik) | 0 <= x_ij < y_ij <= M } }
_
非公式:入力はクラスのセットであり、各クラスは(x、y)の形式の(オープン)間隔のセットです。
(Mは「週末」を表す定数です)
出力:いくつかのセットが存在する場合にのみ真。
_R = { (x_1j1, y_1j1) , ..., (x_njn, y_njn) | for each a,b: (x_aja,y_aja) INTERSECTION (x_bjb,y_bjb) = {} }
_
非公式:間隔の各ペア間の共通部分が空になるような間隔の割り当てがある場合にのみtrue。
SATへの削減:
間隔ごとにブール変数を定義します。_V_ij
_
それに基づいて、次の式を定義します。
_F1 = (V_11 OR V_12 OR ... OR V_1(k_1)) AND .... AND (V_n1 OR V_n2 OR ... OR V_n(k_n))
_
非公式には、各クラスの間隔の少なくとも1つが「満たされている」場合にのみ、F1が満たされます。
_if x <= y
_の場合に限り、Smaller(x,y) = true
を定義します1
間隔が重ならないようにするために使用します。
(x1、y1)と(x2、y2)が重ならないようにする場合は、次のものが必要です。
_x1 <= y1 <= x2 <= y2 OR x2 <= y2 <= x1 <= y1
_
入力は_x1<=y1, x2<=y2
_を保証するため、次のようになります。
_y1<= x2 OR y2 <= x1
_
そして、Smallerおよびboolean句を使用します。
_Smaller(y1,x2) OR Smaller(y2,x1)
_
それでは、それを処理するための新しい句を定義しましょう。
クラスa、bの各ペアとそれらの区間c、d(c in a、d in b)
_G_{c,d} = (Not(V_ac) OR Not(V_bd) OR Smaller(y_ac,x_bd) OR Smaller(y_bd,x_ac))
_
非公式には、区間bまたはdのいずれかが使用されていない場合、句は満たされ、完了です。それ以外の場合は、両方が使用され、2つの間隔の間に重複がないことを確認する必要があります。
これにより、c、dの両方が「選択」された場合、それらが重複しないことが保証されます。これは、間隔の各ペアに当てはまります。
ここで、最終的な式を作成します。
_F = F1 AND {G_{c,d} | for each c,d}
_
この式により、次のことが保証されます。
小さな注意:この式では、各クラスから複数の間隔を選択できますが、t> 1間隔の解がある場合は、解の正確さを変更せずに、それらのt-1を簡単に削除できます。
最後に、選択された間隔は、定義したブール変数V_ijです。
例:
_Alebgra = {(1,3),(3,5),(4,6)} Calculus = {(1,4),(2,5)}
_
Fを定義する:
_F1 = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2)
_
Gを定義する:
_G{A1,C1} = Not(V1,1) OR Not(V2,1) OR 4 <= 1 OR 3 <= 1 //clause for A(1,3) C(1,4)
= Not(V1,1) OR Not(V2,1) OR false =
= Not(V1,1) OR Not(V2,1)
G{A1,C2} = Not(V1,1) OR Not(V2,2) OR 3 <= 2 OR 5 <= 1 // clause for A(1,3) C(2,5)
= Not(V1,1) OR Not(V2,2) OR false =
= Not(V1,1) OR Not(V2,2)
G{A2,C1} = Not(V1,2) OR Not(V2,1) OR 5 <= 1 OR 4 <= 3 //clause for A(3,5) C(1,4)
= Not(V1,2) OR Not(V2,1) OR false =
= Not(V1,2) OR Not(V2,1)
G{A2,C2} = Not(V1,2) OR Not(V2,2) OR 5 <= 2 OR 5 <= 3 // clause for A(3,5) C(2,5)
= Not(V1,2) OR Not(V2,2) OR false =
= Not(V1,2) OR Not(V2,2)
G{A3,C1} = Not(V1,3) OR Not(V2,1) OR 4 <= 4 OR 6 <= 1 //clause for A(4,6) C(1,4)
= Not(V1,3) OR Not(V2,1) OR true=
= true
G{A3,C2} = Not(V1,3) OR Not(V2,2) OR 6 <= 2 OR 5 <= 4 // clause for A(4,6) C(2,5)
= Not(V1,3) OR Not(V2,2) OR false =
= Not(V1,3) OR Not(V2,2)
_
これで、最終的な式を示すことができます。
_ F = (V1,1 OR V1,2 OR V1,3) AND (V2,1 OR V2,2)
AND Not(V1,1) OR Not(V2,1) AND Not(V1,1) OR Not(V2,2)
AND Not(V1,2) OR Not(V2,1) AND Not(V1,2) OR Not(V2,2)
AND true AND Not(V1,3) OR Not(V2,2)
_
上記が満たされるのは、次の場合のみです。
_V1,1 = false
V1,2 = false
V1,3 = true
V2,1 = true
V2,2 = false
_
そしてそれはスケジュールを表しています:Algebra =(4,6);必要に応じて、微積分=(1,4)。
(1)式の定数として非常に簡単に計算できます。そのような定数には多項式の数があります。