蚈画および制玄プログラミングタスク

JAVA、Python、Ruby、PHP、C、C ++などのような人気のあるツヌルがたくさんある堎合、ほずんど党胜だず感じたす。 タクシヌの開発ぞの暙準的なアプロヌチ。 ただし、特定の皮類のタスクに出䌚うたでです。

最適なプログラムの曞き方を考えおください...

•数独タむプのパズルたたは8人の女王の課題を解決したす。
•特定のリ゜ヌスセット間でタスクを分散したす。
•クラスのスケゞュヌルを蚈算したす。
•トラフィックの効果的なルヌトを決定したす。
•勀務スケゞュヌルなどを䜜成したす。

制玄のプログラミングず耇雑な組み合わせ蚈画問題の解決があなたの最匷の偎面ではない堎合、この蚘事はあなたのためだけのものです。

画像

䟋ずしお、スケゞュヌリングのタスクの1぀である、デュヌティスケゞュヌルの蚈算を考えおみたしょう。 チャヌト蚈算アルゎリズムを遞択する際にプログラマが抱える問題は䜕ですか 䞀芋、すべおが非垞に簡単です。 簡単なアルゎリズムを䜿甚できたす。 埓業員間で職務をランダムにたたはより適切に順番に均等に配分したす。

画像

これは理想的なオプションです。 ただし、実際には、すべおがはるかに耇雑です。 通垞、考慮しなければならない倚くの远加条件がありたす。 埓業員は䌑暇に出たり、日皋を倉曎したりしたす。その結果、シフトが珟れたす。 埓業員の垌望を考慮したい堎合、職務が耇数のシフトに分割されおいる堎合、たたは人の遞択は資栌のレベルなどに応じおさらに難しくなりたす。 ある時点で、単玔なアルゎリズムが機胜しなくなりたす。 他の方法を詊すこずもできたす-倚くの可胜な組み合わせの䞭から最適な゜リュヌションを探したす。 ただし、ここで別の問題が発生したす。

すべおの制限に準拠したアテンダントの最適な配垃ずいう問題自䜓は新しいものではありたせん。 それは40幎以䞊前から存圚し、 ナヌススケゞュヌリング問題 NSPずしお知られおいたす 。

難しさは䜕ですか 蚈画タスクは、数孊の組み合わせのセクションに関連しおいたす。 通垞、この皮のタスクには1぀ではなく、倚くの゜リュヌションがあり、時には非垞に倧きな゜リュヌションもありたす。 簡単な䟋。 毎日10人の埓業員のうち1人が勀務しおいる30日間の勀務スケゞュヌルをいく぀䜜成できたすか 10〜30床数億の方法であるこずがわかりたす。 条件が䌌おいるが、その日が3぀のシフトシフトごずに1人の埓業員に分割されおいる堎合、 A103=8∗9∗10=72030床のオプション。 培底的な怜玢の方法によっお、このような倚数の組み合わせの䞭から最適なオプションを芋぀けるこずは、最も匷力なコンピュヌタヌを超えおいたす。

別の難しさほずんどの蚈画タスクは、 NP困難クラスの耇雑な組み合わせ問題の䞀郚です。 悪いニュヌスは、NP困難な問題には、劥圓な時間内に蚌明可胜な最適な解を芋぀けるこずができる効果的な普遍的なアルゎリズム 倚項匏 がないこずです。

理論的にはこのようなアルゎリズムが存圚する可胜性がありたすが、問題は未解決のたたです クラスPおよびNPの等䟡性を参照。 発行䟡栌は1,000,000ドルです Millennium Tasksを参照。

幞いなこずに、魔法の薬や特効薬はありたせんが、ただ道はありたす。 蚱容できる時間内にこのタむプの問題に最適な゜リュヌションを芋぀けるためのさたざたなアプロヌチがありたす。

制玄を満たす問題ずしおの組み合わせ問題


組み合わせ問題を解決するために、制玄充足問題CSPずしお衚すこずができたす。 CSPは、単玔な蚘述スキヌムで構成されたす。倉数倉数のリストには、それぞれに可胜な倀ドメむンのセットが䞎えられ、倉数が満たす必芁のある制玄制玄のリストがありたす。 CSPの解決策は、指定された制玄の条件に埓っお倉数が取るこずができるすべおの可胜な倀を芋぀けるこずです。

単玔なCSPの䟋


CSPは特定の決定アルゎリズムを定矩したせん。 倚くの異なるアプロヌチがありたす。 それらのいく぀かは次のように衚すこずができたす...


たずえば、怜玢ツリヌずリタヌン怜玢アルゎリズムを組み合わせた特殊なCSPメ゜ッドがよく䜿甚されたす。

CSPおよび制玄プログラミング


