2022年2月4日金曜日

コンパイルエラーの改善

 一部、英語だったりして、分かりにくいエラーメッセージを日本語に改善しました。

コンパイルとは、内部で、求解エンジンが問題を解くための形式に問題(problem.json)を変換する過程を指します。その際中に、不適切が判明すれば、その時点で、エラーを出力して終了となります。これをコンパイルエラーと呼んでいます。

コンパイルエラーは、下のように、「制約をコンパイル中」の直後に赤字で出ます。


この例で、●深夜. をダブルクリックすると、当該箇所に飛んでいきます。


3月1日の予定を見てみると 確かに3人深夜が入力されています。(制約上は二人)


今度は、別な例で、最小8人制約のところ、既に埋まっていて、7人分のフリースペース
しかありません。(下図青部)このまま求解エンジンに渡しても解がないことは明らかなので、
コンパイル時にエラーを出力して終了としている例です。

行制約も同様です。

行制約の場合は、パターンエラーも機能します。
Scheduled.スタッフ名 をダブルクリックすると予定入力に飛びます。

<コンパイルエラーとはならない場合>
次の例は、コンパイルエラーとはならずに、RunTimeエラーとなります。RunTimeエラーとは、問題が求解エンジンに渡った後のエラーを指します。問題が渡った後ですから、コンパイルは終了しています。コンパイルが終わったかどうかは、Algorithm1..が出ていれば、コンパイルは終わり、求解エンジンに動作が移ったことが分かります。

さて、この例の場合、夜勤集合(深夜または、準夜勤)が予定で5個入っています。この例の場合、深夜2個、準夜勤2個が仕様なので、5個の夜勤はありえません。しかし、コンパイルでは、簡単なチェックしか行っていないのでコンパイルは通ってしまいます。


しかし、当然のことながら、解はないのでエラー解析に移り、エラーの主因を探し、
エラーの原因を特定し、表示します。同様に、●部をダブルクリックすると制約箇所に点で行きます。

要するに、シフト集合を使っているとコンパイルエラーとはなりません。

また、行制約も同様ですが、行制約の場合のパターンチェック(レマーク 反転属性記号)を使っていると、コンパイルエラーとはならず、下のようにRunTimeエラーとなります。



注意する点は、以上のエラーは、あくまでハード制約についてのみに適用されるということです。矛盾が存在するのは、必ずハード制約内にあります。

ちなみに、ソフト制約の真髄はそれをエラーとは扱わず、代わりにコストを課す、というものでハード制約とは性格が全く異なります。

以上の改善は、2月21日リリース予定版から適用になります。



0 件のコメント:

コメントを投稿