2025年1月1日水曜日

Q.全く動かないのですが。

 Ans.

ナーススケジューリング問題は、精緻な制約の積み重ねで成り立っています。新しくプロジェクトを始める場合は、ステップバイステップ、一つ制約を書いて確認、一つ制約を書いて確認...をしながら構築していきましょう。大事なことなので、もう一度書きます。一つ制約を書いて確認、一つ制約を書いて確認.



次は、頂いたプロジェクトの状態です。赤のメッセージがあるので、「解がない」状態であることが分かります。


次のようなハード制約矛盾の要因がヒントとして表示されます。(スタッフ名は削除していますが、実際には、表示されています。)

●次の組み合わせが充足していません。

● 列制約全体.長日勤は4人 2024-12-29

● 列制約全体.入りは4人 2024-12-14

● 列制約全体.入りは4人 2024-12-21

● 列制約全体.明けは4人 2024-12-15

● 列制約全体.明けは4人 2024-12-22

● 列制約全体.平日日勤者5名以上 2024-12-11

● 列制約全体.平日日勤者5名以上 2024-12-12

● 列制約全体.平日日勤者5名以上 2024-12-17

● 列制約全体.休日日勤者3名以上 2024-12-28

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.休日・夏季・正月休暇回数 

● 平準化絶対的制約.入り回数 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

● 行制約同数カウントグループ2.長日勤=入り 

これを見ると、特定の日(例えば1月3日)、特定のスタッフでエラーが出ているのではなく、広く分布していることが分かります。

このような状態になった場合、最初に行うことは、予定の影響を取り除く(ブランクにする)ことです。
しかし、今回予定は既にブランクです。それが意味するのは、制約設計そのものに問題があるということです。(菅原システムズが提供するプロジェクトファイルでは、予定なしではエラー0に設計を基準としています。今回、お客さまご自身の設計です。)

次に行うことは、制約グループのチェックをオフにしてみます。

具体的には、列制約グループのチェックをオフにして求解してみます。


すると、解が直ぐに出ました。
列制約内にハード制約が矛盾要因となっていることが分かりました。
次に、列制約内に何の制約をオンにすると問題が生じるかということを見ます。
具体的には、再度列制約グループのチェックをオンにし夜勤を全てオフにしてみます。
解はありました。
今度は、夜勤をオンにし、日勤をオフにしてみます。
次のようなエラーとなりました。
●次の組み合わせが充足していません。
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 
● 平準化絶対的制約.入り回数 

部分をダブルクリックして当該制約に飛びます。ハード制約になっていることが分かります。

以上の現象を、整理してみると、

■列制約夜勤関係
■スタッフの入り回数=行制約

のハード制約間に矛盾が生じていそうだ、ということが分かります。

解がないのは、ハード制約間の矛盾なので、どちらかあるいは両方をソフト制約にすれば、解があるはずです。


今、入り回数をソフト制約レベル1にソフト制約化してみます。

新しくレベル1を設定したので、行制約レベル1にチェックを入れ求解します。
解は、ありました。
入り回数部に確かにエラーはあり、全てチームAで発生しています。


入り回数は、スタッフプロパティシートで設定しています。




解のソフトエラー部(黄色)は、最小夜勤回数を満たしていません。エラーは、全て設定夜勤回数を下回っています。設定夜勤回数を下回っているということは、人余り方向のエラーであるということです。今回Aチームのみ発生しているので、原因は、

■夜勤回数設定に対してAチーム人余り方向のハード制約違反が生じたため

と結論づけられます。このエラーを解消するには、

■スタッフプロパティシート設定回数の見直し
■夜勤入り回数のソフト制約化
■所属チーム変更(A・Bチーム間で偏りがある)

等、が考えられます。

制約を一からステップバイステップで確認しながら作る、

という原則を守って設計を進めていけば、上のような面倒な事態になることはありません。
また、コマ数計算を行っておくこともお勧めです。夜勤回数の適切な範囲が自ずと分かるでしょう。急がば廻れです。

0 件のコメント:

コメントを投稿