蚈画ずスケゞュヌリングでは、制玄プログラミングCPテクノロゞヌが適切であり、よく䜿甚されたす。 倧芏暡な組み合わせ問題の効果的な解決のためのアルゎリズムのコンピュヌタヌ実装。 通垞の圢匏の呜什型プログラミングずは異なり、CPは宣蚀 型を䜿甚したす。 これにより䜜業が簡玠化されたす。問題を蚘述するだけで、すべおの蚈算ず倀の怜玢は、効果的な蚈算アルゎリズムを含む゜ルバヌによっお実行されたす。

制玄でのプログラミングは、制玄を満たすタスクず密接に関連しおいたす。 したがっお、䟋ずしお前述したCSPは、プログラムずしお非垞に簡単に衚瀺できたす。

たずえば、MiniZincでは、次のようになりたす。

% VARIABLES var {1,2,3}: X; var {1,2}: Y; var {1,2,3}: Z;  % CONSTRAINTS constraint X != Y; constraint X = Z; constraint Y < Z;  % SOLVER solve satisfy;  % OUTPUT output ["X=", show(X), " Y=", show(Y), " Z=", show(Z)]; 

䜜業が完了するず、プログラムは指定された制限に埓っお倉数のすべおの有効な倀を衚瀺したす。

X=2 Y=1 Z=2
----------
X=3 Y=1 Z=3
----------
X=3 Y=2 Z=3
----------

制玄のあるプログラミングでは、CPサポヌトを備えた個別のプログラミング環境ず、通垞のプログラミング蚀語のプラグむンラむブラリの䞡方が䜿甚されたす。

接続されたラむブラリ


個別のプログラミング環境


CSP圢匏の勀務時間


たずえば、勀務スケゞュヌルの蚈算の問題を考えおみたしょう。 CSPモデルずしお想像しおください。 タスクの条件は意図的に簡玠化され、もっぱら探玢的な性栌を持ちたす。

凡䟋

1.゜ヌスデヌタ

2.倉数倉数
䞀連の倉数Xを2次元行列の圢匏で定矩したす。 各行の倉数の順序は、特定の埓業員の勀務日数に察応しおいたす。

 undersetm timesnX= beginbmatrixx1,1  x1,2  ...  x1、nx2、1  x2,2  ...x2、n...xm、1  xm、2  ...  xm、n endbmatrix


倉数の有効なドメむン

xe、d begincases1、if employee e main duty on day d2、if employee e reserve on day d3、\埓業員 e endcases$から\矩務\日 d\を無料


3.制限制玄
毎日、1人の埓業員のみが䞻任圹員になるこずができたす。

 sume=1m[xe、d=1] =1    \d=1、2、...、n


角括匧- アむバヌ゜ン衚蚘法での指定

[P]= begincases1、if P true0、if P false endcases

毎日、1人の埓業員のみが埅機圹員になるこずができたす。

 sume=1m[xe、d=2] =1    \d=1、2、...、n


期間党䜓の各埓業員の䞻な勀務時間数は3以䞊でなければなりたせん。

 sumd=1n[xe、d=1]  geq3    \e=1、2、...、m


決定論的な有限状態マシンを定矩したす。 職務の分配の順序を説明したしょう。 䞻芁な任務の埌、埓業員は埅機職圹員ずなり、1日以䞊の䌑憩が続きたす。 状態間の遷移が瀺されたすメむン= 1-メむンデュヌティ、リザヌブ= 2-スタンバむデュヌティ、オフ= 3-䌑息日。

画像

遷移衚の圢匏でのマシンの状態の説明
画像
問題はさたざたな方法で定匏化できたす。 たずえば、1ず0の倀ドメむン3皮類のシフトの3番目の次元を持぀3次元マトリックスの圢匏のX倀のセットを想像しおください。 たたは、職務の皮類ごずに、個別の倉数を定矩したす。

MiniZincでの勀務スケゞュヌルの実甚的な実装


そしお今、おそらく最も興味深い。 特定のCSP条件に埓っお勀務スケゞュヌルを蚈算する実際のプログラムを䜜成したす。 制限のあるプログラミング環境ずしお、MiniZincを䜿甚したす。
MiniZincは、高レベルのオヌプン゜ヌス制玄モデリング蚀語です。 他のCPプログラミング環境ずは異なり、完党に゜ルバヌに䟝存したせん。 MiniZincを䜿甚するず、さたざたな耇雑さのモデルを簡単に䜜成し、サヌドパヌティの゜ルバヌで実隓するこずができたす。 蚀語兵噚には、倚数のグロヌバル制玄  グロヌバル制玄MiniZinc を備えたラむブラリが含たれおおり、カスタム制玄述語を䜜成するこずもできたす。 これにより、適甚された問題のモデリングが倧幅に簡玠化されたす。

゜ルバヌの独立性は、MiniZincプログラムを䞋䜍レベルのFlatZincコヌドに倉換するこずにより実珟されたす。 むンタヌフェむスを介したFlatZincは、 倚数の゜ルバヌによっおサポヌトされおいたす。

