エラーとは?




解(答え)がない、あるいは、制限時間内に見つからないことを言います。解がないとは、全ての制約を満たす解(シフトの組み合わせ)がないことを言います。

エラーの原因にも種類があり、主に次の3種類に分類されます。



対処方法を述べる前に、少し概念的な話にお付き合いください。

制約自体に矛盾がある

1番目の 制約自体に矛盾があるとは、最初のプロジェクトファイル作成の際、よく見られます。知らず知らずのうちに、筆者も仕込んでしまうことが多々あります。
簡単な例で、次の制約を考えましょう。

各々の制約自体は、極々普通の記述です。しかし、全体としてみると、男性3人、女性3人ですから、決して6人未満になることはありません。その一方で、全体に5人以下を規定していますから、制約全部を満たす解はないのです。今までのスケジューラは、このような簡単な例でさえ、問題がこの部分にあるということを指摘できませんでしたが、スケジュールナースでは、指摘が可能になっています。 しかし、どの制約が、入力ミスなのかということは、コンピュータは勿論、書いた人以外は、分からないのではないでしょうか? 

制約を満たす解が物理的に存在しない

 多くの複雑な制約が絡まる場合でも、スケジュールナースが、それほど、時間がかからず(タイムアウトという文言が求解状況にない場合)、解がないと言う場合があります。実は、この場合も、上と同じようなことが起きています。個々の制約としては、満たせるこれども、全体としてみると、矛盾が生じていると分かる場合がそうです。つまり、物理的な解が存在しないということですから、この場合は、どこかの制約を緩める(ソフト制約化)しか手はありません。 


制約を見たす解が制限時間内に見つからない

 稼働中の職場でも、スタッフの緒言は常に変化するものです。その月々で、解が見つかったり、見つからなかったりすることはありえます。問題の規模や制約数が多くなってくると、物理的にはいるのか、入らないのかという証明段階まで行かずに、探索で終ってしまうことは、ありえます。その場合は、求解状況のところにタイムアウトが出ています。 これについては、下に述べてます。



スケジューリングは、制約の積み重ね



スケジューリングは、制約という積み木の積み重ねです。最後まで倒れずに積み重ねができたときだけ、解があります。
積み重ねは、AND を意味します。積み木を追加して行くことは、制約のANDを積み重ねていくことです。



解集合=制約1 AND 制約2 AND 制約3 ....



3つのANDなら上図の青部分になります。



4つのANDなら上図のようになります。(5つ以上は、ベン図で書くのも困難になってきます。)


もしも、交わる点がないとすると、、その時点で解はありません。
ほんの僅かでもよいので、交わる部分がなけれならない、ということです。

制約という積み木をどんどん積み上げて行くと、一つ一つの制約は難しくなくても、すべての制約を満たさないといけないので次第に難しくなっていきます。
途中で崩れてしまう(矛盾があると)と、解がありません。ですから注意深く矛盾が起きないように積み重ねて行かなければなりません。ここにスケジューリング問題の難しさがあります。特に制約の多い代表格が、看護師勤務表(ナーススケジューリング問題)です。


崩れた原因が、最後の積み木にあるのか、それとも、途中の積み木にあるのか、崩れ去った後では、よく分かりません。間接の原因の一つは、最後の積み木にあることは間違いありませんが、途中で不安定な積み木があったとすれば、そちらが主因の可能性も否定できません。

エラーの原因追及の難しさ



同じことが、制約についても言えます。最後に追加した制約が間接の原因ではありますが、それ以前にも原因がある可能性もあります。最後の積み木がなんであったかを調べる手段をスケジュールナースは備えていますが、それは最後の積み木に過ぎず、それが主たる原因とまでは言い切れないのです。また、不安定な積み木が一つだけとは限りません。多くの場合、解がない原因は、複数の制約の相互作用による結果で、一つの原因に絞りこむことができない場合もあります。
実際、制約を満たさない原因の追究は、困難を伴うことが多いのです。


では、どのようにして調べればよいでしょうか?


Version 111より全自動になりました。 







以下は、旧項です。(マニュアルで切り分けを行う。)












予定入力を切り離す

制約の中で、毎月変わる部分は、予定入力です。それ以外の部分は、恒常的な部分でしょう。つまり、前月は「解があった」のに、今月は、「解がない」 とすれば、この予定入力の可能性が大きい訳です。




予定入力の切り離しの仕方

入力全体をソフト制約化します。



最下部右端までドラッグすると次の画面になります。ここでマウスを放して右クリックを行います。



メニューが出てくるので選択部をソフト制約化をクリックします。


すると、適用可能なレベルが出てきます。(出てこないレベルは既に使われているレベルです。)ここでは5を選択します。


上の予定入力は、ソフトウェアレベルが5に設定されています。
求解のページで、チェックしなければ、あたかも、上の予定入力がなかったかのように、求解されます。
このようにして、予定入力を切り離すことができます。





予定入力の切り離しでエラーが消えた場合

予定入力のソフトエラー化で問題を解析することになります。実際例としては、こちらをご参照ください。


全てのソフト制約を切り離す
依然として、エラーが出る場合、問題は、予定入力以外にあります。 
上図のように、のソフト制約に関する全てのチェックボックスをオフにして求解します。


怪しい制約をソフトエラー化する
依然として、エラーが出る場合は、出てくるエラーメッセージを見ます。