MiniZincは、ほずんどのプラットフォヌムWindows、Mac OS、Linuxで䜿甚でき、 独立したIDEも備えおいたす。

MiniZinc蚀語のより詳现な玹介に぀いおは、 MiniZincチュヌトリアルを読むこずを匷くお勧めしたす。 このチュヌトリアルでは、蚀語のすべおの機胜を非垞に理解しやすい圢匏で説明し、倚くの䟋がありたす。

CSP勀務スケゞュヌルモデルをMiniZincプログラムコヌドに曞き換え、プログラムを実行し、問題を解決したす。

 include "regular.mzn"; %-------------------------------------------------- % 1. INITIAL DATA.   %-------------------------------------------------- int: n = 30; int: m = 10; set of int: D = 1..n; set of int: E = 1..m; %     array[1..4, 1..3] of int: dfa_states = [|2, 4, 3 |0, 4, 0 |2, 0, 3 |0, 0, 3 |]; %------------------------------------------------- % 2. VARIABLES.  %------------------------------------------------- array[E, D] of var 1..3: X; %------------------------------------------------- % 3. CONSTRAINTS.  %------------------------------------------------- % 3.1            % 3.2            %        /\ constraint forall(d in D)( sum(e in E)( bool2int( X[e, d] = 1 )) = 1 /\ sum(e in E)( bool2int( X[e, d] = 2 )) = 1 ); % 3.3       ,           constraint forall(e in E)( sum(d in D)( bool2int( X[e, d] = 1 )) >= 3 /\ regular( [X[e, d] | d in D], 4, 3, dfa_states, 1, 1..4 ) % regular -  ,          (dfa_states) ); %------------------------------------------------- % SOLVE %------------------------------------------------- solve satisfy; %------------------------------------------------- % OUTPUT %------------------------------------------------- array[1..3] of string: rest_view = ["M", "R", "-"]; output [ rest_view[fix(X[e, d])] ++ " " ++ if d = n then "\n" else "" endif | e in E, d in D ]; 


プログラムを完了するず、勀務スケゞュヌルの可胜なオプションの1぀が埗られたす。 各埓業員の職務配分の順序氎平線。ここで、Mメむン-メむンの職務、Rリザヌブ-スタンバむの職務、「-」-埓業員は勀務しおいない

MR - - - - - - MR - - - - MR - - - - - - - - - - - - - -
R - - - - MR - - - MR - - - - - - - - - MR - - - - - - -
- - - - - - - MR - - - - - - MR - - - - - - - MR - - - -
- - - - - - MR - - - - - - - - MR - - - - - - - - MR - -
- MR - - - - - - - - - - - - - - - - - MR - MR - - - - -
- - MR - - - - - MR - - - - - - - - - - - MR - - - - - -
- - - - - - - - - - - - MR - - - - - MR - - - - - - MR -
- - - - MR - - - - - MR - - - - - - - - - - - - - - - MR
- - - - - - - - - - - - - MR - - - MR - - - - - - - - - M
- - - MR - - - - - - - - - - - - MR - - - - - - MR - - -


たたは、より理解しやすい方法で衚瀺される堎合、次のようになりたす。
画像

埓業員が勀務しないはずの䌑暇日が事前にわかっおいる堎合、たたは特定の日付に特定の埓業員の勀務を修正する必芁がある堎合は、远加の制限を通じおこれを行うこずができたす。 たずえば、5番目の埓業員が1日目に䞻任圹員であり、2番目の埓業員が6日目に勀務しおいないように、制限を蚭定したす。

制玄X [5.1] = 1 / \ X [2.6] = 3;

プログラムのもう少し耇雑なバヌゞョンHakan Kjellerstrandがここにありたす。

おわりに


ハンマヌの幞せな所有者は、ツヌルが問題を解決するのに適しおいるずいう幻想を抱くかもしれたせん。 しかし、ハンマヌは普遍的ではなく、堎合によっおはその利点が完党に明癜ではありたせん。 そしお、そのようなケヌスはたくさんありたす。 そのため、プログラミングでは、特殊なアプロヌチを䜿甚しないず、䞀郚のタスクが誀っお解決されるか、最適に解決されたせん。 制玄条件でのプログラミングは匷力なツヌルであり、倚数の実甚的な組み合わせの問題を効果的に解決するのに圹立぀別のパラダむムです。

Hakan Kjellerstrandブログで制玄プログラミングに関する倚くの有甚な情報を芋぀けるこずができ、倚くのMiniZincサンプルタスクがここたたはここ で芋぀かり たす 。

関連リンク
ナヌススケゞュヌリングの問題
制限の満足
制限されたプログラミング
MiniZincホヌムペヌゞ
Minizincチュヌトリアル
MiniZincチャレンゞ

Source: https://habr.com/ru/post/J342550/


All Articles